4 //#define YYSTYPE struct token
5 #include "ktrfmt.tab.h"
13 static struct token tokens[NR_TOKENS];
15 static struct symtab *strtab;
21 if (curr_tok == NR_TOKENS) {
23 fprintf(stderr, "Reached max number of tokens\n");
26 return &tokens[curr_tok];
30 tok_free(struct token *tok)
32 assert(&tokens[curr_tok] == tok);
38 * We keep track of strings we've seen before so string comparison
39 * can be done w/ a simple pointer comparison
47 strtab = symtab_new(); /* XXX: oom */
48 if ((r = symtab_find(strtab, s)))
51 symtab_insert(strtab, r, r);
57 %option prefix="__ktrfmt"
58 %option outfile="ktrfmt.yy.c"
65 ID [a-zA-Z_$][a-zA-Z0-9_]*
68 {WHITE}+ { /* ignore */ }
71 yylval->tok = tok_new();
72 yylval->tok->type = TOK_STR;
74 yytext[len - 1] = '\0'; /* kill trailing quote */
75 yylval->tok->str = newstr(yytext + 1);
76 printd(LEX, "TOK_STR\n");
80 yylval->tok = tok_new();
81 yylval->tok->type = TOK_ID;
82 printd(LEX, "tok %p TOK_ID %p:%s\n", yylval->tok, yytext, yytext);
83 yylval->tok->str = strdup(yytext); /* XXX: oom */
87 yylval->tok = tok_new();
88 yylval->tok->type = TOK_INT;
89 yylval->tok->str = strdup(yytext);
90 printd(LEX, "TOK_INT\n");
95 printd(LEX, "TOK_EQ\n");
100 printd(LEX, "TOK_LEFT_BRACK\n");
101 return TOK_LEFT_BRACK;
105 printd(LEX, "TOK_RIGHT_BRACK\n");
106 return TOK_RIGHT_BRACK;