libevtr: abort() on impossible case
[dragonfly.git] / lib / libevtr / ktrfmt.l
1 %{
2
3 #include <assert.h>
4 //#define YYSTYPE struct token
5 #include <stdlib.h>
6 #include "ktrfmt.tab.h"
7 #include "tok.h"
8 #include "internal.h"
9
10 enum {
11         NR_TOKENS = 18,
12 };
13
14 /* XXX: need to switch to reentrant lexer */
15 static struct token tokens[NR_TOKENS];
16 static int curr_tok;
17 static struct symtab *strtab;
18
19 struct token *
20 tok_new(void)
21 {
22         ++curr_tok;
23         if (curr_tok == NR_TOKENS) {
24                 /* can't happen */
25                 fprintf(stderr, "Reached max number of tokens\n");
26                 abort();
27         }
28         return &tokens[curr_tok];
29 }
30
31 void
32 tok_free(struct token *tok)
33 {
34         assert(&tokens[curr_tok] == tok);
35         --curr_tok;
36 }
37
38 /*
39  * We keep track of strings we've seen before so string comparison
40  * can be done w/ a simple pointer comparison
41  */
42 static
43 char *
44 newstr(const char *s)
45 {
46         void *r;
47         if (!strtab)
48                 strtab = symtab_new();
49         if ((r = symtab_find(strtab, s)))
50                 return r;
51         if (!(r = strdup(s)))
52                 return r;
53         symtab_insert(strtab, r, r);
54         return r;
55 }
56
57 %}
58
59 %option prefix="__ktrfmt"
60 %option outfile="ktrfmt.yy.c"
61 %option bison-bridge
62 %option noyywrap
63 %option nounput
64
65 INT     [0-9]+
66 HEX     0x[0-9a-fA-F]+
67 WHITE   [ \t\r]
68 ID      [a-z_$][a-zA-Z0-9_]*
69 CTOR    [A-Z][a-zA-Z0-9_]*
70
71 %%
72 {WHITE}+ { /* ignore */ }
73 \"(\\\"|[^"\n])+\" {
74         size_t len;
75         yylval->tok = tok_new();
76         yylval->tok->type = TOK_STR;
77         len = strlen(yytext);
78         assert(yytext[len - 1] == '"');
79         yytext[len - 1] = '\0'; /* kill trailing quote */
80         printd(LEX, "newstr(\"%s\")\n", yytext + 1);
81         yylval->tok->str = newstr(yytext + 1);  /* parser detects oom */
82         yytext[len - 1] = '"';  /* restore quote */
83         printd(LEX, "TOK_STR: \"%s\"\n", yylval->tok->str);
84         return TOK_STR;
85         }
86 {ID} {
87         yylval->tok = tok_new();
88         yylval->tok->type = TOK_ID;
89         printd(LEX, "tok %p TOK_ID %p:%s\n", yylval->tok, yytext, yytext);
90         yylval->tok->str = newstr(yytext);      /* parser detects oom */
91         return TOK_ID;
92         }
93 {CTOR} {
94         yylval->tok = tok_new();
95         yylval->tok->type = TOK_CTOR;
96         printd(LEX, "tok %p TOK_CTOR %p:%s\n", yylval->tok, yytext, yytext);
97         yylval->tok->str = newstr(yytext);      /* parser detects oom */
98         return TOK_CTOR;
99         }
100 {INT} {
101         yylval->tok = tok_new();
102         yylval->tok->type = TOK_INT;
103         yylval->tok->str = strdup(yytext);      /* parser detects oom */
104         printd(LEX, "TOK_INT\n");
105         return TOK_INT;
106         }
107 {HEX} {
108         yylval->tok = tok_new();
109         yylval->tok->type = TOK_INT;
110         yylval->tok->str = strdup(yytext);      /* parser detects oom */
111         printd(LEX, "TOK_INT\n");
112         return TOK_INT;
113         }
114 "=" {
115         yylval = NULL;
116         printd(LEX, "TOK_EQ\n");
117         return TOK_EQ;
118         }
119 "." {
120         yylval = NULL;
121         printd(LEX, "TOK_DOT\n");
122         return TOK_DOT;
123         }
124 "[" {
125         yylval = NULL;
126         printd(LEX, "TOK_LEFT_BRACK\n");
127         return TOK_LEFT_BRACK;
128         }
129 "]" {
130         yylval = NULL;
131         printd(LEX, "TOK_RIGHT_BRACK\n");
132         return TOK_RIGHT_BRACK;
133         }
134
135 %%