4 //#define YYSTYPE struct token
6 #include "ktrfmt.tab.h"
14 /* XXX: need to switch to reentrant lexer */
15 static struct token tokens[NR_TOKENS];
17 static struct symtab *strtab;
24 if (curr_tok == NR_TOKENS) {
26 fprintf(stderr, "Reached max number of tokens\n");
29 return &tokens[curr_tok];
33 tok_free(struct token *tok)
35 assert(&tokens[curr_tok] == tok);
40 * We keep track of strings we've seen before so string comparison
41 * can be done w/ a simple pointer comparison
49 strtab = symtab_new();
50 if ((r = symtab_find(strtab, s)))
54 symtab_insert(strtab, r, r);
60 %option prefix="__ktrfmt"
61 %option outfile="ktrfmt.yy.c"
69 ID [a-z_$][a-zA-Z0-9_]*
70 CTOR [A-Z][a-zA-Z0-9_]*
73 {WHITE}+ { /* ignore */ }
76 yylval->tok = tok_new();
77 yylval->tok->type = TOK_STR;
79 assert(yytext[len - 1] == '"');
80 yytext[len - 1] = '\0'; /* kill trailing quote */
81 printd(LEX, "newstr(\"%s\")\n", yytext + 1);
82 yylval->tok->str = newstr(yytext + 1); /* parser detects oom */
83 yytext[len - 1] = '"'; /* restore quote */
84 printd(LEX, "TOK_STR: \"%s\"\n", yylval->tok->str);
88 yylval->tok = tok_new();
89 yylval->tok->type = TOK_ID;
90 printd(LEX, "tok %p TOK_ID %p:%s\n", yylval->tok, yytext, yytext);
91 yylval->tok->str = newstr(yytext); /* parser detects oom */
95 yylval->tok = tok_new();
96 yylval->tok->type = TOK_CTOR;
97 printd(LEX, "tok %p TOK_CTOR %p:%s\n", yylval->tok, yytext, yytext);
98 yylval->tok->str = newstr(yytext); /* parser detects oom */
102 yylval->tok = tok_new();
103 yylval->tok->type = TOK_INT;
104 yylval->tok->str = strdup(yytext); /* parser detects oom */
105 printd(LEX, "TOK_INT\n");
109 yylval->tok = tok_new();
110 yylval->tok->type = TOK_INT;
111 yylval->tok->str = strdup(yytext); /* parser detects oom */
112 printd(LEX, "TOK_INT\n");
117 printd(LEX, "TOK_EQ\n");
122 printd(LEX, "TOK_DOT\n");
127 printd(LEX, "TOK_LEFT_BRACK\n");
128 return TOK_LEFT_BRACK;
132 printd(LEX, "TOK_RIGHT_BRACK\n");
133 return TOK_RIGHT_BRACK;