5 #include <talloc/talloc.h>
8 %option nounput noinput
9 %option batch never-interactive
12 %option stack noyy_top_state
16 %option noyyalloc noyyfree noyyrealloc
17 %option extra-type="struct grub2_parser *"
18 %option header-file="lexer.h"
19 %option outfile="lexer.c"
24 WORD [^{}|&$;<> \t\n'"#]+
25 VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
29 /* discard leading & trailing whitespace, but keep inter-word delimeters */
32 [ \t]+ return TOKEN_DELIM;
35 "[[" return TOKEN_LDSQBRACKET;
36 "]]" return TOKEN_RDSQBRACKET;
37 "case" return TOKEN_CASE;
39 "done" return TOKEN_DONE;
40 "elif" return TOKEN_ELIF;
41 "else" return TOKEN_ELSE;
42 "esac" return TOKEN_ESAC;
44 "for" return TOKEN_FOR;
45 "function" return TOKEN_FUNCTION;
48 "menuentry" return TOKEN_MENUENTRY;
49 "select" return TOKEN_SELECT;
50 "submenu" return TOKEN_SUBMENU;
51 "then" return TOKEN_THEN;
52 "time" return TOKEN_TIME;
53 "until" return TOKEN_UTIL;
54 "while" return TOKEN_WHILE;
56 /* anything that's not a metachar: return as a plain word */
58 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
64 if (yytext[1] == '{') {
65 yytext[yyleng-1] = '\0';
69 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
74 /* single-quoted strings: return a single, non-expanded word token */
76 yy_push_state(sqstring, yyscanner);
79 yy_pop_state(yyscanner);
82 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
86 /* double-quoted strings: return a single, expanded word token */
88 yy_push_state(dqstring, yyscanner);
91 yy_pop_state(yyscanner);
93 <dqstring>([^"\$]|\\\")+ {
94 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
97 <dqstring>\${VARNAME} |
98 <dqstring>\$\{{VARNAME}\} {
99 if (yytext[1] == '{') {
100 yytext[yyleng-1] = '\0';
104 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
116 [ \t]*(;|\n)[ \t]* return TOKEN_EOL;
121 . printf("unknown token '%s'\n", yytext); exit(1);
127 void *yyalloc(size_t bytes, void *yyscanner)
129 struct grub2_parser *parser = yyget_extra(yyscanner);
130 return talloc_size(parser, bytes);
133 void *yyrealloc(void *ptr, size_t bytes, void *yyscanner)
135 struct grub2_parser *parser = yyget_extra(yyscanner);
136 return talloc_realloc_size(parser, ptr, bytes);
139 void yyfree(void *ptr, void *yyscanner __attribute__((unused)))