4 #include <talloc/talloc.h>
7 %option nounput noinput
10 %option stack noyy_top_state
13 %option noyyalloc noyyfree noyyrealloc
14 %option extra-type="struct grub2_parser *"
15 %option header-file="lexer.h"
16 %option outfile="lexer.c"
21 WORD [^{}|&$;<> \t\n'"]+
22 VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
26 /* discard leading & trailing whitespace, but keep inter-word delimeters */
29 [ \t]* return TOKEN_DELIM;
32 "[[" return TOKEN_LDSQBRACKET;
33 "]]" return TOKEN_RDSQBRACKET;
34 "case" return TOKEN_CASE;
36 "done" return TOKEN_DONE;
37 "elif" return TOKEN_ELIF;
38 "esac" return TOKEN_ESAC;
40 "for" return TOKEN_FOR;
41 "function" return TOKEN_FUNCTION;
44 "menuentry" return TOKEN_MENUENTRY;
45 "select" return TOKEN_SELECT;
46 "then" return TOKEN_THEN;
47 "time" return TOKEN_TIME;
48 "until" return TOKEN_UTIL;
49 "while" return TOKEN_WHILE;
51 /* anything that's not a metachar: return as a plain word */
53 yylval->strval = talloc_strdup(yyscanner, yytext);
60 yylval->strval = talloc_strdup(yyscanner, yytext);
66 /* single-quoted strings: return a single, non-expanded word token */
68 yy_push_state(sqstring, yyscanner);
71 yy_pop_state(yyscanner);
77 yylval->strval = talloc_strdup(yyscanner, yytext);
80 /* double-quoted strings: return a single, expanded word token */
82 yy_push_state(dqstring, yyscanner);
85 yy_pop_state(yyscanner);
88 <dqstring>([^"]|\\\")+ {
91 yylval->strval = talloc_strdup(yyscanner, yytext);
100 [ \t]*(;|\n)[ \t]* return TOKEN_EOL;
106 . printf("unknown token '%s'\n", yytext); exit(1);
112 void *yyalloc(size_t bytes, void *yyscanner)
114 struct grub2_parser *parser = yyget_extra(yyscanner);
115 return talloc_size(parser, bytes);
118 void *yyrealloc(void *ptr, size_t bytes, void *yyscanner)
120 struct grub2_parser *parser = yyget_extra(yyscanner);
121 return talloc_realloc_size(parser, ptr, bytes);
124 void yyfree(void *ptr, void *yyscanner __attribute__((unused)))