X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fgrub2%2Fparser.y;h=0540ff3c088b768f106d945d8f1e86ee7660d0e3;hb=63575c2045b1505da7a2abca8a51a4a7aa3df6f7;hp=bcf5935d58015c054b7666e8a0595bbd732c786b;hpb=e8a50ad2461a8efaa4d71ea19692a1b63a0f9bc2;p=petitboot diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index bcf5935..0540ff3 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -39,6 +39,7 @@ static void yyerror(struct grub2_parser *, char const *s); %token TOKEN_IN "in" %token TOKEN_MENUENTRY "menuentry" %token TOKEN_SELECT "select" +%token TOKEN_SUBMENU "submenu" %token TOKEN_THEN "then" %token TOKEN_TIME "time" %token TOKEN_UTIL "until" @@ -59,23 +60,23 @@ static void yyerror(struct grub2_parser *, char const *s); %% -script: statements { +script: statements { parser->script->statements = $1; } -statements: statement { +statements: /* empty */ { $$ = create_statements(parser); - statement_append($$, $1); } - | statements statement { + | statements statement TOKEN_EOL { statement_append($1, $2); $$ = $1; } - -statement: TOKEN_EOL { - $$ = NULL; + | statements TOKEN_EOL { + $$ = $1; } - | words TOKEN_EOL { + +statement: + words { $$ = create_statement_simple(parser, $1); } | '{' statements '}' { @@ -84,7 +85,7 @@ statement: TOKEN_EOL { | "if" TOKEN_DELIM statement "then" TOKEN_EOL statements - "fi" TOKEN_EOL { + "fi" { $$ = create_statement_if(parser, $3, $6, NULL); } | "if" TOKEN_DELIM statement @@ -92,17 +93,21 @@ statement: TOKEN_EOL { statements "else" TOKEN_EOL statements - "fi" TOKEN_EOL { + "fi" { $$ = create_statement_if(parser, $3, $6, $9); } | "function" TOKEN_DELIM word TOKEN_DELIM '{' statements '}' { $$ = create_statement_function(parser, $3, $6); } | "menuentry" TOKEN_DELIM words TOKEN_DELIM - '{' statements '}' - TOKEN_EOL { + '{' statements '}' { $$ = create_statement_menuentry(parser, $3, $6); } + | "submenu" TOKEN_DELIM words TOKEN_DELIM + '{' statements '}' { + /* we just flatten everything */ + $$ = create_statement_block(parser, $6); + } words: word { $$ = create_argv(parser);