discover/grub2: Add structures & API for 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 grub2_word *word;
18 }
19
20 /* reserved words */
21 %token  TOKEN_LDSQBRACKET       "[["
22 %token  TOKEN_RDSQBRACKET       "]]"
23 %token  TOKEN_CASE              "case"
24 %token  TOKEN_DO                "do"
25 %token  TOKEN_DONE              "done"
26 %token  TOKEN_ELIF              "elif"
27 %token  TOKEN_ESAC              "esac"
28 %token  TOKEN_FI                "fi"
29 %token  TOKEN_FOR               "for"
30 %token  TOKEN_FUNCTION          "function"
31 %token  TOKEN_IF                "if"
32 %token  TOKEN_IN                "in"
33 %token  TOKEN_MENUENTRY         "menuentry"
34 %token  TOKEN_SELECT            "select"
35 %token  TOKEN_THEN              "then"
36 %token  TOKEN_TIME              "time"
37 %token  TOKEN_UTIL              "until"
38 %token  TOKEN_WHILE             "while"
39
40 /* syntax */
41 %token  TOKEN_EOL
42 %token  TOKEN_DELIM
43 %token  TOKEN_WORD
44
45 %start  script
46 %debug
47
48 %%
49
50 script: statements
51         ;
52
53 statements: statement
54         | statements statement
55         ;
56
57 statement: TOKEN_EOL
58         | words TOKEN_EOL
59         | '{' statements '}'
60         | "if" TOKEN_DELIM statement
61                 "then" TOKEN_EOL
62                 statements
63                 "fi" TOKEN_EOL
64         | "menuentry" TOKEN_DELIM words TOKEN_DELIM
65                 '{' statements '}'
66                 TOKEN_EOL
67         ;
68
69 words:  | word
70         | words TOKEN_DELIM word
71         ;
72
73 word:   TOKEN_WORD
74         | word TOKEN_WORD
75         ;
76
77 %%
78 void yyerror(struct grub2_parser *parser, char const *s)
79 {
80         fprintf(stderr, "%d: error: %s '%s'\n",
81                         yyget_lineno(parser->scanner),
82                         s, yyget_text(parser->scanner));
83 }