-
Notifications
You must be signed in to change notification settings - Fork 0
/
Kparser.y
146 lines (120 loc) · 3.75 KB
/
Kparser.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
%{
#include "Kparser.h"
#include <assert.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int yylex(void);
void yyerror(const char *error);
#ifdef YACC_DEBUG
int yydebug = 1;
#endif
void debug_print(char *string);
%}
%union {
char *string;
long number;
enum ktype type;
struct kvalue value;
struct kconfig config;
struct kchoice choice;
struct kvariable variable;
struct krange range;
}
%start statements
%token T_CONFIG
%token T_CHOICE
%token T_DEFAULT
%token T_DEPENDS
%token T_ENDCHOICE
%token T_ENDMENU
%token T_IF
%token T_MENU
%token T_NOT
%token T_PROMPT
%token T_RANGE
%token T_SELECT
%token T_SOURCE
%token <string> T_HELP
%token <type> T_TYPE
%token <type> T_DEF_TYPE
%token <string> T_OPERATOR
%token <string> T_VARIABLE
%token <string> T_STRING
%token <number> T_INTEGER
%token <number> T_HEX_VALUE
%token <number> T_BOOL
%token <number> T_TRISTATE
%type <value> value
%type <value> default
%type <config> config
%type <choice> choice
%type <variable> variable
%type <string> prompt
%type <range> range
%left T_NOT
%%
statement : menu T_ENDMENU { ; }
| variable { ; }
;
statements : statement { ; }
| statements statement { ; }
;
menu : T_MENU prompt { ; }
| menu variable { ; }
| menu T_SOURCE T_STRING { debug_print($3); }
;
variable : choice T_ENDCHOICE { $$.type = CHOICE; $$.value.choice = $1; }
| config { $$.type = CONFIG; $$.value.config = $1; }
| variable T_VARIABLE { $$.name = $2; }
| variable prompt { $$.prompt = $2; }
| variable T_HELP { $$.help = $2; }
| variable default { $$.default_value = $2; }
| variable depends { ; }
;
choice : T_CHOICE { ; }
| choice config { ; }
| variable { assert($1.type == CHOICE); $$ = $1.value.choice; }
;
config : T_CONFIG { $$.not_flag = false; }
| config T_TYPE { $$.type = $2; }
| config T_DEF_TYPE value { $$.type = $2; $$.value = $3; }
| config T_DEF_TYPE T_NOT value { $$.type = $2; $$.value = $4; $$.not_flag = true; }
| config T_SELECT T_VARIABLE { debug_print("Implment Select"); }
| config range { $$.range = $2; }
| config T_IF T_VARIABLE { debug_print("Implement if"); }
| variable { assert($1.type == CONFIG); $$ = $1.value.config; }
;
prompt : T_PROMPT T_STRING { $$ = $2; }
| T_STRING { $$ = $1; }
;
value : T_INTEGER { $$.type = INTEGER; $$.value.number = $1; }
| T_HEX_VALUE { $$.type = HEX_VALUE; $$.value.number = $1; }
| T_STRING { $$.type = STRING; $$.value.string = $1; }
| T_BOOL { $$.type = BOOL; $$.value.number = $1; }
| T_TRISTATE { $$.type = TRISTATE; $$.value.number = $1; }
| T_VARIABLE { $$.type = VARIABLE; $$.value.string = $1; }
;
default : T_DEFAULT value { $$ = $2; }
depends : T_DEPENDS
| depends T_VARIABLE
| T_NOT depends
| depends operator
;
operator : T_OPERATOR
| T_NOT operator
| operator T_NOT
| operator T_OPERATOR
;
range : T_RANGE value value { $$.lower = $2; $$.upper = $3; }
%%
int main(void) {
return yyparse();
}
void debug_print(char *string) {
printf("%*s\n", 120, string);
}
void yyerror(const char *error) {
fprintf(stderr, "%s\n", error);
}