6 PSI_Parser *PSI_ParserInit(PSI_Parser *P)
11 P = malloc(sizeof(*P));
13 memset(P, 0, sizeof(*P));
15 fp = fopen(filename, "r");
23 P = malloc(sizeof(*P));
25 memset(P, 0, sizeof(*P));
28 P->fn = strdup(filename);
31 P->proc = PSI_ParserProcAlloc(malloc);
36 size_t PSI_ParserFill(PSI_Parser *P, size_t n)
38 // printf("+ Fill: n=%zu\n", n);
40 P->cur = P->tok = P->lim = P->mrk = P->buf;
45 size_t consumed = P->tok - P->buf;
46 size_t reserved = P->lim - P->tok;
47 size_t available = BSIZE - reserved;
51 memmove(P->buf, P->tok, reserved);
58 didread = fread(P->lim, 1, available, P->fp);
60 if (didread < available) {
64 // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
65 // consumed, reserved, available, didread);
67 // printf("+ Fill: avail=%zu\n", P->lim - P->cur);
68 return P->lim - P->cur;
71 int PSI_ParserParse(PSI_Parser *P)
75 if (-1 == PSI_ParserScan(P)) {
76 PSI_ParserProc(P->proc, 0, NULL, P);
79 if (!(T = PSI_TokenAlloc(P, t))) {
83 PSI_ParserProc(P->proc, P->num, T, P);
87 void PSI_ParserDtor(PSI_Parser *P)
89 PSI_ParserProcFree(P->proc, free);
100 free_decl_typedefs(P->defs);
103 free_decls(P->decls);
106 free_impls(P->impls);
108 memset(P, 0, sizeof(*P));
111 void PSI_ParserFree(PSI_Parser **P)
123 #if BSIZE < YYMAXFILL
124 # error BSIZE must be greater than YYMAXFILL
127 #define RETURN(t) do { \
131 token_t PSI_ParserScan(PSI_Parser *P)
137 re2c:define:YYCTYPE = "unsigned char";
138 re2c:define:YYCURSOR = P->cur;
139 re2c:define:YYLIMIT = P->lim;
140 re2c:define:YYMARKER = P->mrk;
141 re2c:define:YYFILL = "{ if (!fill(P,@@)) RETURN(-1); }";
142 re2c:yyfill:parameter = 0;
147 NSNAME = (NAME)? ("\\" NAME)+;
148 QUOTED_STRING = "\"" ([^\"])+ "\"";
166 FUNCTION = 'function';
174 FLOATVAL = 'floatval';
176 TO_STRING = 'to_string';
178 TO_FLOAT = 'to_float';
181 "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
182 "(" {RETURN(PSI_T_LPAREN);}
183 ")" {RETURN(PSI_T_RPAREN);}
184 ";" {RETURN(PSI_T_EOS);}
185 "," {RETURN(PSI_T_COMMA);}
186 ":" {RETURN(PSI_T_COLON);}
187 "{" {RETURN(PSI_T_LBRACE);}
188 "}" {RETURN(PSI_T_RBRACE);}
189 "." {RETURN(PSI_T_DOT);}
190 "=" {RETURN(PSI_T_EQUALS);}
191 "$" {RETURN(PSI_T_DOLLAR);}
192 "*" {RETURN(PSI_T_POINTER);}
193 "&" {RETURN(PSI_T_REFERENCE);}
194 [\r\n] { ++P->line; continue; }
196 NULL {RETURN(PSI_T_NULL);}
197 MIXED {RETURN(PSI_T_MIXED);}
198 VOID {RETURN(PSI_T_VOID);}
199 BOOL {RETURN(PSI_T_BOOL);}
200 INT {RETURN(PSI_T_INT);}
201 FLOAT {RETURN(PSI_T_FLOAT);}
202 DOUBLE {RETURN(PSI_T_DOUBLE);}
203 SINT8 {RETURN(PSI_T_SINT8);}
204 UINT8 {RETURN(PSI_T_UINT8);}
205 SINT16 {RETURN(PSI_T_SINT16);}
206 UINT16 {RETURN(PSI_T_UINT16);}
207 SINT32 {RETURN(PSI_T_SINT32);}
208 UINT32 {RETURN(PSI_T_UINT32);}
209 SINT64 {RETURN(PSI_T_SINT64);}
210 UINT64 {RETURN(PSI_T_UINT64);}
211 STRING {RETURN(PSI_T_STRING);}
212 ARRAY {RETURN(PSI_T_ARRAY);}
213 FUNCTION {RETURN(PSI_T_FUNCTION);}
214 TYPEDEF {RETURN(PSI_T_TYPEDEF);}
215 LIB {RETURN(PSI_T_LIB);}
216 LET {RETURN(PSI_T_LET);}
217 SET {RETURN(PSI_T_SET);}
218 RET {RETURN(PSI_T_RET);}
219 STRVAL {RETURN(PSI_T_STRVAL);}
220 INTVAL {RETURN(PSI_T_INTVAL);}
221 FLOATVAL {RETURN(PSI_T_FLOATVAL);}
222 BOOLVAL {RETURN(PSI_T_BOOLVAL);}
223 TO_STRING {RETURN(PSI_T_TO_STRING);}
224 TO_INT {RETURN(PSI_T_TO_INT);}
225 TO_FLOAT {RETURN(PSI_T_TO_FLOAT);}
226 TO_BOOL {RETURN(PSI_T_TO_BOOL);}
227 [0-9] {RETURN(PSI_T_DIGIT);}
228 NAME {RETURN(PSI_T_NAME);}
229 NSNAME {RETURN(PSI_T_NSNAME);}
230 QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}