5 #include "parser_proc.h"
7 void *PSI_ParserProcAlloc(void*(unsigned long));
8 void PSI_ParserProcFree(void*, void(*)(void*));
9 void PSI_ParserProc(void *, token_t, PSI_Token *, PSI_Parser *);
10 void PSI_ParserProcTrace(FILE *, const char*);
12 PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename, psi_error_cb error, unsigned flags)
17 P = malloc(sizeof(*P));
19 memset(P, 0, sizeof(*P));
21 fp = fopen(filename, "r");
29 P = malloc(sizeof(*P));
31 memset(P, 0, sizeof(*P));
34 P->fn = strdup(filename);
39 P->proc = PSI_ParserProcAlloc(malloc);
40 if (flags & PSI_PARSER_DEBUG) {
41 PSI_ParserProcTrace(stderr, "PSI> ");
49 void PSI_ParserSyntaxError(PSI_Parser *P, const char *fn, size_t ln, const char *msg, ...) {
50 char buf[0x1000] = {0};
54 vsnprintf(buf, 0x1000-1, msg, argv);
57 P->error(PSI_WARNING, "PSI syntax error on line %zu in '%s'%s%s",
58 ln, fn, msg ? ": ": "", buf);
63 size_t PSI_ParserFill(PSI_Parser *P, size_t n)
65 if (P->flags & PSI_PARSER_DEBUG) {
66 fprintf(stderr, "PSI> Fill: n=%zu\n", n);
69 P->cur = P->tok = P->lim = P->mrk = P->buf;
74 size_t consumed = P->tok - P->buf;
75 size_t reserved = P->lim - P->tok;
76 size_t available = BSIZE - reserved;
80 memmove(P->buf, P->tok, reserved);
87 didread = fread(P->lim, 1, available, P->fp);
89 if (didread < available) {
93 if (P->flags & PSI_PARSER_DEBUG) {
94 fprintf(stderr, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
95 consumed, reserved, available, didread);
98 if (P->flags & PSI_PARSER_DEBUG) {
99 fprintf(stderr, "PSI> Fill: avail=%zu\n", P->lim - P->cur);
101 return P->lim - P->cur;
104 void PSI_ParserParse(PSI_Parser *P, PSI_Token *T)
107 PSI_ParserProc(P->proc, T->type, T, P);
109 PSI_ParserProc(P->proc, 0, NULL, P);
113 void PSI_ParserDtor(PSI_Parser *P)
115 PSI_ParserProcFree(P->proc, free);
121 PSI_DataDtor((PSI_Data *) P);
123 memset(P, 0, sizeof(*P));
126 void PSI_ParserFree(PSI_Parser **P)
138 #if BSIZE < YYMAXFILL
139 # error BSIZE must be greater than YYMAXFILL
142 #define RETURN(t) do { \
149 DECIMALS = (+|-)? DIGIT* "."
150 digits ::= digits DIGIT.
151 decimals ::= digits DOT digits.
152 decimals ::= DOT digits.
153 decimals ::= digits DOT.
155 number ::= PLUS digits.
156 number ::= MINUS digits.
158 number ::= MINUS decimals.
159 number ::= PLUS decimals.
162 token_t PSI_ParserScan(PSI_Parser *P)
168 re2c:define:YYCTYPE = "unsigned char";
169 re2c:define:YYCURSOR = P->cur;
170 re2c:define:YYLIMIT = P->lim;
171 re2c:define:YYMARKER = P->mrk;
172 re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(-1); }";
173 re2c:yyfill:parameter = 0;
178 NSNAME = (NAME)? ("\\" NAME)+;
179 QUOTED_STRING = "\"" ([^\"])+ "\"";
202 FUNCTION = 'function';
213 FLOATVAL = 'floatval';
216 TO_ARRAY = 'to_array';
217 TO_STRING = 'to_string';
219 TO_FLOAT = 'to_float';
221 NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
223 "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
224 "(" {RETURN(PSI_T_LPAREN);}
225 ")" {RETURN(PSI_T_RPAREN);}
226 ";" {RETURN(PSI_T_EOS);}
227 "," {RETURN(PSI_T_COMMA);}
228 ":" {RETURN(PSI_T_COLON);}
229 "{" {RETURN(PSI_T_LBRACE);}
230 "}" {RETURN(PSI_T_RBRACE);}
231 "[" {RETURN(PSI_T_LBRACKET);}
232 "]" {RETURN(PSI_T_RBRACKET);}
233 "=" {RETURN(PSI_T_EQUALS);}
234 "$" {RETURN(PSI_T_DOLLAR);}
235 "*" {RETURN(PSI_T_POINTER);}
236 "&" {RETURN(PSI_T_REFERENCE);}
237 [\r\n] { ++P->line; continue; }
239 TRUE {RETURN(PSI_T_TRUE);}
240 FALSE {RETURN(PSI_T_FALSE);}
241 NULL {RETURN(PSI_T_NULL);}
242 MIXED {RETURN(PSI_T_MIXED);}
243 VOID {RETURN(PSI_T_VOID);}
244 BOOL {RETURN(PSI_T_BOOL);}
245 CHAR {RETURN(PSI_T_CHAR);}
246 SHORT {RETURN(PSI_T_SHORT);}
247 INT {RETURN(PSI_T_INT);}
248 LONG {RETURN(PSI_T_LONG);}
249 FLOAT {RETURN(PSI_T_FLOAT);}
250 DOUBLE {RETURN(PSI_T_DOUBLE);}
251 SINT8 {RETURN(PSI_T_SINT8);}
252 UINT8 {RETURN(PSI_T_UINT8);}
253 SINT16 {RETURN(PSI_T_SINT16);}
254 UINT16 {RETURN(PSI_T_UINT16);}
255 SINT32 {RETURN(PSI_T_SINT32);}
256 UINT32 {RETURN(PSI_T_UINT32);}
257 SINT64 {RETURN(PSI_T_SINT64);}
258 UINT64 {RETURN(PSI_T_UINT64);}
259 STRING {RETURN(PSI_T_STRING);}
260 ARRAY {RETURN(PSI_T_ARRAY);}
261 FUNCTION {RETURN(PSI_T_FUNCTION);}
262 TYPEDEF {RETURN(PSI_T_TYPEDEF);}
263 CONST {RETURN(PSI_T_CONST);}
264 LIB {RETURN(PSI_T_LIB);}
265 LET {RETURN(PSI_T_LET);}
266 SET {RETURN(PSI_T_SET);}
267 RETURN {RETURN(PSI_T_RETURN);}
268 FREE {RETURN(PSI_T_FREE);}
269 STRLEN {RETURN(PSI_T_STRLEN);}
270 STRVAL {RETURN(PSI_T_STRVAL);}
271 INTVAL {RETURN(PSI_T_INTVAL);}
272 FLOATVAL {RETURN(PSI_T_FLOATVAL);}
273 BOOLVAL {RETURN(PSI_T_BOOLVAL);}
274 CALLOC {RETURN(PSI_T_CALLOC);}
275 TO_ARRAY {RETURN(PSI_T_TO_ARRAY);}
276 TO_STRING {RETURN(PSI_T_TO_STRING);}
277 TO_INT {RETURN(PSI_T_TO_INT);}
278 TO_FLOAT {RETURN(PSI_T_TO_FLOAT);}
279 TO_BOOL {RETURN(PSI_T_TO_BOOL);}
280 NUMBER {RETURN(PSI_T_NUMBER);}
281 NAME {RETURN(PSI_T_NAME);}
282 NSNAME {RETURN(PSI_T_NSNAME);}
283 QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}