Blame view

scripts/kconfig/zconf.y 16 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
  %}
48f1b3b56   Masahiro Yamada   kconfig: fix the ...
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
  %token <id>T_OPTIONAL
  %token <id>T_PROMPT
  %token <id>T_TYPE
  %token <id>T_DEFAULT
  %token <id>T_SELECT
237e3ad0f   Nicolas Pitre   Kconfig: Introduc...
61
  %token <id>T_IMPLY
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
62
  %token <id>T_RANGE
86e187ff9   Arnaud Lacombe   kconfig: add an o...
63
  %token <id>T_VISIBLE
f6a88aa86   Roman Zippel   kconfig: add symb...
64
  %token <id>T_OPTION
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
65
  %token <id>T_ON
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
  %token <string> T_WORD
  %token <string> T_WORD_QUOTE
  %token T_UNEQUAL
31847b67b   Jan Beulich   kconfig: allow us...
69
70
71
72
  %token T_LESS
  %token T_LESS_EQUAL
  %token T_GREATER
  %token T_GREATER_EQUAL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
  %token T_CLOSE_PAREN
  %token T_OPEN_PAREN
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
75
  %token T_EOL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
79
  
  %left T_OR
  %left T_AND
  %left T_EQUAL T_UNEQUAL
31847b67b   Jan Beulich   kconfig: allow us...
80
  %left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
  %nonassoc T_NOT
  
  %type <string> prompt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
  %type <symbol> symbol
  %type <expr> expr
  %type <expr> if_expr
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
87
88
89
  %type <id> end
  %type <id> option_name
  %type <menu> if_entry menu_entry choice_entry
5a1aa8a1a   Roman Zippel   kconfig: add name...
90
  %type <string> symbol_option_arg word_opt
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
91
92
93
94
95
96
97
98
  
  %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
99

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

a02f0570a   Roman Zippel   [PATCH] kconfig: ...
522
523
  	if (getenv("ZCONF_DEBUG"))
  		zconfdebug = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524
525
526
  	zconfparse();
  	if (zconfnerrs)
  		exit(1);
6902dccfd   Yann E. MORIN   kconfig: do not s...
527
528
  	if (!modules_sym)
  		modules_sym = sym_find( "n" );
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
529

8bf116b25   Ulf Magnusson   kconfig: Don't le...
530
  	tmp = rootmenu.prompt->text;
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
531
532
  	rootmenu.prompt->text = _(rootmenu.prompt->text);
  	rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
8bf116b25   Ulf Magnusson   kconfig: Don't le...
533
  	free((char*)tmp);
f6ce00b8c   Arnaud Lacombe   kconfig: expand b...
534

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
  	menu_finalize(&rootmenu);
  	for_all_symbols(i, sym) {
5447d34b0   Sam Ravnborg   kconfig: error ou...
537
538
  		if (sym_check_deps(sym))
  			zconfnerrs++;
bb66fc671   Masahiro Yamada   kbuild: trivial -...
539
  	}
5447d34b0   Sam Ravnborg   kconfig: error ou...
540
541
  	if (zconfnerrs)
  		exit(1);
bfc10001b   Karsten Wiese   [PATCH] kconfig: ...
542
  	sym_set_change_count(1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
  }
651665718   Josh Triplett   kconfig: Mark var...
544
  static const char *zconf_tokenname(int token)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
546
547
548
549
550
551
552
  {
  	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: ...
553
  	case T_DEPENDS:		return "depends";
86e187ff9   Arnaud Lacombe   kconfig: add an o...
554
  	case T_VISIBLE:		return "visible";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
556
557
  	}
  	return "<token>";
  }
61f956f57   Arnaud Lacombe   kconfig: constify...
558
  static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
560
561
  	if (id->token != endtoken) {
  		zconf_error("unexpected '%s' within %s block",
bb3290d91   Linus Torvalds   Remove gperf usag...
562
  			id->name, zconf_tokenname(starttoken));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563
564
565
566
  		zconfnerrs++;
  		return false;
  	}
  	if (current_menu->file != current_file) {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
567
  		zconf_error("'%s' in different file than '%s'",
bb3290d91   Linus Torvalds   Remove gperf usag...
568
  			id->name, zconf_tokenname(starttoken));
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
569
570
571
572
  		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
573
574
575
576
577
578
579
580
581
  		zconfnerrs++;
  		return false;
  	}
  	return true;
  }
  
  static void zconfprint(const char *err, ...)
  {
  	va_list ap;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
582
583
584
585
586
587
588
589
590
591
592
593
594
595
  	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
596
597
598
599
600
601
602
603
604
605
606
607
  	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...
608
  static void print_quoted_string(FILE *out, const char *str)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
  {
  	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...
624
  static void print_symbol(FILE *out, struct menu *menu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
625
626
627
628
629
  {
  	struct symbol *sym = menu->sym;
  	struct property *prop;
  
  	if (sym_is_choice(sym))
c6ccc30fd   Li Zefan   kconfig: fix zcon...
630
631
632
  		fprintf(out, "
  choice
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
  	else
c6ccc30fd   Li Zefan   kconfig: fix zcon...
634
635
636
  		fprintf(out, "
  config %s
  ", sym->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
  	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...
691
692
693
694
695
696
  		case P_SELECT:
  			fputs( "  select ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
237e3ad0f   Nicolas Pitre   Kconfig: Introduc...
697
698
699
700
701
702
  		case P_IMPLY:
  			fputs( "  imply ", out);
  			expr_fprint(prop->expr, out);
  			fputc('
  ', out);
  			break;
c6ccc30fd   Li Zefan   kconfig: fix zcon...
703
704
705
706
707
708
709
710
711
712
713
714
  		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
715
716
717
718
719
720
  		default:
  			fprintf(out, "  unknown prop %d!
  ", prop->type);
  			break;
  		}
  	}
03d291227   Sam Ravnborg   kconfig: attach h...
721
722
723
724
725
726
727
728
  	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
729
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
  }
  
  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
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
  		}
  
  		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 ...
785
  #include "zconf.lex.c"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
786
787
788
789
790
  #include "util.c"
  #include "confdata.c"
  #include "expr.c"
  #include "symbol.c"
  #include "menu.c"