X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fgrub2%2Fparser.y;h=9d79d9b9b136aeeed1abf010ffe81db568f24586;hp=8ab17a6ab50c45ca49f8ebc8d566508bf607c38e;hb=d1f814a1e310b5c1e6b32d5bdbf7b7450c221325;hpb=ffc167572a9d56c52908aebefe62ba3e3e2a9cf8 diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y index 8ab17a6..9d79d9b 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 } +%parse-param { void *scanner } %error-verbose %{ @@ -9,10 +10,6 @@ #include #include "grub2.h" -#include "parser.h" -#include "lexer.h" - -#define YYLEX_PARAM parser->scanner void yyerror(struct grub2_parser *parser, const char *fmt, ...); %} @@ -63,6 +60,10 @@ void yyerror(struct grub2_parser *parser, const char *fmt, ...); %start script %debug +%{ +#include "lexer.h" +%} + %% script: statements { @@ -129,6 +130,12 @@ statement: /* we just flatten everything */ $$ = create_statement_block(parser, $6); } + | "for" TOKEN_DELIM word TOKEN_DELIM "in" TOKEN_DELIM words TOKEN_EOL + "do" sep + statements + "done" { + $$ = create_statement_for(parser, $3, $7, $11); + } words: word { $$ = create_argv(parser); @@ -242,6 +249,19 @@ struct grub2_statement *create_statement_function(struct grub2_parser *parser, return &stmt->st; } +struct grub2_statement *create_statement_for(struct grub2_parser *parser, + struct grub2_word *var, struct grub2_argv *list, + struct grub2_statements *body) +{ + struct grub2_statement_for *stmt = + talloc(parser, struct grub2_statement_for); + stmt->st.exec = statement_for_execute; + stmt->var = var; + stmt->list = list; + stmt->body = body; + return &stmt->st; +} + void statement_append(struct grub2_statements *stmts, struct grub2_statement *stmt) { @@ -303,14 +323,21 @@ struct grub2_parser *grub2_parser_create(struct discover_context *ctx) return parser; } -void grub2_parser_parse(struct grub2_parser *parser, char *buf, int len) +void grub2_parser_parse(struct grub2_parser *parser, const char *filename, + char *buf, int len) { YY_BUFFER_STATE bufstate; int rc; + if (!len) + return; + + parser->script->filename = filename; + bufstate = yy_scan_bytes(buf, len - 1, parser->scanner); + yyset_lineno(1, parser->scanner); - rc = yyparse(parser); + rc = yyparse(parser, parser->scanner); yy_delete_buffer(bufstate, parser->scanner);