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, 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);
38 P->proc = PSI_ParserProcAlloc(malloc);
39 if (flags & PSI_PARSER_DEBUG) {
40 PSI_ParserProcTrace(stderr, "PSI> ");
48 void PSI_ParserSyntaxError(PSI_Parser *P, const char *fn, size_t ln, const char *msg, ...) {
49 fprintf(stderr, "WARNING: Syntax error on line %zu in '%s'%s", ln, fn, msg ? ": ": "\n");
54 vfprintf(stderr, msg, argv);
60 size_t PSI_ParserFill(PSI_Parser *P, size_t n)
62 if (P->flags & PSI_PARSER_DEBUG) {
63 fprintf(stderr, "PSI> Fill: n=%zu\n", n);
66 P->cur = P->tok = P->lim = P->mrk = P->buf;
71 size_t consumed = P->tok - P->buf;
72 size_t reserved = P->lim - P->tok;
73 size_t available = BSIZE - reserved;
77 memmove(P->buf, P->tok, reserved);
84 didread = fread(P->lim, 1, available, P->fp);
86 if (didread < available) {
90 if (P->flags & PSI_PARSER_DEBUG) {
91 fprintf(stderr, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
92 consumed, reserved, available, didread);
95 if (P->flags & PSI_PARSER_DEBUG) {
96 fprintf(stderr, "PSI> Fill: avail=%zu\n", P->lim - P->cur);
98 return P->lim - P->cur;
101 void PSI_ParserParse(PSI_Parser *P, PSI_Token *T)
104 PSI_ParserProc(P->proc, T->type, T, P);
106 PSI_ParserProc(P->proc, 0, NULL, P);
110 void PSI_ParserDtor(PSI_Parser *P)
112 PSI_ParserProcFree(P->proc, free);
118 PSI_DataDtor((PSI_Data *) P);
120 memset(P, 0, sizeof(*P));
123 void PSI_ParserFree(PSI_Parser **P)
135 #if BSIZE < YYMAXFILL
136 # error BSIZE must be greater than YYMAXFILL
139 #define RETURN(t) do { \
146 DECIMALS = (+|-)? DIGIT* "."
147 digits ::= digits DIGIT.
148 decimals ::= digits DOT digits.
149 decimals ::= DOT digits.
150 decimals ::= digits DOT.
152 number ::= PLUS digits.
153 number ::= MINUS digits.
155 number ::= MINUS decimals.
156 number ::= PLUS decimals.
159 token_t PSI_ParserScan(PSI_Parser *P)
165 re2c:define:YYCTYPE = "unsigned char";
166 re2c:define:YYCURSOR = P->cur;
167 re2c:define:YYLIMIT = P->lim;
168 re2c:define:YYMARKER = P->mrk;
169 re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(-1); }";
170 re2c:yyfill:parameter = 0;
175 NSNAME = (NAME)? ("\\" NAME)+;
176 QUOTED_STRING = "\"" ([^\"])+ "\"";
196 FUNCTION = 'function';
205 FLOATVAL = 'floatval';
207 TO_STRING = 'to_string';
209 TO_FLOAT = 'to_float';
211 NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
213 "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
214 "(" {RETURN(PSI_T_LPAREN);}
215 ")" {RETURN(PSI_T_RPAREN);}
216 ";" {RETURN(PSI_T_EOS);}
217 "," {RETURN(PSI_T_COMMA);}
218 ":" {RETURN(PSI_T_COLON);}
219 "{" {RETURN(PSI_T_LBRACE);}
220 "}" {RETURN(PSI_T_RBRACE);}
221 "=" {RETURN(PSI_T_EQUALS);}
222 "$" {RETURN(PSI_T_DOLLAR);}
223 "*" {RETURN(PSI_T_POINTER);}
224 "&" {RETURN(PSI_T_REFERENCE);}
225 [\r\n] { ++P->line; continue; }
227 TRUE {RETURN(PSI_T_TRUE);}
228 FALSE {RETURN(PSI_T_FALSE);}
229 NULL {RETURN(PSI_T_NULL);}
230 MIXED {RETURN(PSI_T_MIXED);}
231 VOID {RETURN(PSI_T_VOID);}
232 BOOL {RETURN(PSI_T_BOOL);}
233 INT {RETURN(PSI_T_INT);}
234 FLOAT {RETURN(PSI_T_FLOAT);}
235 DOUBLE {RETURN(PSI_T_DOUBLE);}
236 SINT8 {RETURN(PSI_T_SINT8);}
237 UINT8 {RETURN(PSI_T_UINT8);}
238 SINT16 {RETURN(PSI_T_SINT16);}
239 UINT16 {RETURN(PSI_T_UINT16);}
240 SINT32 {RETURN(PSI_T_SINT32);}
241 UINT32 {RETURN(PSI_T_UINT32);}
242 SINT64 {RETURN(PSI_T_SINT64);}
243 UINT64 {RETURN(PSI_T_UINT64);}
244 STRING {RETURN(PSI_T_STRING);}
245 ARRAY {RETURN(PSI_T_ARRAY);}
246 FUNCTION {RETURN(PSI_T_FUNCTION);}
247 TYPEDEF {RETURN(PSI_T_TYPEDEF);}
248 LIB {RETURN(PSI_T_LIB);}
249 LET {RETURN(PSI_T_LET);}
250 SET {RETURN(PSI_T_SET);}
251 RET {RETURN(PSI_T_RET);}
252 STRLEN {RETURN(PSI_T_STRLEN);}
253 STRVAL {RETURN(PSI_T_STRVAL);}
254 INTVAL {RETURN(PSI_T_INTVAL);}
255 FLOATVAL {RETURN(PSI_T_FLOATVAL);}
256 BOOLVAL {RETURN(PSI_T_BOOLVAL);}
257 TO_STRING {RETURN(PSI_T_TO_STRING);}
258 TO_INT {RETURN(PSI_T_TO_INT);}
259 TO_FLOAT {RETURN(PSI_T_TO_FLOAT);}
260 TO_BOOL {RETURN(PSI_T_TO_BOOL);}
261 NUMBER {RETURN(PSI_T_NUMBER);}
262 NAME {RETURN(PSI_T_NAME);}
263 NSNAME {RETURN(PSI_T_NSNAME);}
264 QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}