13 typedef struct PSI_Lexer {
21 char *cur, *tok, *lim, *eof, *ctx, *mrk, buf[BSIZE];
26 # error BSIZE must be greater than YYMAXFILL
29 PSI_Token *PSI_TokenAlloc(PSI_Lexer *L, token_t t)
34 if (L->cur <= L->tok) {
38 token_len = L->cur - L->tok;
40 T = malloc(sizeof(*T) + token_len);
44 T->text[token_len] = 0;
45 memcpy(T->text, L->tok, token_len);
50 size_t PSI_LexerFill(PSI_Lexer *L, size_t n)
52 // printf("+ Fill: n=%zu\n", n);
54 L->cur = L->tok = L->lim = L->mrk = L->buf;
59 size_t consumed = L->tok - L->buf;
60 size_t reserved = L->lim - L->tok;
61 size_t available = BSIZE - reserved;
65 memmove(L->buf, L->tok, reserved);
72 didread = fread(L->lim, 1, available, L->fp);
74 if (didread < available) {
78 // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
79 // consumed, reserved, available, didread);
81 // printf("+ Fill: avail=%zu\n", L->lim - L->cur);
82 return L->lim - L->cur;
85 void PSI_LexerDtor(PSI_Lexer *L)
97 free_decl_typedefs(L->defs);
100 free_decls(L->decls);
103 free_impls(L->impls);
105 memset(L, 0, sizeof(*L));
108 void PSI_LexerFree(PSI_Lexer **L)
117 PSI_Lexer *PSI_LexerInit(PSI_Lexer *L, const char *filename)
119 FILE *fp = fopen(filename, "r");
127 L = malloc(sizeof(*L));
129 memset(L, 0, sizeof(*L));
132 L->fn = strdup(filename);
141 token_t PSI_LexerScan(PSI_Lexer *L)
147 re2c:define:YYCTYPE = "unsigned char";
148 re2c:define:YYCURSOR = L->cur;
149 re2c:define:YYLIMIT = L->lim;
150 re2c:define:YYMARKER = L->mrk;
151 re2c:define:YYFILL = "{ if (!PSI_LexerFill(L,@@)) return -1; }";
152 re2c:yyfill:parameter = 0;
157 NSNAME = (NAME)? ("\\" NAME)+;
158 QUOTED_STRING = "\"" ([^\"])+ "\"";
176 FUNCTION = 'function';
184 FLOATVAL = 'floatval';
186 TO_STRING = 'to_string';
188 TO_FLOAT = 'to_float';
191 "#" .* "\n" { ++L->line; return PSI_T_COMMENT;}
192 "(" {return PSI_T_LPAREN;}
193 ")" {return PSI_T_RPAREN;}
194 ";" {return PSI_T_EOS;}
195 "," {return PSI_T_COMMA;}
196 ":" {return PSI_T_COLON;}
197 "{" {return PSI_T_LBRACE;}
198 "}" {return PSI_T_RBRACE;}
199 "." {return PSI_T_DOT;}
200 "=" {return PSI_T_EQUALS;}
201 "$" {return PSI_T_DOLLAR;}
202 "*" {return PSI_T_POINTER;}
203 "&" {return PSI_T_REFERENCE;}
204 [\r\n] { ++L->line; continue; }
206 NULL {return PSI_T_NULL;}
207 MIXED {return PSI_T_MIXED;}
208 VOID {return PSI_T_VOID;}
209 BOOL {return PSI_T_BOOL;}
210 INT {return PSI_T_INT;}
211 FLOAT {return PSI_T_FLOAT;}
212 DOUBLE {return PSI_T_DOUBLE;}
213 SINT8 {return PSI_T_SINT8;}
214 UINT8 {return PSI_T_UINT8;}
215 SINT16 {return PSI_T_SINT16;}
216 UINT16 {return PSI_T_UINT16;}
217 SINT32 {return PSI_T_SINT32;}
218 UINT32 {return PSI_T_UINT32;}
219 SINT64 {return PSI_T_SINT64;}
220 UINT64 {return PSI_T_UINT64;}
221 STRING {return PSI_T_STRING;}
222 ARRAY {return PSI_T_ARRAY;}
223 FUNCTION {return PSI_T_FUNCTION;}
224 TYPEDEF {return PSI_T_TYPEDEF;}
225 LIB {return PSI_T_LIB;}
226 LET {return PSI_T_LET;}
227 SET {return PSI_T_SET;}
228 RET {return PSI_T_RET;}
229 STRVAL {return PSI_T_STRVAL;}
230 INTVAL {return PSI_T_INTVAL;}
231 FLOATVAL {return PSI_T_FLOATVAL;}
232 BOOLVAL {return PSI_T_BOOLVAL;}
233 TO_STRING {return PSI_T_TO_STRING;}
234 TO_INT {return PSI_T_TO_INT;}
235 TO_FLOAT {return PSI_T_TO_FLOAT;}
236 TO_BOOL {return PSI_T_TO_BOOL;}
237 [0-9] {return PSI_T_DIGIT;}
238 NAME {return PSI_T_NAME;}
239 NSNAME {return PSI_T_NSNAME;}
240 QUOTED_STRING {return PSI_T_QUOTED_STRING;}