]> git.ozlabs.org Git - petitboot/blobdiff - discover/grub2/parser.y
discover/grub2: Implement 'else' blocks
[petitboot] / discover / grub2 / parser.y
index f49cecdc3382cb630817b00d071d4ff00dfeaa59..e13cd72a8f72e6358e7dfa7ab7387000b384efc4 100644 (file)
@@ -29,6 +29,7 @@ static void yyerror(struct grub2_parser *, char const *s);
 %token TOKEN_DO                "do"
 %token TOKEN_DONE              "done"
 %token TOKEN_ELIF              "elif"
+%token TOKEN_ELSE              "else"
 %token TOKEN_ESAC              "esac"
 %token TOKEN_FI                "fi"
 %token TOKEN_FOR               "for"
@@ -85,6 +86,14 @@ statement: TOKEN_EOL {
                "fi" TOKEN_EOL {
                $$ = create_statement_if(parser, $3, $6, NULL);
        }
+       | "if" TOKEN_DELIM statement
+               "then" TOKEN_EOL
+               statements
+               "else" TOKEN_EOL
+               statements
+               "fi" TOKEN_EOL {
+               $$ = create_statement_if(parser, $3, $6, $9);
+       }
        | "menuentry" TOKEN_DELIM words TOKEN_DELIM
                '{' statements '}'
                TOKEN_EOL {
@@ -221,13 +230,13 @@ void word_append(struct grub2_word *w1, struct grub2_word *w2)
        w1->last = w2;
 }
 
-struct grub2_parser *grub2_parser_create(void *ctx)
+struct grub2_parser *grub2_parser_create(struct discover_context *ctx)
 {
        struct grub2_parser *parser;
 
        parser = talloc(ctx, struct grub2_parser);
        yylex_init_extra(parser, &parser->scanner);
-       parser->script = create_script(parser);
+       parser->script = create_script(parser, ctx);
 
        return parser;
 }