X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Flexer.l;h=e1aad9931252f98be623a5fc87035a61f3de4ef2;hp=64eee279a3d0f3311c5c3cfe9770dfb5bd69797d;hb=ae3c354e844698bdb4ed35a6845aa9dca1e9205f;hpb=ce2275ed4fa099035af123c25a1a7657f1ea6e78 diff --git a/discover/grub2/lexer.l b/discover/grub2/lexer.l index 64eee27..e1aad99 100644 --- a/discover/grub2/lexer.l +++ b/discover/grub2/lexer.l @@ -3,14 +3,18 @@ #include "grub2.h" #include "parser.h" #include + +void yyerror(struct grub2_parser *parser, const char *fmt, ...); %} %option nounput noinput +%option batch never-interactive %option warn %option noyywrap %option stack noyy_top_state %option reentrant %option bison-bridge +%option yylineno %option noyyalloc noyyfree noyyrealloc %option extra-type="struct grub2_parser *" %option header-file="lexer.h" @@ -19,7 +23,7 @@ %x sqstring %x dqstring -WORD [^{}|&$;<> \t\n'"]+ +WORD [^{}|&$;<> \t\n'"#]+ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) %% @@ -27,7 +31,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) /* discard leading & trailing whitespace, but keep inter-word delimeters */ ^[ \t]+ ; [ \t]+$ ; -[ \t]* return TOKEN_DELIM; +[ \t]+ return TOKEN_DELIM; /* reserved words */ "[[" return TOKEN_LDSQBRACKET; @@ -36,6 +40,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) "do" return TOKEN_DO; "done" return TOKEN_DONE; "elif" return TOKEN_ELIF; +"else" return TOKEN_ELSE; "esac" return TOKEN_ESAC; "fi" return TOKEN_FI; "for" return TOKEN_FOR; @@ -44,6 +49,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) "in" return TOKEN_IN; "menuentry" return TOKEN_MENUENTRY; "select" return TOKEN_SELECT; +"submenu" return TOKEN_SUBMENU; "then" return TOKEN_THEN; "time" return TOKEN_TIME; "until" return TOKEN_UTIL; @@ -51,15 +57,19 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) /* anything that's not a metachar: return as a plain word */ {WORD} { - yylval->word = create_word(yyget_extra(yyscanner), yytext, - false, false); + yylval->word = create_word_text(yyget_extra(yyscanner), yytext); return TOKEN_WORD; } \${VARNAME} | \$\{{VARNAME}\} { - yylval->word = create_word(yyget_extra(yyscanner), yytext, - true, true); + if (yytext[1] == '{') { + yytext[yyleng-1] = '\0'; + yytext++; + } + yytext++; + yylval->word = create_word_var(yyget_extra(yyscanner), yytext, + true); return TOKEN_WORD; } @@ -71,8 +81,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) yy_pop_state(yyscanner); } [^']+ { - yylval->word = create_word(yyget_extra(yyscanner), yytext, - false, false); + yylval->word = create_word_text(yyget_extra(yyscanner), yytext); return TOKEN_WORD; } @@ -83,13 +92,24 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) \" { yy_pop_state(yyscanner); } -([^"]|\\\")+ { - yylval->word = create_word(yyget_extra(yyscanner), yytext, - true, false); +([^"\$]|\\\")+ { + yylval->word = create_word_text(yyget_extra(yyscanner), yytext); + return TOKEN_WORD; + } +\${VARNAME} | +\$\{{VARNAME}\} { + if (yytext[1] == '{') { + yytext[yyleng-1] = '\0'; + yytext++; + } + yytext++; + yylval->word = create_word_var(yyget_extra(yyscanner), yytext, + false); return TOKEN_WORD; } + /* blocks */ "{" return '{'; "}" return '}'; @@ -98,10 +118,12 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) [ \t]*(;|\n)[ \t]* return TOKEN_EOL; /* strip comments */ -#.*$ ; - +#.* ; -. printf("unknown token '%s'\n", yytext); exit(1); +. { + yyerror(yyget_extra(yyscanner), "unknown token '%s'\n", yytext); + yyterminate(); + } %%