16 # error BSIZE must be greater than YYMAXFILL
19 PSI_Token *PSI_TokenAlloc(PSI_Lexer *L, token_t t)
22 size_t token_len = L->cur - L->tok;
24 T = malloc(sizeof(*T) + token_len);
27 T->text[token_len] = 0;
28 memcpy(T->text, L->tok, token_len);
33 size_t PSI_LexerFill(PSI_Lexer *L, size_t n)
35 // printf("+ Fill: n=%zu\n", n);
37 L->cur = L->tok = L->lim = L->mrk = L->buf;
42 size_t consumed = L->tok - L->buf;
43 size_t reserved = L->lim - L->tok;
44 size_t available = BSIZE - reserved;
48 memmove(L->buf, L->tok, reserved);
55 didread = fread(L->lim, 1, available, L->fp);
57 if (didread < available) {
61 // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
62 // consumed, reserved, available, didread);
64 // printf("+ Fill: avail=%zu\n", L->lim - L->cur);
65 return L->lim - L->cur;
68 void PSI_LexerDtor(PSI_Lexer *L)
79 for (i = 0; i < L->decl.count; ++i) {
80 free_decl(L->decl.list[i]);
87 for (i = 0; i < L->impl.count; ++i) {
88 free_impl(L->impl.list[i]);
92 memset(L, 0, sizeof(*L));
95 void PSI_LexerFree(PSI_Lexer **L)
104 PSI_Lexer *PSI_LexerInit(PSI_Lexer *L, const char *filename)
106 FILE *fp = fopen(filename, "r");
114 L = malloc(sizeof(*L));
116 memset(L, 0, sizeof(*L));
119 L->fn = strdup(filename);
128 token_t PSI_LexerScan(PSI_Lexer *L)
134 re2c:define:YYCTYPE = "unsigned char";
135 re2c:define:YYCURSOR = L->cur;
136 re2c:define:YYLIMIT = L->lim;
137 re2c:define:YYMARKER = L->mrk;
138 re2c:define:YYFILL = "{ if (!PSI_LexerFill(L,@@)) return -1; }";
139 re2c:yyfill:parameter = 0;
144 NSNAME = NAME ("\\" NAME)+;
156 FUNCTION = 'function';
162 FLOATVAL = 'floatval';
164 TO_STRING = 'to_string';
166 TO_FLOAT = 'to_float';
169 "#" .* "\n" { ++L->line; return PSI_T_COMMENT;}
170 "(" {return PSI_T_LPAREN;}
171 ")" {return PSI_T_RPAREN;}
172 ";" {return PSI_T_EOS;}
173 "," {return PSI_T_COMMA;}
174 ":" {return PSI_T_COLON;}
175 "{" {return PSI_T_LCURLY;}
176 "}" {return PSI_T_RCURLY;}
177 "." {return PSI_T_DOT;}
178 "=" {return PSI_T_EQUALS;}
179 "$" {return PSI_T_DOLLAR;}
180 "*" {return PSI_T_POINTER;}
181 "&" {return PSI_T_REFERENCE;}
182 [\r\n] { ++L->line; continue; }
184 NULL {return PSI_T_NULL;}
185 MIXED {return PSI_T_MIXED;}
186 VOID {return PSI_T_VOID;}
187 BOOL {return PSI_T_BOOL;}
188 INT {return PSI_T_INT;}
189 FLOAT {return PSI_T_FLOAT;}
190 DOUBLE {return PSI_T_DOUBLE;}
191 SINT8 {return PSI_T_SINT8;}
192 UINT8 {return PSI_T_UINT8;}
193 STRING {return PSI_T_STRING;}
194 ARRAY {return PSI_T_ARRAY;}
195 FUNCTION {return PSI_T_FUNCTION;}
196 LET {return PSI_T_LET;}
197 SET {return PSI_T_SET;}
198 RET {return PSI_T_RET;}
199 STRVAL {return PSI_T_STRVAL;}
200 INTVAL {return PSI_T_INTVAL;}
201 FLOATVAL {return PSI_T_FLOATVAL;}
202 BOOLVAL {return PSI_T_BOOLVAL;}
203 TO_STRING {return PSI_T_TO_STRING;}
204 TO_INT {return PSI_T_TO_INT;}
205 TO_FLOAT {return PSI_T_TO_FLOAT;}
206 TO_BOOL {return PSI_T_TO_BOOL;}
207 [0-9] {return PSI_T_DIGIT;}
208 NSNAME {return PSI_T_NSNAME;}
209 NAME {return PSI_T_NAME;}