+void yyerror(struct grub2_parser *parser, const char *fmt, ...)
+{
+ const char *str;
+ va_list ap;
+
+ va_start(ap, fmt);
+ str = talloc_vasprintf(parser, fmt, ap);
+ va_end(ap);
+
+ pb_log("parse error: %d('%s'): %s\n", yyget_lineno(parser->scanner),
+ yyget_text(parser->scanner), str);
+}
+
+struct grub2_statements *create_statements(struct grub2_parser *parser)
+{
+ struct grub2_statements *stmts = talloc(parser,
+ struct grub2_statements);
+ list_init(&stmts->list);
+ return stmts;
+}
+
+struct grub2_statement *create_statement_simple(struct grub2_parser *parser,
+ struct grub2_argv *argv)
+{
+ struct grub2_statement_simple *stmt =
+ talloc(parser, struct grub2_statement_simple);
+ stmt->st.type = STMT_TYPE_SIMPLE;
+ stmt->st.exec = statement_simple_execute;
+ stmt->argv = argv;
+ return &stmt->st;
+}
+
+struct grub2_statement *create_statement_menuentry(struct grub2_parser *parser,
+ struct grub2_argv *argv, struct grub2_statements *stmts)
+{
+ struct grub2_statement_menuentry *stmt =
+ talloc(parser, struct grub2_statement_menuentry);
+ stmt->st.type = STMT_TYPE_MENUENTRY;
+ stmt->st.exec = statement_menuentry_execute;
+ stmt->argv = argv;
+ stmt->statements = stmts;
+ return &stmt->st;
+}
+
+struct grub2_statement *create_statement_conditional(
+ struct grub2_parser *parser,
+ struct grub2_statement *condition,
+ struct grub2_statements *statements)
+{
+ struct grub2_statement_conditional *stmt =
+ talloc(parser, struct grub2_statement_conditional);
+ stmt->st.type = STMT_TYPE_CONDITIONAL;
+ stmt->condition = condition;
+ stmt->statements = statements;
+ return &stmt->st;
+}
+
+struct grub2_statement *create_statement_if(struct grub2_parser *parser,
+ struct grub2_statement *conditional,
+ struct grub2_statements *elifs,
+ struct grub2_statements *else_case)
+{
+ struct grub2_statement_if *stmt =
+ talloc(parser, struct grub2_statement_if);
+
+ list_add(&elifs->list, &conditional->list);
+
+ stmt->st.type = STMT_TYPE_IF;
+ stmt->st.exec = statement_if_execute;
+ stmt->conditionals = elifs;
+ stmt->else_case = else_case;
+ return &stmt->st;
+}
+
+struct grub2_statement *create_statement_block(struct grub2_parser *parser,
+ struct grub2_statements *stmts)
+{
+ struct grub2_statement_block *stmt =
+ talloc(parser, struct grub2_statement_block);
+ stmt->st.type = STMT_TYPE_BLOCK;
+ stmt->st.exec = statement_block_execute;
+ stmt->statements = stmts;
+ return &stmt->st;
+}
+
+struct grub2_statement *create_statement_function(struct grub2_parser *parser,
+ struct grub2_word *name, struct grub2_statements *body)
+{
+ struct grub2_statement_function *stmt =
+ talloc(parser, struct grub2_statement_function);
+ stmt->st.exec = statement_function_execute;
+ stmt->name = name;
+ stmt->body = body;
+ 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)