From 76591d5e727b35295ea238322f73515c8cc93945 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Mon, 4 Aug 2014 09:46:00 +0800 Subject: discover/grub2: distinguish parser.h from grub2/parser.h 'make distcheck' will do a 'make all' srcdir == objdir, then later a 'make check' sith srcdir != objdir. Since gcc's cpp always assumes that a source file's directory is first in the include paths, we may see discover/parser.h included when we wanted the generated discover/grub2/parser.h. This change renames the grub2 lexer and parser files, to work-around this behaviour, and fix 'make distcheck'. Signed-off-by: Jeremy Kerr --- discover/grub2/grub2-lexer.l | 145 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 discover/grub2/grub2-lexer.l (limited to 'discover/grub2/grub2-lexer.l') diff --git a/discover/grub2/grub2-lexer.l b/discover/grub2/grub2-lexer.l new file mode 100644 index 0000000..7c9fcfe --- /dev/null +++ b/discover/grub2/grub2-lexer.l @@ -0,0 +1,145 @@ + +%{ +#include "grub2.h" +#include "grub2-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 *" + +%x sqstring +%x dqstring + +WORD [^{}|&$;<> \t\n'"#]+ +VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#]) + +%% + + /* discard leading & trailing whitespace, but keep inter-word delimeters */ +^[ \t]+ ; +[ \t]+$ ; +[ \t]+ return TOKEN_DELIM; + + /* reserved words */ +"[[" return TOKEN_LDSQBRACKET; +"]]" return TOKEN_RDSQBRACKET; +"case" return TOKEN_CASE; +"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; +"function" return TOKEN_FUNCTION; +"if" return TOKEN_IF; +"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; +"while" return TOKEN_WHILE; + + /* anything that's not a metachar: return as a plain word */ +{WORD} { + 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, + true); + return TOKEN_WORD; + } + + /* single-quoted strings: return a single, non-expanded word token */ +\' { + yy_push_state(sqstring, yyscanner); + } +\' { + yy_pop_state(yyscanner); + } +[^']+ { + yylval->word = create_word_text(yyget_extra(yyscanner), yytext); + return TOKEN_WORD; + } + + /* double-quoted strings: return a single, expanded word token */ +\" { + yy_push_state(dqstring, yyscanner); + } +\" { + yy_pop_state(yyscanner); + } +([^"\$]|\\\")+ { + 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 '}'; + + /* end-of-line */ +[ \t]*(;|\n)[ \t]* return TOKEN_EOL; + + /* strip comments */ +#.* ; + +. { + yyerror(yyget_extra(yyscanner), "unknown token '%s'\n", yytext); + yyterminate(); + } + +%% + +struct grub2_parser; + +void *yyalloc(size_t bytes, void *yyscanner) +{ + struct grub2_parser *parser = yyget_extra(yyscanner); + return talloc_size(parser, bytes); +} + +void *yyrealloc(void *ptr, size_t bytes, void *yyscanner) +{ + struct grub2_parser *parser = yyget_extra(yyscanner); + return talloc_realloc_size(parser, ptr, bytes); +} + +void yyfree(void *ptr, void *yyscanner __attribute__((unused))) +{ + talloc_free(ptr); +} -- cgit v1.2.1