discover/grub2: Implement parser
[petitboot] / discover / grub2 / parser.y
1
2 %pure-parser
3 %lex-param { yyscan_t scanner }
4 %parse-param { struct grub2_parser *parser }
5
6 %{
7 #include "grub2.h"
8 #include "parser.h"
9 #include "lexer.h"
10
11 #define YYLEX_PARAM parser->scanner
12
13 static void yyerror(struct grub2_parser *, char const *s);
14 %}
15
16 %union {
17         struct {
18                 char    *strval;
19                 int     expand;
20                 int     split;
21         };
22 }
23
24 /* reserved words */
25 %token  TOKEN_LDSQBRACKET       "[["
26 %token  TOKEN_RDSQBRACKET       "]]"
27 %token  TOKEN_CASE              "case"
28 %token  TOKEN_DO                "do"
29 %token  TOKEN_DONE              "done"
30 %token  TOKEN_ELIF              "elif"
31 %token  TOKEN_ESAC              "esac"
32 %token  TOKEN_FI                "fi"
33 %token  TOKEN_FOR               "for"
34 %token  TOKEN_FUNCTION          "function"
35 %token  TOKEN_IF                "if"
36 %token  TOKEN_IN                "in"
37 %token  TOKEN_MENUENTRY         "menuentry"
38 %token  TOKEN_SELECT            "select"
39 %token  TOKEN_THEN              "then"
40 %token  TOKEN_TIME              "time"
41 %token  TOKEN_UTIL              "until"
42 %token  TOKEN_WHILE             "while"
43
44 /* syntax */
45 %token  TOKEN_EOL
46 %token  TOKEN_DELIM
47 %token  TOKEN_WORD
48
49 %start  script
50 %debug
51
52 %%
53
54 script: statements
55         ;
56
57 statements: statement
58         | statements statement
59         ;
60
61 statement: TOKEN_EOL
62         | words TOKEN_EOL
63         | '{' statements '}'
64         | "if" TOKEN_DELIM statement
65                 "then" TOKEN_EOL
66                 statements
67                 "fi" TOKEN_EOL
68         | "menuentry" TOKEN_DELIM words TOKEN_DELIM
69                 '{' statements '}'
70                 TOKEN_EOL
71         ;
72
73 words:  | word
74         | words TOKEN_DELIM word
75         ;
76
77 word:   TOKEN_WORD
78         | word TOKEN_WORD
79         ;
80
81 %%
82 void yyerror(struct grub2_parser *parser, char const *s)
83 {
84         fprintf(stderr, "%d: error: %s '%s'\n",
85                         yyget_lineno(parser->scanner),
86                         s, yyget_text(parser->scanner));
87 }