Blame view

scripts/kconfig/parser.y 15.3 KB
0c8741001   Masahiro Yamada   kconfig: convert ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
  /*
   * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
   */
0c8741001   Masahiro Yamada   kconfig: convert ...
5
  %{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
  
  #include <ctype.h>
  #include <stdarg.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <stdbool.h>
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
13
  #include "lkc.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
  #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
  
  #define PRINTD		0x0001
  #define DEBUG_PARSE	0x0002
  
  int cdebug = PRINTD;
765f4cdef   Masahiro Yamada   kconfig: use defa...
20
  static void yyerror(const char *err);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  static void zconfprint(const char *err, ...);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
22
  static void zconf_error(const char *err, ...);
caaebb3c6   Masahiro Yamada   kconfig: refactor...
23
24
  static bool zconf_endtoken(const char *tokenname,
  			   const char *expected_tokenname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25

e66f25d7d   Andi Kleen   Improve kconfig s...
26
  struct symbol *symbol_hash[SYMBOL_HASHSIZE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
  
  static struct menu *current_menu, *current_entry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  %}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
  
  %union
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
  	char *string;
  	struct symbol *symbol;
  	struct expr *expr;
  	struct menu *menu;
3c8f317d4   Masahiro Yamada   kconfig: use dist...
37
  	enum symbol_type type;
1175c0250   Masahiro Yamada   kconfig: support ...
38
  	enum variable_flavor flavor;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  %token <string> T_HELPTEXT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
  %token <string> T_WORD
  %token <string> T_WORD_QUOTE
ce2164ab5   Masahiro Yamada   kconfig: refactor...
43
  %token T_ALLNOCONFIG_Y
3c8f317d4   Masahiro Yamada   kconfig: use dist...
44
  %token T_BOOL
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
45
  %token T_CHOICE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  %token T_CLOSE_PAREN
c3d228713   Masahiro Yamada   kconfig: use spec...
47
  %token T_COLON_EQUAL
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
48
49
  %token T_COMMENT
  %token T_CONFIG
3c8f317d4   Masahiro Yamada   kconfig: use dist...
50
  %token T_DEFAULT
ce2164ab5   Masahiro Yamada   kconfig: refactor...
51
  %token T_DEFCONFIG_LIST
3c8f317d4   Masahiro Yamada   kconfig: use dist...
52
53
  %token T_DEF_BOOL
  %token T_DEF_TRISTATE
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
54
55
56
57
58
  %token T_DEPENDS
  %token T_ENDCHOICE
  %token T_ENDIF
  %token T_ENDMENU
  %token T_HELP
3c8f317d4   Masahiro Yamada   kconfig: use dist...
59
  %token T_HEX
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
60
61
  %token T_IF
  %token T_IMPLY
3c8f317d4   Masahiro Yamada   kconfig: use dist...
62
  %token T_INT
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
63
64
65
  %token T_MAINMENU
  %token T_MENU
  %token T_MENUCONFIG
ce2164ab5   Masahiro Yamada   kconfig: refactor...
66
  %token T_MODULES
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
67
  %token T_ON
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  %token T_OPEN_PAREN
ce2164ab5   Masahiro Yamada   kconfig: refactor...
69
  %token T_OPTION
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
70
  %token T_OPTIONAL
c3d228713   Masahiro Yamada   kconfig: use spec...
71
  %token T_PLUS_EQUAL
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
72
73
74
75
  %token T_PROMPT
  %token T_RANGE
  %token T_SELECT
  %token T_SOURCE
3c8f317d4   Masahiro Yamada   kconfig: use dist...
76
77
  %token T_STRING
  %token T_TRISTATE
b3d1d9d3c   Masahiro Yamada   kconfig: stop ass...
78
  %token T_VISIBLE
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
79
  %token T_EOL
9ced3bdde   Masahiro Yamada   kconfig: support ...
80
  %token <string> T_ASSIGN_VAL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
  
  %left T_OR
  %left T_AND
  %left T_EQUAL T_UNEQUAL
31847b67b   Jan Beulich   kconfig: allow us...
85
  %left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
  %nonassoc T_NOT
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
87
  %type <symbol> nonconst_symbol
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
  %type <symbol> symbol
3c8f317d4   Masahiro Yamada   kconfig: use dist...
89
  %type <type> type logic_type default
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
  %type <expr> expr
  %type <expr> if_expr
caaebb3c6   Masahiro Yamada   kconfig: refactor...
92
  %type <string> end
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
93
  %type <menu> if_entry menu_entry choice_entry
ce2164ab5   Masahiro Yamada   kconfig: refactor...
94
  %type <string> word_opt assign_val
c3d228713   Masahiro Yamada   kconfig: use spec...
95
  %type <flavor> assign_op
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
96
97
98
99
100
101
102
103
  
  %destructor {
  	fprintf(stderr, "%s:%d: missing end statement for this entry
  ",
  		$$->file->name, $$->lineno);
  	if (current_menu == $$)
  		menu_end_menu();
  } if_entry menu_entry choice_entry
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  %%
cc66bca77   Masahiro Yamada   kconfig: fix ambi...
106
  input: mainmenu_stmt stmt_list | stmt_list;
0724a7c32   Ulf Magnusson   kconfig: Don't le...
107
108
  
  /* mainmenu entry */
1be6e7913   Masahiro Yamada   kconfig: remove '...
109
  mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL
0724a7c32   Ulf Magnusson   kconfig: Don't le...
110
111
112
  {
  	menu_add_prompt(P_MENU, $2, NULL);
  };
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
113
114
  stmt_list:
  	  /* empty */
09d5873e4   Masahiro Yamada   kconfig: allow on...
115
  	| stmt_list assignment_stmt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
116
  	| stmt_list choice_stmt
09d5873e4   Masahiro Yamada   kconfig: allow on...
117
118
119
  	| stmt_list comment_stmt
  	| stmt_list config_stmt
  	| stmt_list if_stmt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
120
  	| stmt_list menu_stmt
09d5873e4   Masahiro Yamada   kconfig: allow on...
121
122
  	| stmt_list menuconfig_stmt
  	| stmt_list source_stmt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
123
  	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); }
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
124
  	| stmt_list error T_EOL		{ zconf_error("invalid statement"); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
  ;
09d5873e4   Masahiro Yamada   kconfig: allow on...
126
127
128
129
130
131
  stmt_list_in_choice:
  	  /* empty */
  	| stmt_list_in_choice comment_stmt
  	| stmt_list_in_choice config_stmt
  	| stmt_list_in_choice if_stmt_in_choice
  	| stmt_list_in_choice error T_EOL	{ zconf_error("invalid statement"); }
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
132
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  /* config/menuconfig entry */
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
134
  config_entry_start: T_CONFIG nonconst_symbol T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
  {
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
136
137
138
139
  	$2->flags |= SYMBOL_OPTIONAL;
  	menu_add_entry($2);
  	printd(DEBUG_PARSE, "%s:%d:config %s
  ", zconf_curname(), zconf_lineno(), $2->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
142
143
  };
  
  config_stmt: config_entry_start config_option_list
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
146
  	printd(DEBUG_PARSE, "%s:%d:endconfig
  ", zconf_curname(), zconf_lineno());
  };
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
147
  menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  {
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
149
150
151
152
  	$2->flags |= SYMBOL_OPTIONAL;
  	menu_add_entry($2);
  	printd(DEBUG_PARSE, "%s:%d:menuconfig %s
  ", zconf_curname(), zconf_lineno(), $2->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
157
158
159
160
  };
  
  menuconfig_stmt: menuconfig_entry_start config_option_list
  {
  	if (current_entry->prompt)
  		current_entry->prompt->type = P_MENU;
  	else
  		zconfprint("warning: menuconfig statement without prompt");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
164
165
166
167
168
169
  	printd(DEBUG_PARSE, "%s:%d:endconfig
  ", zconf_curname(), zconf_lineno());
  };
  
  config_option_list:
  	  /* empty */
  	| config_option_list config_option
  	| config_option_list depends
  	| config_option_list help
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  ;
3c8f317d4   Masahiro Yamada   kconfig: use dist...
171
  config_option: type prompt_stmt_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
  {
3c8f317d4   Masahiro Yamada   kconfig: use dist...
173
  	menu_set_type($1);
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
174
175
176
  	printd(DEBUG_PARSE, "%s:%d:type(%u)
  ",
  		zconf_curname(), zconf_lineno(),
3c8f317d4   Masahiro Yamada   kconfig: use dist...
177
  		$1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  };
1be6e7913   Masahiro Yamada   kconfig: remove '...
179
  config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
184
  {
  	menu_add_prompt(P_PROMPT, $2, $3);
  	printd(DEBUG_PARSE, "%s:%d:prompt
  ", zconf_curname(), zconf_lineno());
  };
3c8f317d4   Masahiro Yamada   kconfig: use dist...
185
  config_option: default expr if_expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
  {
  	menu_add_expr(P_DEFAULT, $2, $3);
3c8f317d4   Masahiro Yamada   kconfig: use dist...
188
189
  	if ($1 != S_UNKNOWN)
  		menu_set_type($1);
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
190
191
192
  	printd(DEBUG_PARSE, "%s:%d:default(%u)
  ",
  		zconf_curname(), zconf_lineno(),
3c8f317d4   Masahiro Yamada   kconfig: use dist...
193
  		$1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  };
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
195
  config_option: T_SELECT nonconst_symbol if_expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
  {
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
197
  	menu_add_symbol(P_SELECT, $2, $3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
  	printd(DEBUG_PARSE, "%s:%d:select
  ", zconf_curname(), zconf_lineno());
  };
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
201
  config_option: T_IMPLY nonconst_symbol if_expr T_EOL
237e3ad0f   Nicolas Pitre   Kconfig: Introduc...
202
  {
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
203
  	menu_add_symbol(P_IMPLY, $2, $3);
237e3ad0f   Nicolas Pitre   Kconfig: Introduc...
204
205
206
  	printd(DEBUG_PARSE, "%s:%d:imply
  ", zconf_curname(), zconf_lineno());
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
209
210
211
212
  config_option: T_RANGE symbol symbol if_expr T_EOL
  {
  	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
  	printd(DEBUG_PARSE, "%s:%d:range
  ", zconf_curname(), zconf_lineno());
  };
ce2164ab5   Masahiro Yamada   kconfig: refactor...
213
214
215
216
  config_option: T_OPTION T_MODULES T_EOL
  {
  	menu_add_option_modules();
  };
f6a88aa86   Roman Zippel   kconfig: add symb...
217

ce2164ab5   Masahiro Yamada   kconfig: refactor...
218
  config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
f6a88aa86   Roman Zippel   kconfig: add symb...
219
  {
ce2164ab5   Masahiro Yamada   kconfig: refactor...
220
  	menu_add_option_defconfig_list();
f6a88aa86   Roman Zippel   kconfig: add symb...
221
  };
ce2164ab5   Masahiro Yamada   kconfig: refactor...
222
223
224
225
  config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
  {
  	menu_add_option_allnoconfig_y();
  };
f6a88aa86   Roman Zippel   kconfig: add symb...
226

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
  /* choice entry */
5a1aa8a1a   Roman Zippel   kconfig: add name...
228
  choice: T_CHOICE word_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
  {
5a1aa8a1a   Roman Zippel   kconfig: add name...
230
  	struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
693359f7a   Dirk Gouders   kconfig: rename S...
231
  	sym->flags |= SYMBOL_NO_WRITE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
233
  	menu_add_entry(sym);
  	menu_add_expr(P_CHOICE, NULL, NULL);
bf0bbdcf1   Masahiro Yamada   kconfig: Don't le...
234
  	free($2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
238
239
240
  	printd(DEBUG_PARSE, "%s:%d:choice
  ", zconf_curname(), zconf_lineno());
  };
  
  choice_entry: choice choice_option_list
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
241
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
244
245
  };
  
  choice_end: end
  {
caaebb3c6   Masahiro Yamada   kconfig: refactor...
246
  	if (zconf_endtoken($1, "choice")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
248
249
250
251
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endchoice
  ", zconf_curname(), zconf_lineno());
  	}
  };
09d5873e4   Masahiro Yamada   kconfig: allow on...
252
  choice_stmt: choice_entry stmt_list_in_choice choice_end
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
253
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
256
257
258
259
  
  choice_option_list:
  	  /* empty */
  	| choice_option_list choice_option
  	| choice_option_list depends
  	| choice_option_list help
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
  ;
1be6e7913   Masahiro Yamada   kconfig: remove '...
261
  choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
263
264
265
266
  {
  	menu_add_prompt(P_PROMPT, $2, $3);
  	printd(DEBUG_PARSE, "%s:%d:prompt
  ", zconf_curname(), zconf_lineno());
  };
3c8f317d4   Masahiro Yamada   kconfig: use dist...
267
  choice_option: logic_type prompt_stmt_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
  {
3c8f317d4   Masahiro Yamada   kconfig: use dist...
269
270
271
272
  	menu_set_type($1);
  	printd(DEBUG_PARSE, "%s:%d:type(%u)
  ",
  	       zconf_curname(), zconf_lineno(), $1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
275
276
277
278
279
280
  };
  
  choice_option: T_OPTIONAL T_EOL
  {
  	current_entry->sym->flags |= SYMBOL_OPTIONAL;
  	printd(DEBUG_PARSE, "%s:%d:optional
  ", zconf_curname(), zconf_lineno());
  };
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
281
  choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  {
3c8f317d4   Masahiro Yamada   kconfig: use dist...
283
284
285
286
  	menu_add_symbol(P_DEFAULT, $2, $3);
  	printd(DEBUG_PARSE, "%s:%d:default
  ",
  	       zconf_curname(), zconf_lineno());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  };
3c8f317d4   Masahiro Yamada   kconfig: use dist...
288
289
290
291
292
293
294
295
296
297
298
299
300
301
  type:
  	  logic_type
  	| T_INT			{ $$ = S_INT; }
  	| T_HEX			{ $$ = S_HEX; }
  	| T_STRING		{ $$ = S_STRING; }
  
  logic_type:
  	  T_BOOL		{ $$ = S_BOOLEAN; }
  	| T_TRISTATE		{ $$ = S_TRISTATE; }
  
  default:
  	  T_DEFAULT		{ $$ = S_UNKNOWN; }
  	| T_DEF_BOOL		{ $$ = S_BOOLEAN; }
  	| T_DEF_TRISTATE	{ $$ = S_TRISTATE; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  /* if entry */
b2d00d7c6   Dirk Gouders   kconfig: fix line...
303
  if_entry: T_IF expr T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
306
307
308
  {
  	printd(DEBUG_PARSE, "%s:%d:if
  ", zconf_curname(), zconf_lineno());
  	menu_add_entry(NULL);
  	menu_add_dep($2);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
309
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
312
313
  };
  
  if_end: end
  {
caaebb3c6   Masahiro Yamada   kconfig: refactor...
314
  	if (zconf_endtoken($1, "if")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
318
319
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endif
  ", zconf_curname(), zconf_lineno());
  	}
  };
4891796c6   Masahiro Yamada   kconfig: remove r...
320
  if_stmt: if_entry stmt_list if_end
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
  ;
09d5873e4   Masahiro Yamada   kconfig: allow on...
322
323
  if_stmt_in_choice: if_entry stmt_list_in_choice if_end
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
  /* menu entry */
1be6e7913   Masahiro Yamada   kconfig: remove '...
325
  menu: T_MENU T_WORD_QUOTE T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  {
  	menu_add_entry(NULL);
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
328
  	menu_add_prompt(P_MENU, $2, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
331
  	printd(DEBUG_PARSE, "%s:%d:menu
  ", zconf_curname(), zconf_lineno());
  };
1f31be9ec   Masahiro Yamada   kconfig: loosen t...
332
  menu_entry: menu menu_option_list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
334
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
336
337
338
  };
  
  menu_end: end
  {
caaebb3c6   Masahiro Yamada   kconfig: refactor...
339
  	if (zconf_endtoken($1, "menu")) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
341
342
343
344
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endmenu
  ", zconf_curname(), zconf_lineno());
  	}
  };
94d4e1b60   Masahiro Yamada   kconfig: remove r...
345
  menu_stmt: menu_entry stmt_list menu_end
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
  ;
1f31be9ec   Masahiro Yamada   kconfig: loosen t...
347
348
349
350
351
  menu_option_list:
  	  /* empty */
  	| menu_option_list visible
  	| menu_option_list depends
  ;
1be6e7913   Masahiro Yamada   kconfig: remove '...
352
  source_stmt: T_SOURCE T_WORD_QUOTE T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
  	printd(DEBUG_PARSE, "%s:%d:source %s
  ", zconf_curname(), zconf_lineno(), $2);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
356
  	zconf_nextfile($2);
24161a671   Ulf Magnusson   kconfig: Don't le...
357
  	free($2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
  };
  
  /* comment entry */
1be6e7913   Masahiro Yamada   kconfig: remove '...
361
  comment: T_COMMENT T_WORD_QUOTE T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
  {
  	menu_add_entry(NULL);
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
364
  	menu_add_prompt(P_COMMENT, $2, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
366
367
  	printd(DEBUG_PARSE, "%s:%d:comment
  ", zconf_curname(), zconf_lineno());
  };
4b5ec81bf   Masahiro Yamada   kconfig: rename d...
368
369
370
371
372
373
  comment_stmt: comment comment_option_list
  ;
  
  comment_option_list:
  	  /* empty */
  	| comment_option_list depends
df60f4b92   Ulf Magnusson   kconfig: Remove m...
374
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
376
377
378
379
380
381
382
383
384
385
386
  
  /* help option */
  
  help_start: T_HELP T_EOL
  {
  	printd(DEBUG_PARSE, "%s:%d:help
  ", zconf_curname(), zconf_lineno());
  	zconf_starthelp();
  };
  
  help: help_start T_HELPTEXT
  {
6479f327d   Ulf Magnusson   kconfig: Warn if ...
387
388
389
390
391
  	if (current_entry->help) {
  		free(current_entry->help);
  		zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
  			   current_entry->sym->name ?: "<choice>");
  	}
1b9eda2e4   Ulf Magnusson   kconfig: Warn if ...
392
393
394
395
396
397
  
  	/* Is the help text empty or all whitespace? */
  	if ($2[strspn($2, " \f
  \r\t\v")] == '\0')
  		zconfprint("warning: '%s' defined with blank help text",
  			   current_entry->sym->name ?: "<choice>");
03d291227   Sam Ravnborg   kconfig: attach h...
398
  	current_entry->help = $2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
399
400
401
  };
  
  /* depends option */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402
403
404
405
406
  depends: T_DEPENDS T_ON expr T_EOL
  {
  	menu_add_dep($3);
  	printd(DEBUG_PARSE, "%s:%d:depends on
  ", zconf_curname(), zconf_lineno());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
  };
86e187ff9   Arnaud Lacombe   kconfig: add an o...
408
  /* visibility option */
413cd19d8   Masahiro Yamada   kconfig: require ...
409
  visible: T_VISIBLE if_expr T_EOL
86e187ff9   Arnaud Lacombe   kconfig: add an o...
410
411
412
  {
  	menu_add_visibility($2);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
415
416
  /* prompt statement */
  
  prompt_stmt_opt:
  	  /* empty */
1be6e7913   Masahiro Yamada   kconfig: remove '...
417
  	| T_WORD_QUOTE if_expr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
  {
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
419
  	menu_add_prompt(P_PROMPT, $1, $2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
  };
caaebb3c6   Masahiro Yamada   kconfig: refactor...
421
422
423
  end:	  T_ENDMENU T_EOL	{ $$ = "menu"; }
  	| T_ENDCHOICE T_EOL	{ $$ = "choice"; }
  	| T_ENDIF T_EOL		{ $$ = "if"; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
426
427
428
429
  if_expr:  /* empty */			{ $$ = NULL; }
  	| T_IF expr			{ $$ = $2; }
  ;
  
  expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
31847b67b   Jan Beulich   kconfig: allow us...
430
431
432
433
  	| symbol T_LESS symbol			{ $$ = expr_alloc_comp(E_LTH, $1, $3); }
  	| symbol T_LESS_EQUAL symbol		{ $$ = expr_alloc_comp(E_LEQ, $1, $3); }
  	| symbol T_GREATER symbol		{ $$ = expr_alloc_comp(E_GTH, $1, $3); }
  	| symbol T_GREATER_EQUAL symbol		{ $$ = expr_alloc_comp(E_GEQ, $1, $3); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
435
436
437
438
439
440
  	| symbol T_EQUAL symbol			{ $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
  	| symbol T_UNEQUAL symbol		{ $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
  	| T_OPEN_PAREN expr T_CLOSE_PAREN	{ $$ = $2; }
  	| T_NOT expr				{ $$ = expr_alloc_one(E_NOT, $2); }
  	| expr T_OR expr			{ $$ = expr_alloc_two(E_OR, $1, $3); }
  	| expr T_AND expr			{ $$ = expr_alloc_two(E_AND, $1, $3); }
  ;
26e47a3c1   Ulf Magnusson   kconfig: Don't le...
441
442
443
444
  /* For symbol definitions, selects, etc., where quotes are not accepted */
  nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
  
  symbol:	  nonconst_symbol
5a1aa8a1a   Roman Zippel   kconfig: add name...
445
  	| T_WORD_QUOTE	{ $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
  ;
5a1aa8a1a   Roman Zippel   kconfig: add name...
447
448
  word_opt: /* empty */			{ $$ = NULL; }
  	| T_WORD
9ced3bdde   Masahiro Yamada   kconfig: support ...
449
  /* assignment statement */
171a515d0   Masahiro Yamada   kconfig: use T_WO...
450
  assignment_stmt:  T_WORD assign_op assign_val T_EOL	{ variable_add($1, $3, $2); free($1); free($3); }
c3d228713   Masahiro Yamada   kconfig: use spec...
451
452
453
454
455
456
  
  assign_op:
  	  T_EQUAL	{ $$ = VAR_RECURSIVE; }
  	| T_COLON_EQUAL	{ $$ = VAR_SIMPLE; }
  	| T_PLUS_EQUAL	{ $$ = VAR_APPEND; }
  ;
9ced3bdde   Masahiro Yamada   kconfig: support ...
457
458
459
460
461
  
  assign_val:
  	/* empty */		{ $$ = xstrdup(""); };
  	| T_ASSIGN_VAL
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
463
464
465
466
467
468
469
  %%
  
  void conf_parse(const char *name)
  {
  	struct symbol *sym;
  	int i;
  
  	zconf_initscan(name);
692d97c38   nir.tzachar@gmail.com   kconfig: new conf...
470
  	_menu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
471

a02f0570a   Roman Zippel   [PATCH] kconfig: ...
472
  	if (getenv("ZCONF_DEBUG"))
765f4cdef   Masahiro Yamada   kconfig: use defa...
473
474
  		yydebug = 1;
  	yyparse();
9ced3bdde   Masahiro Yamada   kconfig: support ...
475
476
477
  
  	/* Variables are expanded in the parse phase. We can free them here. */
  	variable_all_del();
765f4cdef   Masahiro Yamada   kconfig: use defa...
478
  	if (yynerrs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479
  		exit(1);
6902dccfd   Yann E. MORIN   kconfig: do not s...
480
481
  	if (!modules_sym)
  		modules_sym = sym_find( "n" );
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
482

96d8e48da   Masahiro Yamada   kconfig: remove s...
483
484
  	if (!menu_has_prompt(&rootmenu)) {
  		current_entry = &rootmenu;
137c0118a   Masahiro Yamada   kconfig: make def...
485
  		menu_add_prompt(P_MENU, "Main menu", NULL);
96d8e48da   Masahiro Yamada   kconfig: remove s...
486
  	}
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
487

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
489
  	menu_finalize(&rootmenu);
  	for_all_symbols(i, sym) {
5447d34b0   Sam Ravnborg   kconfig: error ou...
490
  		if (sym_check_deps(sym))
765f4cdef   Masahiro Yamada   kconfig: use defa...
491
  			yynerrs++;
bb66fc671   Masahiro Yamada   kbuild: trivial -...
492
  	}
765f4cdef   Masahiro Yamada   kconfig: use defa...
493
  	if (yynerrs)
5447d34b0   Sam Ravnborg   kconfig: error ou...
494
  		exit(1);
bfc10001b   Karsten Wiese   [PATCH] kconfig: ...
495
  	sym_set_change_count(1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
  }
caaebb3c6   Masahiro Yamada   kconfig: refactor...
497
498
  static bool zconf_endtoken(const char *tokenname,
  			   const char *expected_tokenname)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499
  {
caaebb3c6   Masahiro Yamada   kconfig: refactor...
500
  	if (strcmp(tokenname, expected_tokenname)) {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
501
  		zconf_error("unexpected '%s' within %s block",
caaebb3c6   Masahiro Yamada   kconfig: refactor...
502
  			    tokenname, expected_tokenname);
765f4cdef   Masahiro Yamada   kconfig: use defa...
503
  		yynerrs++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
504
505
506
  		return false;
  	}
  	if (current_menu->file != current_file) {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
507
  		zconf_error("'%s' in different file than '%s'",
caaebb3c6   Masahiro Yamada   kconfig: refactor...
508
  			    tokenname, expected_tokenname);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
509
510
511
  		fprintf(stderr, "%s:%d: location of the '%s'
  ",
  			current_menu->file->name, current_menu->lineno,
caaebb3c6   Masahiro Yamada   kconfig: refactor...
512
  			expected_tokenname);
765f4cdef   Masahiro Yamada   kconfig: use defa...
513
  		yynerrs++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
514
515
516
517
518
519
520
521
  		return false;
  	}
  	return true;
  }
  
  static void zconfprint(const char *err, ...)
  {
  	va_list ap;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
522
523
524
525
526
527
528
529
530
531
532
  	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
  	va_start(ap, err);
  	vfprintf(stderr, err, ap);
  	va_end(ap);
  	fprintf(stderr, "
  ");
  }
  
  static void zconf_error(const char *err, ...)
  {
  	va_list ap;
765f4cdef   Masahiro Yamada   kconfig: use defa...
533
  	yynerrs++;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
534
  	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
537
538
539
540
  	va_start(ap, err);
  	vfprintf(stderr, err, ap);
  	va_end(ap);
  	fprintf(stderr, "
  ");
  }
765f4cdef   Masahiro Yamada   kconfig: use defa...
541
  static void yyerror(const char *err)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
543
544
545
  {
  	fprintf(stderr, "%s:%d: %s
  ", zconf_curname(), zconf_lineno() + 1, err);
  }
651665718   Josh Triplett   kconfig: Mark var...
546
  static void print_quoted_string(FILE *out, const char *str)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
  {
  	const char *p;
  	int len;
  
  	putc('"', out);
  	while ((p = strchr(str, '"'))) {
  		len = p - str;
  		if (len)
  			fprintf(out, "%.*s", len, str);
  		fputs("\\\"", out);
  		str = p + 1;
  	}
  	fputs(str, out);
  	putc('"', out);
  }
651665718   Josh Triplett   kconfig: Mark var...
562
  static void print_symbol(FILE *out, struct menu *menu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563
564
565
566
567
  {
  	struct symbol *sym = menu->sym;
  	struct property *prop;
  
  	if (sym_is_choice(sym))
c6ccc30fd   Li Zefan   kconfig: fix zcon...
568
569
570
  		fprintf(out, "
  choice
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571
  	else
c6ccc30fd   Li Zefan   kconfig: fix zcon...
572
573
574
  		fprintf(out, "
  config %s
  ", sym->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
576
  	switch (sym->type) {
  	case S_BOOLEAN:
b92d804a5   Masahiro Yamada   kconfig: drop 'bo...
577
578
  		fputs("  bool
  ", out);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
  		break;
  	case S_TRISTATE:
  		fputs("  tristate
  ", out);
  		break;
  	case S_STRING:
  		fputs("  string
  ", out);
  		break;
  	case S_INT:
  		fputs("  integer
  ", out);
  		break;
  	case S_HEX:
  		fputs("  hex
  ", out);
  		break;
  	default:
  		fputs("  ???
  ", out);
  		break;
  	}
  	for (prop = sym->prop; prop; prop = prop->next) {
  		if (prop->menu != menu)
  			continue;
  		switch (prop->type) {
  		case P_PROMPT:
  			fputs("  prompt ", out);
  			print_quoted_string(out, prop->text);
  			if (!expr_is_yes(prop->visible.expr)) {
  				fputs(" if ", out);
  				expr_fprint(prop->visible.expr, out);
  			}
  			fputc('
  ', out);
  			break;
  		case P_DEFAULT:
  			fputs( "  default ", out);
  			expr_fprint(prop->expr, out);
  			if (!expr_is_yes(prop->visible.expr)) {
  				fputs(" if ", out);
  				expr_fprint(prop->visible.expr, out);
  			}
  			fputc('
  ', out);
  			break;
  		case P_CHOICE:
  			fputs("  #choice value
  ", out);
  			break;
c6ccc30fd   Li Zefan   kconfig: fix zcon...
629
630
631
632
633
634
  		case P_SELECT:
  			fputs( "  select ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
237e3ad0f   Nicolas Pitre   Kconfig: Introduc...
635
636
637
638
639
640
  		case P_IMPLY:
  			fputs( "  imply ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
c6ccc30fd   Li Zefan   kconfig: fix zcon...
641
642
643
644
645
646
647
648
649
650
651
652
  		case P_RANGE:
  			fputs( "  range ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
  		case P_MENU:
  			fputs( "  menu ", out);
  			print_quoted_string(out, prop->text);
  			fputc('
  ', out);
  			break;
ecd53ac2f   Dirk Gouders   kconfig: handle P...
653
654
  		case P_SYMBOL:
  			fputs( "  symbol ", out);
6397d96ba   Masahiro Yamada   kconfig: remove s...
655
656
  			fprintf(out, "%s
  ", prop->menu->sym->name);
ecd53ac2f   Dirk Gouders   kconfig: handle P...
657
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658
659
660
661
662
663
  		default:
  			fprintf(out, "  unknown prop %d!
  ", prop->type);
  			break;
  		}
  	}
03d291227   Sam Ravnborg   kconfig: attach h...
664
665
666
667
668
669
670
671
  	if (menu->help) {
  		int len = strlen(menu->help);
  		while (menu->help[--len] == '
  ')
  			menu->help[len] = 0;
  		fprintf(out, "  help
  %s
  ", menu->help);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
  }
  
  void zconfdump(FILE *out)
  {
  	struct property *prop;
  	struct symbol *sym;
  	struct menu *menu;
  
  	menu = rootmenu.list;
  	while (menu) {
  		if ((sym = menu->sym))
  			print_symbol(out, menu);
  		else if ((prop = menu->prompt)) {
  			switch (prop->type) {
  			case P_COMMENT:
  				fputs("
  comment ", out);
  				print_quoted_string(out, prop->text);
  				fputs("
  ", out);
  				break;
  			case P_MENU:
  				fputs("
  menu ", out);
  				print_quoted_string(out, prop->text);
  				fputs("
  ", out);
  				break;
  			default:
  				;
  			}
  			if (!expr_is_yes(prop->visible.expr)) {
  				fputs("  depends ", out);
  				expr_fprint(prop->visible.expr, out);
  				fputc('
  ', out);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
  		}
  
  		if (menu->list)
  			menu = menu->list;
  		else if (menu->next)
  			menu = menu->next;
  		else while ((menu = menu->parent)) {
  			if (menu->prompt && menu->prompt->type == P_MENU)
  				fputs("
  endmenu
  ", out);
  			if (menu->next) {
  				menu = menu->next;
  				break;
  			}
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
  #include "menu.c"