X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Fgrub2-lexer.l;h=b55a71578a93413f1be1251bc3e680a9b9bc3097;hp=7c9fcfe81537459fb40f102c4e9bbb150b2854f7;hb=8f09986340e602a69398b2866a265ea3f16609c6;hpb=76591d5e727b35295ea238322f73515c8cc93945 diff --git a/discover/grub2/grub2-lexer.l b/discover/grub2/grub2-lexer.l index 7c9fcfe..b55a715 100644 --- a/discover/grub2/grub2-lexer.l +++ b/discover/grub2/grub2-lexer.l @@ -22,14 +22,15 @@ void yyerror(struct grub2_parser *parser, const char *fmt, ...); %x dqstring WORD [^{}|&$;<> \t\n'"#]+ -VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) +DELIM [ \t]+ +BLANK ["]{2}|[']{2} +NUMBER 0|[1-9][0-9]* +VARNAME ([[:alpha:]][_[:alnum:]]*|{NUMBER}|[\?@\*#]) %% - /* discard leading & trailing whitespace, but keep inter-word delimeters */ -^[ \t]+ ; -[ \t]+$ ; -[ \t]+ return TOKEN_DELIM; + /* discard whitespace, unless we're looking for inter-word delimiters */ +{DELIM} { if (yyget_extra(yyscanner)->inter_word) return TOKEN_DELIM; } /* reserved words */ "[[" return TOKEN_LDSQBRACKET; @@ -53,9 +54,16 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) "until" return TOKEN_UTIL; "while" return TOKEN_WHILE; + /* ignore quoted empty strings */ +{BLANK} { + yylval->word = create_word_text(yyget_extra(yyscanner), ""); + yyget_extra(yyscanner)->inter_word = true; + return TOKEN_WORD; + } /* anything that's not a metachar: return as a plain word */ {WORD} { yylval->word = create_word_text(yyget_extra(yyscanner), yytext); + yyget_extra(yyscanner)->inter_word = true; return TOKEN_WORD; } @@ -68,6 +76,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) yytext++; yylval->word = create_word_var(yyget_extra(yyscanner), yytext, true); + yyget_extra(yyscanner)->inter_word = true; return TOKEN_WORD; } @@ -80,6 +89,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) } [^']+ { yylval->word = create_word_text(yyget_extra(yyscanner), yytext); + yyget_extra(yyscanner)->inter_word = true; return TOKEN_WORD; } @@ -92,6 +102,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) } ([^"\$]|\\\")+ { yylval->word = create_word_text(yyget_extra(yyscanner), yytext); + yyget_extra(yyscanner)->inter_word = true; return TOKEN_WORD; } \${VARNAME} | @@ -103,23 +114,28 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) yytext++; yylval->word = create_word_var(yyget_extra(yyscanner), yytext, false); + yyget_extra(yyscanner)->inter_word = true; return TOKEN_WORD; } /* blocks */ -"{" return '{'; -"}" return '}'; +"{" { yyget_extra(yyscanner)->inter_word = false; return '{'; } +"}" { yyget_extra(yyscanner)->inter_word = false; return '}'; } /* end-of-line */ -[ \t]*(;|\n)[ \t]* return TOKEN_EOL; +[ \t]*(;|\n)[ \t]* { + yyget_extra(yyscanner)->inter_word = false; + return TOKEN_EOL; + } /* strip comments */ #.* ; . { - yyerror(yyget_extra(yyscanner), "unknown token '%s'\n", yytext); + yyerror(yyget_extra(yyscanner), yyscanner, + "unknown token '%s'\n", yytext); yyterminate(); }