X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Fparser.y;h=550c3748df70c0ec1a3636a3f2fc0e242e19e9ef;hp=2b229b80598ae63488bd17b0810f0d7f89e26198;hb=d808f5d2ec8e232d736a5f811d647df91e2a5b43;hpb=f465fcee178cfb5a5e076297ea7dd49102f7e8b9 diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index 2b229b8..550c374 100644 --- a/discover/grub2/parser.y +++ b/discover/grub2/parser.y @@ -2,6 +2,7 @@ %pure-parser %lex-param { yyscan_t scanner } %parse-param { struct grub2_parser *parser } +%error-verbose %{ #include @@ -29,6 +30,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 +87,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 { @@ -235,13 +245,15 @@ struct grub2_parser *grub2_parser_create(struct discover_context *ctx) void grub2_parser_parse(struct grub2_parser *parser, char *buf, int len) { YY_BUFFER_STATE bufstate; + int rc; bufstate = yy_scan_bytes(buf, len - 1, parser->scanner); - yyparse(parser); + rc = yyparse(parser); yy_delete_buffer(bufstate, parser->scanner); - script_execute(parser->script); + if (!rc) + script_execute(parser->script); }