summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-09-10 14:04:41 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-09-24 13:14:59 +0800
commit2013dd8075a57e5399f080fa8094cc4b464f35cd (patch)
treef55d4ae334bdb2f5ff4a219afa397ca7f0a925ce
parent0ac0cc8dbd8c3687880f3115ae41f9903e9f2333 (diff)
downloadtalos-petitboot-2013dd8075a57e5399f080fa8094cc4b464f35cd.tar.gz
talos-petitboot-2013dd8075a57e5399f080fa8094cc4b464f35cd.zip
discover/grub2: Implement parser
Add our simple parser to handle a grub2 script. Since we're not building a parse tree at the moment (we have no reduce rules), we just have a simple word-based %union for our tokens. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--discover/grub2/parser.y40
1 files changed, 39 insertions, 1 deletions
diff --git a/discover/grub2/parser.y b/discover/grub2/parser.y
index 2af2132..dbdde51 100644
--- a/discover/grub2/parser.y
+++ b/discover/grub2/parser.y
@@ -4,7 +4,13 @@
%parse-param { struct grub2_parser *parser }
%{
+#include "grub2.h"
+#include "parser.h"
#include "lexer.h"
+
+#define YYLEX_PARAM parser->scanner
+
+static void yyerror(struct grub2_parser *, char const *s);
%}
%union {
@@ -41,9 +47,41 @@
%token TOKEN_WORD
%start script
+%debug
%%
-script: /* empty */
+script: statements
+ ;
+
+statements: statement
+ | statements statement
+ ;
+
+statement: TOKEN_EOL
+ | words TOKEN_EOL
+ | '{' statements '}'
+ | "if" TOKEN_DELIM statement
+ "then" TOKEN_EOL
+ statements
+ "fi" TOKEN_EOL
+ | "menuentry" TOKEN_DELIM words TOKEN_DELIM
+ '{' statements '}'
+ TOKEN_EOL
+ ;
+
+words: | word
+ | words TOKEN_DELIM word
+ ;
+
+word: TOKEN_WORD
+ | word TOKEN_WORD
+ ;
%%
+void yyerror(struct grub2_parser *parser, char const *s)
+{
+ fprintf(stderr, "%d: error: %s '%s'\n",
+ yyget_lineno(parser->scanner),
+ s, yyget_text(parser->scanner));
+}
OpenPOWER on IntegriCloud