16 # error BSIZE must be greater than YYMAXFILL
19 PSI_Token *PSI_TokenAlloc(PSI_Lexer *L, token_t t)
24 if (L->cur <= L->tok) {
28 token_len = L->cur - L->tok;
30 T = malloc(sizeof(*T) + token_len);
34 T->text[token_len] = 0;
35 memcpy(T->text, L->tok, token_len);
40 size_t PSI_LexerFill(PSI_Lexer *L, size_t n)
42 // printf("+ Fill: n=%zu\n", n);
44 L->cur = L->tok = L->lim = L->mrk = L->buf;
49 size_t consumed = L->tok - L->buf;
50 size_t reserved = L->lim - L->tok;
51 size_t available = BSIZE - reserved;
55 memmove(L->buf, L->tok, reserved);
62 didread = fread(L->lim, 1, available, L->fp);
64 if (didread < available) {
68 // printf("+ Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
69 // consumed, reserved, available, didread);
71 // printf("+ Fill: avail=%zu\n", L->lim - L->cur);
72 return L->lim - L->cur;
75 void PSI_LexerDtor(PSI_Lexer *L)
87 free_decl_typedefs(L->defs);
95 memset(L, 0, sizeof(*L));
98 void PSI_LexerFree(PSI_Lexer **L)
107 PSI_Lexer *PSI_LexerInit(PSI_Lexer *L, const char *filename)
109 FILE *fp = fopen(filename, "r");
117 L = malloc(sizeof(*L));
119 memset(L, 0, sizeof(*L));
122 L->fn = strdup(filename);
131 token_t PSI_LexerScan(PSI_Lexer *L)
137 re2c:define:YYCTYPE = "unsigned char";
138 re2c:define:YYCURSOR = L->cur;
139 re2c:define:YYLIMIT = L->lim;
140 re2c:define:YYMARKER = L->mrk;
141 re2c:define:YYFILL = "{ if (!PSI_LexerFill(L,@@)) 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" { ++L->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] { ++L->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;}