5 #include <talloc/talloc.h>
7 void yyerror(struct grub2_parser *parser, const char *fmt, ...);
10 %option nounput noinput
11 %option batch never-interactive
14 %option stack noyy_top_state
18 %option noyyalloc noyyfree noyyrealloc
19 %option extra-type="struct grub2_parser *"
20 %option header-file="lexer.h"
21 %option outfile="lexer.c"
26 WORD [^{}|&$;<> \t\n'"#]+
27 VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
31 /* discard leading & trailing whitespace, but keep inter-word delimeters */
34 [ \t]+ return TOKEN_DELIM;
37 "[[" return TOKEN_LDSQBRACKET;
38 "]]" return TOKEN_RDSQBRACKET;
39 "case" return TOKEN_CASE;
41 "done" return TOKEN_DONE;
42 "elif" return TOKEN_ELIF;
43 "else" return TOKEN_ELSE;
44 "esac" return TOKEN_ESAC;
46 "for" return TOKEN_FOR;
47 "function" return TOKEN_FUNCTION;
50 "menuentry" return TOKEN_MENUENTRY;
51 "select" return TOKEN_SELECT;
52 "submenu" return TOKEN_SUBMENU;
53 "then" return TOKEN_THEN;
54 "time" return TOKEN_TIME;
55 "until" return TOKEN_UTIL;
56 "while" return TOKEN_WHILE;
58 /* anything that's not a metachar: return as a plain word */
60 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
66 if (yytext[1] == '{') {
67 yytext[yyleng-1] = '\0';
71 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
76 /* single-quoted strings: return a single, non-expanded word token */
78 yy_push_state(sqstring, yyscanner);
81 yy_pop_state(yyscanner);
84 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
88 /* double-quoted strings: return a single, expanded word token */
90 yy_push_state(dqstring, yyscanner);
93 yy_pop_state(yyscanner);
95 <dqstring>([^"\$]|\\\")+ {
96 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
99 <dqstring>\${VARNAME} |
100 <dqstring>\$\{{VARNAME}\} {
101 if (yytext[1] == '{') {
102 yytext[yyleng-1] = '\0';
106 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
118 [ \t]*(;|\n)[ \t]* return TOKEN_EOL;
124 yyerror(yyget_extra(yyscanner), "unknown token '%s'\n", yytext);
132 void *yyalloc(size_t bytes, void *yyscanner)
134 struct grub2_parser *parser = yyget_extra(yyscanner);
135 return talloc_size(parser, bytes);
138 void *yyrealloc(void *ptr, size_t bytes, void *yyscanner)
140 struct grub2_parser *parser = yyget_extra(yyscanner);
141 return talloc_realloc_size(parser, ptr, bytes);
144 void yyfree(void *ptr, void *yyscanner __attribute__((unused)))