5 #include <talloc/talloc.h>
8 %option nounput noinput
11 %option stack noyy_top_state
14 %option noyyalloc noyyfree noyyrealloc
15 %option extra-type="struct grub2_parser *"
16 %option header-file="lexer.h"
17 %option outfile="lexer.c"
22 WORD [^{}|&$;<> \t\n'"]+
23 VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
27 /* discard leading & trailing whitespace, but keep inter-word delimeters */
30 [ \t]* return TOKEN_DELIM;
33 "[[" return TOKEN_LDSQBRACKET;
34 "]]" return TOKEN_RDSQBRACKET;
35 "case" return TOKEN_CASE;
37 "done" return TOKEN_DONE;
38 "elif" return TOKEN_ELIF;
39 "esac" return TOKEN_ESAC;
41 "for" return TOKEN_FOR;
42 "function" return TOKEN_FUNCTION;
45 "menuentry" return TOKEN_MENUENTRY;
46 "select" return TOKEN_SELECT;
47 "then" return TOKEN_THEN;
48 "time" return TOKEN_TIME;
49 "until" return TOKEN_UTIL;
50 "while" return TOKEN_WHILE;
52 /* anything that's not a metachar: return as a plain word */
54 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
60 if (yytext[1] == '{') {
61 yytext[yyleng-1] = '\0';
65 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
70 /* single-quoted strings: return a single, non-expanded word token */
72 yy_push_state(sqstring, yyscanner);
75 yy_pop_state(yyscanner);
78 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
82 /* double-quoted strings: return a single, expanded word token */
84 yy_push_state(dqstring, yyscanner);
87 yy_pop_state(yyscanner);
89 <dqstring>([^"\$]|\\\")+ {
90 yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
93 <dqstring>\${VARNAME} |
94 <dqstring>\$\{{VARNAME}\} {
95 if (yytext[1] == '{') {
96 yytext[yyleng-1] = '\0';
100 yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
112 [ \t]*(;|\n)[ \t]* return TOKEN_EOL;
118 . printf("unknown token '%s'\n", yytext); exit(1);
124 void *yyalloc(size_t bytes, void *yyscanner)
126 struct grub2_parser *parser = yyget_extra(yyscanner);
127 return talloc_size(parser, bytes);
130 void *yyrealloc(void *ptr, size_t bytes, void *yyscanner)
132 struct grub2_parser *parser = yyget_extra(yyscanner);
133 return talloc_realloc_size(parser, ptr, bytes);
136 void yyfree(void *ptr, void *yyscanner __attribute__((unused)))