Blame view

scripts/kconfig/zconf.y 15.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
  %{
  /*
   * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
   * Released under the terms of the GNU GPL v2.0.
   */
  
  #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
20
21
22
  #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
  
  #define PRINTD		0x0001
  #define DEBUG_PARSE	0x0002
  
  int cdebug = PRINTD;
  
  extern int zconflex(void);
  static void zconfprint(const char *err, ...);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
23
  static void zconf_error(const char *err, ...);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  static void zconferror(const char *err);
61f956f57   Arnaud Lacombe   kconfig: constify...
25
  static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26

e66f25d7d   Andi Kleen   Improve kconfig s...
27
  struct symbol *symbol_hash[SYMBOL_HASHSIZE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
  
  static struct menu *current_menu, *current_entry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  %}
86e187ff9   Arnaud Lacombe   kconfig: add an o...
31
  %expect 30
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
33
34
  
  %union
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  	char *string;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
36
  	struct file *file;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  	struct symbol *symbol;
  	struct expr *expr;
  	struct menu *menu;
61f956f57   Arnaud Lacombe   kconfig: constify...
40
  	const struct kconf_id *id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  }
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
42
43
44
45
46
47
48
49
50
51
  %token <id>T_MAINMENU
  %token <id>T_MENU
  %token <id>T_ENDMENU
  %token <id>T_SOURCE
  %token <id>T_CHOICE
  %token <id>T_ENDCHOICE
  %token <id>T_COMMENT
  %token <id>T_CONFIG
  %token <id>T_MENUCONFIG
  %token <id>T_HELP
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  %token <string> T_HELPTEXT
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
53
54
55
  %token <id>T_IF
  %token <id>T_ENDIF
  %token <id>T_DEPENDS
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
56
57
58
59
60
61
  %token <id>T_OPTIONAL
  %token <id>T_PROMPT
  %token <id>T_TYPE
  %token <id>T_DEFAULT
  %token <id>T_SELECT
  %token <id>T_RANGE
86e187ff9   Arnaud Lacombe   kconfig: add an o...
62
  %token <id>T_VISIBLE
f6a88aa86   Roman Zippel   kconfig: add symb...
63
  %token <id>T_OPTION
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
64
  %token <id>T_ON
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
  %token <string> T_WORD
  %token <string> T_WORD_QUOTE
  %token T_UNEQUAL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
  %token T_CLOSE_PAREN
  %token T_OPEN_PAREN
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
70
  %token T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
75
76
77
  
  %left T_OR
  %left T_AND
  %left T_EQUAL T_UNEQUAL
  %nonassoc T_NOT
  
  %type <string> prompt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
  %type <symbol> symbol
  %type <expr> expr
  %type <expr> if_expr
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
81
82
83
  %type <id> end
  %type <id> option_name
  %type <menu> if_entry menu_entry choice_entry
5a1aa8a1a   Roman Zippel   kconfig: add name...
84
  %type <string> symbol_option_arg word_opt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
85
86
87
88
89
90
91
92
  
  %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
93

1456edbb1   Josh Triplett   kconfig: Make zco...
94
95
96
97
  %{
  /* Include zconf.hash.c here so it can see the token constants. */
  #include "zconf.hash.c"
  %}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  %%
8ea13e2c8   Arnaud Lacombe   kconfig: implemen...
99
100
101
  input: nl start | start;
  
  start: mainmenu_stmt stmt_list | stmt_list;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
102
103
104
105
106
107
  
  stmt_list:
  	  /* empty */
  	| stmt_list common_stmt
  	| stmt_list choice_stmt
  	| stmt_list menu_stmt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
108
109
110
111
112
113
114
  	| stmt_list end			{ zconf_error("unexpected end statement"); }
  	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); }
  	| stmt_list option_name error T_EOL
  {
  	zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name);
  }
  	| stmt_list error T_EOL		{ zconf_error("invalid statement"); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  ;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
116
  option_name:
86e187ff9   Arnaud Lacombe   kconfig: add an o...
117
  	T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  ;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
119
120
121
  common_stmt:
  	  T_EOL
  	| if_stmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
124
125
  	| comment_stmt
  	| config_stmt
  	| menuconfig_stmt
  	| source_stmt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
126
127
128
129
130
  ;
  
  option_error:
  	  T_WORD error T_EOL		{ zconf_error("unknown option \"%s\"", $1); }
  	| error T_EOL			{ zconf_error("invalid option"); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  ;
  
  
  /* config/menuconfig entry */
  
  config_entry_start: T_CONFIG T_WORD T_EOL
  {
  	struct symbol *sym = sym_lookup($2, 0);
  	sym->flags |= SYMBOL_OPTIONAL;
  	menu_add_entry(sym);
  	printd(DEBUG_PARSE, "%s:%d:config %s
  ", zconf_curname(), zconf_lineno(), $2);
  };
  
  config_stmt: config_entry_start config_option_list
  {
  	menu_end_entry();
  	printd(DEBUG_PARSE, "%s:%d:endconfig
  ", zconf_curname(), zconf_lineno());
  };
  
  menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
  {
  	struct symbol *sym = sym_lookup($2, 0);
  	sym->flags |= SYMBOL_OPTIONAL;
  	menu_add_entry(sym);
  	printd(DEBUG_PARSE, "%s:%d:menuconfig %s
  ", zconf_curname(), zconf_lineno(), $2);
  };
  
  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");
  	menu_end_entry();
  	printd(DEBUG_PARSE, "%s:%d:endconfig
  ", zconf_curname(), zconf_lineno());
  };
  
  config_option_list:
  	  /* empty */
  	| config_option_list config_option
f6a88aa86   Roman Zippel   kconfig: add symb...
175
  	| config_option_list symbol_option
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
177
  	| config_option_list depends
  	| config_option_list help
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
178
  	| config_option_list option_error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
  	| config_option_list T_EOL
  ;
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
181
  config_option: T_TYPE prompt_stmt_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  {
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
183
184
185
186
187
  	menu_set_type($1->stype);
  	printd(DEBUG_PARSE, "%s:%d:type(%u)
  ",
  		zconf_curname(), zconf_lineno(),
  		$1->stype);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
189
190
191
192
193
194
195
196
197
198
199
  };
  
  config_option: T_PROMPT prompt if_expr T_EOL
  {
  	menu_add_prompt(P_PROMPT, $2, $3);
  	printd(DEBUG_PARSE, "%s:%d:prompt
  ", zconf_curname(), zconf_lineno());
  };
  
  config_option: T_DEFAULT expr if_expr T_EOL
  {
  	menu_add_expr(P_DEFAULT, $2, $3);
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
200
201
202
203
204
205
  	if ($1->stype != S_UNKNOWN)
  		menu_set_type($1->stype);
  	printd(DEBUG_PARSE, "%s:%d:default(%u)
  ",
  		zconf_curname(), zconf_lineno(),
  		$1->stype);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  };
  
  config_option: T_SELECT T_WORD if_expr T_EOL
  {
  	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
  	printd(DEBUG_PARSE, "%s:%d:select
  ", zconf_curname(), zconf_lineno());
  };
  
  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());
  };
f6a88aa86   Roman Zippel   kconfig: add symb...
221
222
223
224
225
226
227
  symbol_option: T_OPTION symbol_option_list T_EOL
  ;
  
  symbol_option_list:
  	  /* empty */
  	| symbol_option_list T_WORD symbol_option_arg
  {
61f956f57   Arnaud Lacombe   kconfig: constify...
228
  	const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
f6a88aa86   Roman Zippel   kconfig: add symb...
229
230
231
232
233
234
235
236
237
238
239
  	if (id && id->flags & TF_OPTION)
  		menu_add_option(id->token, $3);
  	else
  		zconfprint("warning: ignoring unknown option %s", $2);
  	free($2);
  };
  
  symbol_option_arg:
  	  /* empty */		{ $$ = NULL; }
  	| T_EQUAL prompt	{ $$ = $2; }
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
  /* choice entry */
5a1aa8a1a   Roman Zippel   kconfig: add name...
241
  choice: T_CHOICE word_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
  {
5a1aa8a1a   Roman Zippel   kconfig: add name...
243
244
  	struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
  	sym->flags |= SYMBOL_AUTO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
247
248
249
250
251
252
  	menu_add_entry(sym);
  	menu_add_expr(P_CHOICE, NULL, NULL);
  	printd(DEBUG_PARSE, "%s:%d:choice
  ", zconf_curname(), zconf_lineno());
  };
  
  choice_entry: choice choice_option_list
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
253
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
256
257
258
259
260
261
262
263
  };
  
  choice_end: end
  {
  	if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endchoice
  ", zconf_curname(), zconf_lineno());
  	}
  };
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
264
265
  choice_stmt: choice_entry choice_block choice_end
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
267
268
269
270
271
272
  
  choice_option_list:
  	  /* empty */
  	| choice_option_list choice_option
  	| choice_option_list depends
  	| choice_option_list help
  	| choice_option_list T_EOL
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
273
  	| choice_option_list option_error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
276
277
278
279
280
281
  ;
  
  choice_option: T_PROMPT prompt if_expr T_EOL
  {
  	menu_add_prompt(P_PROMPT, $2, $3);
  	printd(DEBUG_PARSE, "%s:%d:prompt
  ", zconf_curname(), zconf_lineno());
  };
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
282
  choice_option: T_TYPE prompt_stmt_opt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
  {
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
284
285
286
287
288
289
290
291
  	if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
  		menu_set_type($1->stype);
  		printd(DEBUG_PARSE, "%s:%d:type(%u)
  ",
  			zconf_curname(), zconf_lineno(),
  			$1->stype);
  	} else
  		YYERROR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
294
295
296
297
298
299
300
301
302
  };
  
  choice_option: T_OPTIONAL T_EOL
  {
  	current_entry->sym->flags |= SYMBOL_OPTIONAL;
  	printd(DEBUG_PARSE, "%s:%d:optional
  ", zconf_curname(), zconf_lineno());
  };
  
  choice_option: T_DEFAULT T_WORD if_expr T_EOL
  {
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
303
304
305
306
307
308
309
  	if ($1->stype == S_UNKNOWN) {
  		menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
  		printd(DEBUG_PARSE, "%s:%d:default
  ",
  			zconf_curname(), zconf_lineno());
  	} else
  		YYERROR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
312
313
  };
  
  choice_block:
  	  /* empty */
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
314
  	| choice_block common_stmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
  ;
  
  /* if entry */
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
318
  if_entry: T_IF expr nl
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
320
321
322
323
  {
  	printd(DEBUG_PARSE, "%s:%d:if
  ", zconf_curname(), zconf_lineno());
  	menu_add_entry(NULL);
  	menu_add_dep($2);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
324
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
327
328
329
330
331
332
333
334
  };
  
  if_end: end
  {
  	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endif
  ", zconf_curname(), zconf_lineno());
  	}
  };
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
335
336
  if_stmt: if_entry if_block if_end
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
  
  if_block:
  	  /* empty */
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
340
  	| if_block common_stmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
343
  	| if_block menu_stmt
  	| if_block choice_stmt
  ;
8ea13e2c8   Arnaud Lacombe   kconfig: implemen...
344
345
346
347
348
349
  /* mainmenu entry */
  
  mainmenu_stmt: T_MAINMENU prompt nl
  {
  	menu_add_prompt(P_MENU, $2, NULL);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
352
353
354
  /* menu entry */
  
  menu: T_MENU prompt T_EOL
  {
  	menu_add_entry(NULL);
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
355
  	menu_add_prompt(P_MENU, $2, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
358
  	printd(DEBUG_PARSE, "%s:%d:menu
  ", zconf_curname(), zconf_lineno());
  };
86e187ff9   Arnaud Lacombe   kconfig: add an o...
359
  menu_entry: menu visibility_list depends_list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
361
  	$$ = menu_add_menu();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
364
365
366
367
368
369
370
371
  };
  
  menu_end: end
  {
  	if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
  		menu_end_menu();
  		printd(DEBUG_PARSE, "%s:%d:endmenu
  ", zconf_curname(), zconf_lineno());
  	}
  };
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
372
373
  menu_stmt: menu_entry menu_block menu_end
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
376
  
  menu_block:
  	  /* empty */
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
377
  	| menu_block common_stmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
378
379
  	| menu_block menu_stmt
  	| menu_block choice_stmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
  ;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
381
  source_stmt: T_SOURCE prompt T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
  	printd(DEBUG_PARSE, "%s:%d:source %s
  ", zconf_curname(), zconf_lineno(), $2);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
385
  	zconf_nextfile($2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
387
388
389
390
391
392
  };
  
  /* comment entry */
  
  comment: T_COMMENT prompt T_EOL
  {
  	menu_add_entry(NULL);
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
393
  	menu_add_prompt(P_COMMENT, $2, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  	printd(DEBUG_PARSE, "%s:%d:comment
  ", zconf_curname(), zconf_lineno());
  };
  
  comment_stmt: comment depends_list
  {
  	menu_end_entry();
  };
  
  /* 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
  {
03d291227   Sam Ravnborg   kconfig: attach h...
414
  	current_entry->help = $2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
416
417
  };
  
  /* depends option */
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
418
419
420
421
422
  depends_list:
  	  /* empty */
  	| depends_list depends
  	| depends_list T_EOL
  	| depends_list option_error
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423
424
425
426
427
428
429
  ;
  
  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
430
  };
86e187ff9   Arnaud Lacombe   kconfig: add an o...
431
432
433
434
435
436
437
438
439
440
441
442
  /* visibility option */
  
  visibility_list:
  	  /* empty */
  	| visibility_list visible
  	| visibility_list T_EOL
  ;
  
  visible: T_VISIBLE if_expr
  {
  	menu_add_visibility($2);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
445
446
447
448
  /* prompt statement */
  
  prompt_stmt_opt:
  	  /* empty */
  	| prompt if_expr
  {
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
449
  	menu_add_prompt(P_PROMPT, $1, $2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
451
452
453
454
  };
  
  prompt:	  T_WORD
  	| T_WORD_QUOTE
  ;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
455
456
457
  end:	  T_ENDMENU T_EOL	{ $$ = $1; }
  	| T_ENDCHOICE T_EOL	{ $$ = $1; }
  	| T_ENDIF T_EOL		{ $$ = $1; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
  ;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
459
460
461
462
  nl:
  	  T_EOL
  	| nl T_EOL
  ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
  
  if_expr:  /* empty */			{ $$ = NULL; }
  	| T_IF expr			{ $$ = $2; }
  ;
  
  expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
  	| 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); }
  ;
  
  symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
5a1aa8a1a   Roman Zippel   kconfig: add name...
478
  	| T_WORD_QUOTE	{ $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479
  ;
5a1aa8a1a   Roman Zippel   kconfig: add name...
480
481
  word_opt: /* empty */			{ $$ = NULL; }
  	| T_WORD
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
483
484
485
486
487
488
489
490
491
  %%
  
  void conf_parse(const char *name)
  {
  	struct symbol *sym;
  	int i;
  
  	zconf_initscan(name);
  
  	sym_init();
692d97c38   nir.tzachar@gmail.com   kconfig: new conf...
492
  	_menu_init();
face4374e   Roman Zippel   kconfig: add defc...
493
494
495
  	modules_sym = sym_lookup(NULL, 0);
  	modules_sym->type = S_BOOLEAN;
  	modules_sym->flags |= SYMBOL_AUTO;
fb7f6ff61   Paolo 'Blaisorblade' Giarrusso   [PATCH] kconfig: ...
496
  	rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
497

a02f0570a   Roman Zippel   [PATCH] kconfig: ...
498
499
  	if (getenv("ZCONF_DEBUG"))
  		zconfdebug = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
501
502
  	zconfparse();
  	if (zconfnerrs)
  		exit(1);
face4374e   Roman Zippel   kconfig: add defc...
503
504
505
506
507
508
  	if (!modules_sym->prop) {
  		struct property *prop;
  
  		prop = prop_alloc(P_DEFAULT, modules_sym);
  		prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
  	}
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
509
510
511
  
  	rootmenu.prompt->text = _(rootmenu.prompt->text);
  	rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
  	menu_finalize(&rootmenu);
  	for_all_symbols(i, sym) {
5447d34b0   Sam Ravnborg   kconfig: error ou...
514
515
  		if (sym_check_deps(sym))
  			zconfnerrs++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
          }
5447d34b0   Sam Ravnborg   kconfig: error ou...
517
518
  	if (zconfnerrs)
  		exit(1);
bfc10001b   Karsten Wiese   [PATCH] kconfig: ...
519
  	sym_set_change_count(1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
  }
651665718   Josh Triplett   kconfig: Mark var...
521
  static const char *zconf_tokenname(int token)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
524
525
526
527
528
529
  {
  	switch (token) {
  	case T_MENU:		return "menu";
  	case T_ENDMENU:		return "endmenu";
  	case T_CHOICE:		return "choice";
  	case T_ENDCHOICE:	return "endchoice";
  	case T_IF:		return "if";
  	case T_ENDIF:		return "endif";
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
530
  	case T_DEPENDS:		return "depends";
86e187ff9   Arnaud Lacombe   kconfig: add an o...
531
  	case T_VISIBLE:		return "visible";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
533
534
  	}
  	return "<token>";
  }
61f956f57   Arnaud Lacombe   kconfig: constify...
535
  static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
536
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
537
538
539
  	if (id->token != endtoken) {
  		zconf_error("unexpected '%s' within %s block",
  			kconf_id_strings + id->name, zconf_tokenname(starttoken));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
541
542
543
  		zconfnerrs++;
  		return false;
  	}
  	if (current_menu->file != current_file) {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
544
545
546
547
548
549
  		zconf_error("'%s' in different file than '%s'",
  			kconf_id_strings + id->name, zconf_tokenname(starttoken));
  		fprintf(stderr, "%s:%d: location of the '%s'
  ",
  			current_menu->file->name, current_menu->lineno,
  			zconf_tokenname(starttoken));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
551
552
553
554
555
556
557
558
  		zconfnerrs++;
  		return false;
  	}
  	return true;
  }
  
  static void zconfprint(const char *err, ...)
  {
  	va_list ap;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
559
560
561
562
563
564
565
566
567
568
569
570
571
572
  	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;
  
  	zconfnerrs++;
  	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
574
575
576
577
578
579
580
581
582
583
584
  	va_start(ap, err);
  	vfprintf(stderr, err, ap);
  	va_end(ap);
  	fprintf(stderr, "
  ");
  }
  
  static void zconferror(const char *err)
  {
  	fprintf(stderr, "%s:%d: %s
  ", zconf_curname(), zconf_lineno() + 1, err);
  }
651665718   Josh Triplett   kconfig: Mark var...
585
  static void print_quoted_string(FILE *out, const char *str)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
  {
  	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...
601
  static void print_symbol(FILE *out, struct menu *menu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
603
604
605
606
  {
  	struct symbol *sym = menu->sym;
  	struct property *prop;
  
  	if (sym_is_choice(sym))
c6ccc30fd   Li Zefan   kconfig: fix zcon...
607
608
609
  		fprintf(out, "
  choice
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
610
  	else
c6ccc30fd   Li Zefan   kconfig: fix zcon...
611
612
613
  		fprintf(out, "
  config %s
  ", sym->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
  	switch (sym->type) {
  	case S_BOOLEAN:
  		fputs("  boolean
  ", out);
  		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...
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
  		case P_SELECT:
  			fputs( "  select ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
  		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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
686
687
688
689
690
691
  		default:
  			fprintf(out, "  unknown prop %d!
  ", prop->type);
  			break;
  		}
  	}
03d291227   Sam Ravnborg   kconfig: attach h...
692
693
694
695
696
697
698
699
  	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
700
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
  }
  
  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
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
  		}
  
  		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;
  			}
  		}
  	}
  }
378dbb2cf   Arnaud Lacombe   kconfig: migrate ...
756
  #include "zconf.lex.c"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
757
758
759
760
761
  #include "util.c"
  #include "confdata.c"
  #include "expr.c"
  #include "symbol.c"
  #include "menu.c"