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 *);
11 PSI_Parser *PSI_ParserInit(PSI_Parser *P, const char *filename)
16 P = malloc(sizeof(*P));
18 memset(P, 0, sizeof(*P));
20 fp = fopen(filename, "r");
28 P = malloc(sizeof(*P));
30 memset(P, 0, sizeof(*P));
33 P->fn = strdup(filename);
36 P->proc = PSI_ParserProcAlloc(malloc);
43 size_t PSI_ParserFill(PSI_Parser *P, size_t n)
45 // printf("+ Fill: n=%zu\n", n);
47 P->cur = P->tok = P->lim = P->mrk = P->buf;
52 size_t consumed = P->tok - P->buf;
53 size_t reserved = P->lim - P->tok;
54 size_t available = BSIZE - reserved;
58 memmove(P->buf, P->tok, reserved);
65 didread = fread(P->lim, 1, available, P->fp);
67 if (didread < available) {
71 // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
72 // consumed, reserved, available, didread);
74 // printf("+ Fill: avail=%zu\n", P->lim - P->cur);
75 return P->lim - P->cur;
78 void PSI_ParserParse(PSI_Parser *P, PSI_Token *T)
81 PSI_ParserProc(P->proc, T->type, T, P);
83 PSI_ParserProc(P->proc, 0, NULL, P);
87 void PSI_ParserDtor(PSI_Parser *P)
89 PSI_ParserProcFree(P->proc, free);
95 PSI_DataDtor((PSI_Data *) P);
97 memset(P, 0, sizeof(*P));
100 void PSI_ParserFree(PSI_Parser **P)
112 #if BSIZE < YYMAXFILL
113 # error BSIZE must be greater than YYMAXFILL
116 #define RETURN(t) do { \
121 token_t PSI_ParserScan(PSI_Parser *P)
127 re2c:define:YYCTYPE = "unsigned char";
128 re2c:define:YYCURSOR = P->cur;
129 re2c:define:YYLIMIT = P->lim;
130 re2c:define:YYMARKER = P->mrk;
131 re2c:define:YYFILL = "{ if (!PSI_ParserFill(P,@@)) RETURN(-1); }";
132 re2c:yyfill:parameter = 0;
137 NSNAME = (NAME)? ("\\" NAME)+;
138 QUOTED_STRING = "\"" ([^\"])+ "\"";
156 FUNCTION = 'function';
164 FLOATVAL = 'floatval';
166 TO_STRING = 'to_string';
168 TO_FLOAT = 'to_float';
171 "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
172 "(" {RETURN(PSI_T_LPAREN);}
173 ")" {RETURN(PSI_T_RPAREN);}
174 ";" {RETURN(PSI_T_EOS);}
175 "," {RETURN(PSI_T_COMMA);}
176 ":" {RETURN(PSI_T_COLON);}
177 "{" {RETURN(PSI_T_LBRACE);}
178 "}" {RETURN(PSI_T_RBRACE);}
179 "." {RETURN(PSI_T_DOT);}
180 "=" {RETURN(PSI_T_EQUALS);}
181 "$" {RETURN(PSI_T_DOLLAR);}
182 "*" {RETURN(PSI_T_POINTER);}
183 "&" {RETURN(PSI_T_REFERENCE);}
184 [\r\n] { ++P->line; continue; }
186 NULL {RETURN(PSI_T_NULL);}
187 MIXED {RETURN(PSI_T_MIXED);}
188 VOID {RETURN(PSI_T_VOID);}
189 BOOL {RETURN(PSI_T_BOOL);}
190 INT {RETURN(PSI_T_INT);}
191 FLOAT {RETURN(PSI_T_FLOAT);}
192 DOUBLE {RETURN(PSI_T_DOUBLE);}
193 SINT8 {RETURN(PSI_T_SINT8);}
194 UINT8 {RETURN(PSI_T_UINT8);}
195 SINT16 {RETURN(PSI_T_SINT16);}
196 UINT16 {RETURN(PSI_T_UINT16);}
197 SINT32 {RETURN(PSI_T_SINT32);}
198 UINT32 {RETURN(PSI_T_UINT32);}
199 SINT64 {RETURN(PSI_T_SINT64);}
200 UINT64 {RETURN(PSI_T_UINT64);}
201 STRING {RETURN(PSI_T_STRING);}
202 ARRAY {RETURN(PSI_T_ARRAY);}
203 FUNCTION {RETURN(PSI_T_FUNCTION);}
204 TYPEDEF {RETURN(PSI_T_TYPEDEF);}
205 LIB {RETURN(PSI_T_LIB);}
206 LET {RETURN(PSI_T_LET);}
207 SET {RETURN(PSI_T_SET);}
208 RET {RETURN(PSI_T_RET);}
209 STRVAL {RETURN(PSI_T_STRVAL);}
210 INTVAL {RETURN(PSI_T_INTVAL);}
211 FLOATVAL {RETURN(PSI_T_FLOATVAL);}
212 BOOLVAL {RETURN(PSI_T_BOOLVAL);}
213 TO_STRING {RETURN(PSI_T_TO_STRING);}
214 TO_INT {RETURN(PSI_T_TO_INT);}
215 TO_FLOAT {RETURN(PSI_T_TO_FLOAT);}
216 TO_BOOL {RETURN(PSI_T_TO_BOOL);}
217 [0-9] {RETURN(PSI_T_DIGIT);}
218 NAME {RETURN(PSI_T_NAME);}
219 NSNAME {RETURN(PSI_T_NSNAME);}
220 QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}