Blame view
scripts/kconfig/parser.y
15.3 KB
0c8741001 kconfig: convert ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4c Linux-2.6.12-rc2 |
2 3 |
/* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> |
1da177e4c Linux-2.6.12-rc2 |
4 |
*/ |
0c8741001 kconfig: convert ... |
5 |
%{ |
1da177e4c 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 [PATCH] kconfig: ... |
13 |
#include "lkc.h" |
1da177e4c 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 kconfig: use defa... |
20 |
static void yyerror(const char *err); |
1da177e4c Linux-2.6.12-rc2 |
21 |
static void zconfprint(const char *err, ...); |
a02f0570a [PATCH] kconfig: ... |
22 |
static void zconf_error(const char *err, ...); |
caaebb3c6 kconfig: refactor... |
23 24 |
static bool zconf_endtoken(const char *tokenname, const char *expected_tokenname); |
1da177e4c Linux-2.6.12-rc2 |
25 |
|
e66f25d7d Improve kconfig s... |
26 |
struct symbol *symbol_hash[SYMBOL_HASHSIZE]; |
1da177e4c Linux-2.6.12-rc2 |
27 28 |
static struct menu *current_menu, *current_entry; |
1da177e4c Linux-2.6.12-rc2 |
29 |
%} |
1da177e4c Linux-2.6.12-rc2 |
30 31 32 |
%union { |
1da177e4c Linux-2.6.12-rc2 |
33 34 35 36 |
char *string; struct symbol *symbol; struct expr *expr; struct menu *menu; |
3c8f317d4 kconfig: use dist... |
37 |
enum symbol_type type; |
1175c0250 kconfig: support ... |
38 |
enum variable_flavor flavor; |
1da177e4c Linux-2.6.12-rc2 |
39 |
} |
1da177e4c Linux-2.6.12-rc2 |
40 |
%token <string> T_HELPTEXT |
1da177e4c Linux-2.6.12-rc2 |
41 42 |
%token <string> T_WORD %token <string> T_WORD_QUOTE |
ce2164ab5 kconfig: refactor... |
43 |
%token T_ALLNOCONFIG_Y |
3c8f317d4 kconfig: use dist... |
44 |
%token T_BOOL |
b3d1d9d3c kconfig: stop ass... |
45 |
%token T_CHOICE |
1da177e4c Linux-2.6.12-rc2 |
46 |
%token T_CLOSE_PAREN |
c3d228713 kconfig: use spec... |
47 |
%token T_COLON_EQUAL |
b3d1d9d3c kconfig: stop ass... |
48 49 |
%token T_COMMENT %token T_CONFIG |
3c8f317d4 kconfig: use dist... |
50 |
%token T_DEFAULT |
ce2164ab5 kconfig: refactor... |
51 |
%token T_DEFCONFIG_LIST |
3c8f317d4 kconfig: use dist... |
52 53 |
%token T_DEF_BOOL %token T_DEF_TRISTATE |
b3d1d9d3c kconfig: stop ass... |
54 55 56 57 58 |
%token T_DEPENDS %token T_ENDCHOICE %token T_ENDIF %token T_ENDMENU %token T_HELP |
3c8f317d4 kconfig: use dist... |
59 |
%token T_HEX |
b3d1d9d3c kconfig: stop ass... |
60 61 |
%token T_IF %token T_IMPLY |
3c8f317d4 kconfig: use dist... |
62 |
%token T_INT |
b3d1d9d3c kconfig: stop ass... |
63 64 65 |
%token T_MAINMENU %token T_MENU %token T_MENUCONFIG |
ce2164ab5 kconfig: refactor... |
66 |
%token T_MODULES |
b3d1d9d3c kconfig: stop ass... |
67 |
%token T_ON |
1da177e4c Linux-2.6.12-rc2 |
68 |
%token T_OPEN_PAREN |
ce2164ab5 kconfig: refactor... |
69 |
%token T_OPTION |
b3d1d9d3c kconfig: stop ass... |
70 |
%token T_OPTIONAL |
c3d228713 kconfig: use spec... |
71 |
%token T_PLUS_EQUAL |
b3d1d9d3c kconfig: stop ass... |
72 73 74 75 |
%token T_PROMPT %token T_RANGE %token T_SELECT %token T_SOURCE |
3c8f317d4 kconfig: use dist... |
76 77 |
%token T_STRING %token T_TRISTATE |
b3d1d9d3c kconfig: stop ass... |
78 |
%token T_VISIBLE |
3370f9f0d [PATCH] kconfig: ... |
79 |
%token T_EOL |
9ced3bdde kconfig: support ... |
80 |
%token <string> T_ASSIGN_VAL |
1da177e4c Linux-2.6.12-rc2 |
81 82 83 84 |
%left T_OR %left T_AND %left T_EQUAL T_UNEQUAL |
31847b67b kconfig: allow us... |
85 |
%left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL |
1da177e4c Linux-2.6.12-rc2 |
86 |
%nonassoc T_NOT |
26e47a3c1 kconfig: Don't le... |
87 |
%type <symbol> nonconst_symbol |
1da177e4c Linux-2.6.12-rc2 |
88 |
%type <symbol> symbol |
3c8f317d4 kconfig: use dist... |
89 |
%type <type> type logic_type default |
1da177e4c Linux-2.6.12-rc2 |
90 91 |
%type <expr> expr %type <expr> if_expr |
caaebb3c6 kconfig: refactor... |
92 |
%type <string> end |
a02f0570a [PATCH] kconfig: ... |
93 |
%type <menu> if_entry menu_entry choice_entry |
ce2164ab5 kconfig: refactor... |
94 |
%type <string> word_opt assign_val |
c3d228713 kconfig: use spec... |
95 |
%type <flavor> assign_op |
a02f0570a [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 Linux-2.6.12-rc2 |
104 |
|
1da177e4c Linux-2.6.12-rc2 |
105 |
%% |
cc66bca77 kconfig: fix ambi... |
106 |
input: mainmenu_stmt stmt_list | stmt_list; |
0724a7c32 kconfig: Don't le... |
107 108 |
/* mainmenu entry */ |
1be6e7913 kconfig: remove '... |
109 |
mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL |
0724a7c32 kconfig: Don't le... |
110 111 112 |
{ menu_add_prompt(P_MENU, $2, NULL); }; |
a02f0570a [PATCH] kconfig: ... |
113 114 |
stmt_list: /* empty */ |
09d5873e4 kconfig: allow on... |
115 |
| stmt_list assignment_stmt |
a02f0570a [PATCH] kconfig: ... |
116 |
| stmt_list choice_stmt |
09d5873e4 kconfig: allow on... |
117 118 119 |
| stmt_list comment_stmt | stmt_list config_stmt | stmt_list if_stmt |
a02f0570a [PATCH] kconfig: ... |
120 |
| stmt_list menu_stmt |
09d5873e4 kconfig: allow on... |
121 122 |
| stmt_list menuconfig_stmt | stmt_list source_stmt |
a02f0570a [PATCH] kconfig: ... |
123 |
| stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } |
a02f0570a [PATCH] kconfig: ... |
124 |
| stmt_list error T_EOL { zconf_error("invalid statement"); } |
1da177e4c Linux-2.6.12-rc2 |
125 |
; |
09d5873e4 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 [PATCH] kconfig: ... |
132 |
; |
1da177e4c Linux-2.6.12-rc2 |
133 |
/* config/menuconfig entry */ |
26e47a3c1 kconfig: Don't le... |
134 |
config_entry_start: T_CONFIG nonconst_symbol T_EOL |
1da177e4c Linux-2.6.12-rc2 |
135 |
{ |
26e47a3c1 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 Linux-2.6.12-rc2 |
140 141 142 143 |
}; config_stmt: config_entry_start config_option_list { |
1da177e4c Linux-2.6.12-rc2 |
144 145 146 |
printd(DEBUG_PARSE, "%s:%d:endconfig ", zconf_curname(), zconf_lineno()); }; |
26e47a3c1 kconfig: Don't le... |
147 |
menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL |
1da177e4c Linux-2.6.12-rc2 |
148 |
{ |
26e47a3c1 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 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 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 Linux-2.6.12-rc2 |
170 |
; |
3c8f317d4 kconfig: use dist... |
171 |
config_option: type prompt_stmt_opt T_EOL |
1da177e4c Linux-2.6.12-rc2 |
172 |
{ |
3c8f317d4 kconfig: use dist... |
173 |
menu_set_type($1); |
3370f9f0d [PATCH] kconfig: ... |
174 175 176 |
printd(DEBUG_PARSE, "%s:%d:type(%u) ", zconf_curname(), zconf_lineno(), |
3c8f317d4 kconfig: use dist... |
177 |
$1); |
1da177e4c Linux-2.6.12-rc2 |
178 |
}; |
1be6e7913 kconfig: remove '... |
179 |
config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL |
1da177e4c 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 kconfig: use dist... |
185 |
config_option: default expr if_expr T_EOL |
1da177e4c Linux-2.6.12-rc2 |
186 187 |
{ menu_add_expr(P_DEFAULT, $2, $3); |
3c8f317d4 kconfig: use dist... |
188 189 |
if ($1 != S_UNKNOWN) menu_set_type($1); |
3370f9f0d [PATCH] kconfig: ... |
190 191 192 |
printd(DEBUG_PARSE, "%s:%d:default(%u) ", zconf_curname(), zconf_lineno(), |
3c8f317d4 kconfig: use dist... |
193 |
$1); |
1da177e4c Linux-2.6.12-rc2 |
194 |
}; |
26e47a3c1 kconfig: Don't le... |
195 |
config_option: T_SELECT nonconst_symbol if_expr T_EOL |
1da177e4c Linux-2.6.12-rc2 |
196 |
{ |
26e47a3c1 kconfig: Don't le... |
197 |
menu_add_symbol(P_SELECT, $2, $3); |
1da177e4c Linux-2.6.12-rc2 |
198 199 200 |
printd(DEBUG_PARSE, "%s:%d:select ", zconf_curname(), zconf_lineno()); }; |
26e47a3c1 kconfig: Don't le... |
201 |
config_option: T_IMPLY nonconst_symbol if_expr T_EOL |
237e3ad0f Kconfig: Introduc... |
202 |
{ |
26e47a3c1 kconfig: Don't le... |
203 |
menu_add_symbol(P_IMPLY, $2, $3); |
237e3ad0f Kconfig: Introduc... |
204 205 206 |
printd(DEBUG_PARSE, "%s:%d:imply ", zconf_curname(), zconf_lineno()); }; |
1da177e4c 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 kconfig: refactor... |
213 214 215 216 |
config_option: T_OPTION T_MODULES T_EOL { menu_add_option_modules(); }; |
f6a88aa86 kconfig: add symb... |
217 |
|
ce2164ab5 kconfig: refactor... |
218 |
config_option: T_OPTION T_DEFCONFIG_LIST T_EOL |
f6a88aa86 kconfig: add symb... |
219 |
{ |
ce2164ab5 kconfig: refactor... |
220 |
menu_add_option_defconfig_list(); |
f6a88aa86 kconfig: add symb... |
221 |
}; |
ce2164ab5 kconfig: refactor... |
222 223 224 225 |
config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL { menu_add_option_allnoconfig_y(); }; |
f6a88aa86 kconfig: add symb... |
226 |
|
1da177e4c Linux-2.6.12-rc2 |
227 |
/* choice entry */ |
5a1aa8a1a kconfig: add name... |
228 |
choice: T_CHOICE word_opt T_EOL |
1da177e4c Linux-2.6.12-rc2 |
229 |
{ |
5a1aa8a1a kconfig: add name... |
230 |
struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE); |
693359f7a kconfig: rename S... |
231 |
sym->flags |= SYMBOL_NO_WRITE; |
1da177e4c Linux-2.6.12-rc2 |
232 233 |
menu_add_entry(sym); menu_add_expr(P_CHOICE, NULL, NULL); |
bf0bbdcf1 kconfig: Don't le... |
234 |
free($2); |
1da177e4c 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 [PATCH] kconfig: ... |
241 |
$$ = menu_add_menu(); |
1da177e4c Linux-2.6.12-rc2 |
242 243 244 245 |
}; choice_end: end { |
caaebb3c6 kconfig: refactor... |
246 |
if (zconf_endtoken($1, "choice")) { |
1da177e4c Linux-2.6.12-rc2 |
247 248 249 250 251 |
menu_end_menu(); printd(DEBUG_PARSE, "%s:%d:endchoice ", zconf_curname(), zconf_lineno()); } }; |
09d5873e4 kconfig: allow on... |
252 |
choice_stmt: choice_entry stmt_list_in_choice choice_end |
a02f0570a [PATCH] kconfig: ... |
253 |
; |
1da177e4c 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 Linux-2.6.12-rc2 |
260 |
; |
1be6e7913 kconfig: remove '... |
261 |
choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL |
1da177e4c 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 kconfig: use dist... |
267 |
choice_option: logic_type prompt_stmt_opt T_EOL |
1da177e4c Linux-2.6.12-rc2 |
268 |
{ |
3c8f317d4 kconfig: use dist... |
269 270 271 272 |
menu_set_type($1); printd(DEBUG_PARSE, "%s:%d:type(%u) ", zconf_curname(), zconf_lineno(), $1); |
1da177e4c 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 kconfig: Don't le... |
281 |
choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL |
1da177e4c Linux-2.6.12-rc2 |
282 |
{ |
3c8f317d4 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 Linux-2.6.12-rc2 |
287 |
}; |
3c8f317d4 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 Linux-2.6.12-rc2 |
302 |
/* if entry */ |
b2d00d7c6 kconfig: fix line... |
303 |
if_entry: T_IF expr T_EOL |
1da177e4c 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 [PATCH] kconfig: ... |
309 |
$$ = menu_add_menu(); |
1da177e4c Linux-2.6.12-rc2 |
310 311 312 313 |
}; if_end: end { |
caaebb3c6 kconfig: refactor... |
314 |
if (zconf_endtoken($1, "if")) { |
1da177e4c Linux-2.6.12-rc2 |
315 316 317 318 319 |
menu_end_menu(); printd(DEBUG_PARSE, "%s:%d:endif ", zconf_curname(), zconf_lineno()); } }; |
4891796c6 kconfig: remove r... |
320 |
if_stmt: if_entry stmt_list if_end |
1da177e4c Linux-2.6.12-rc2 |
321 |
; |
09d5873e4 kconfig: allow on... |
322 323 |
if_stmt_in_choice: if_entry stmt_list_in_choice if_end ; |
1da177e4c Linux-2.6.12-rc2 |
324 |
/* menu entry */ |
1be6e7913 kconfig: remove '... |
325 |
menu: T_MENU T_WORD_QUOTE T_EOL |
1da177e4c Linux-2.6.12-rc2 |
326 327 |
{ menu_add_entry(NULL); |
fb7f6ff61 [PATCH] kconfig: ... |
328 |
menu_add_prompt(P_MENU, $2, NULL); |
1da177e4c Linux-2.6.12-rc2 |
329 330 331 |
printd(DEBUG_PARSE, "%s:%d:menu ", zconf_curname(), zconf_lineno()); }; |
1f31be9ec kconfig: loosen t... |
332 |
menu_entry: menu menu_option_list |
1da177e4c Linux-2.6.12-rc2 |
333 |
{ |
a02f0570a [PATCH] kconfig: ... |
334 |
$$ = menu_add_menu(); |
1da177e4c Linux-2.6.12-rc2 |
335 336 337 338 |
}; menu_end: end { |
caaebb3c6 kconfig: refactor... |
339 |
if (zconf_endtoken($1, "menu")) { |
1da177e4c Linux-2.6.12-rc2 |
340 341 342 343 344 |
menu_end_menu(); printd(DEBUG_PARSE, "%s:%d:endmenu ", zconf_curname(), zconf_lineno()); } }; |
94d4e1b60 kconfig: remove r... |
345 |
menu_stmt: menu_entry stmt_list menu_end |
1da177e4c Linux-2.6.12-rc2 |
346 |
; |
1f31be9ec kconfig: loosen t... |
347 348 349 350 351 |
menu_option_list: /* empty */ | menu_option_list visible | menu_option_list depends ; |
1be6e7913 kconfig: remove '... |
352 |
source_stmt: T_SOURCE T_WORD_QUOTE T_EOL |
1da177e4c Linux-2.6.12-rc2 |
353 |
{ |
1da177e4c Linux-2.6.12-rc2 |
354 355 |
printd(DEBUG_PARSE, "%s:%d:source %s ", zconf_curname(), zconf_lineno(), $2); |
a02f0570a [PATCH] kconfig: ... |
356 |
zconf_nextfile($2); |
24161a671 kconfig: Don't le... |
357 |
free($2); |
1da177e4c Linux-2.6.12-rc2 |
358 359 360 |
}; /* comment entry */ |
1be6e7913 kconfig: remove '... |
361 |
comment: T_COMMENT T_WORD_QUOTE T_EOL |
1da177e4c Linux-2.6.12-rc2 |
362 363 |
{ menu_add_entry(NULL); |
fb7f6ff61 [PATCH] kconfig: ... |
364 |
menu_add_prompt(P_COMMENT, $2, NULL); |
1da177e4c Linux-2.6.12-rc2 |
365 366 367 |
printd(DEBUG_PARSE, "%s:%d:comment ", zconf_curname(), zconf_lineno()); }; |
4b5ec81bf kconfig: rename d... |
368 369 370 371 372 373 |
comment_stmt: comment comment_option_list ; comment_option_list: /* empty */ | comment_option_list depends |
df60f4b92 kconfig: Remove m... |
374 |
; |
1da177e4c 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 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 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 kconfig: attach h... |
398 |
current_entry->help = $2; |
1da177e4c Linux-2.6.12-rc2 |
399 400 401 |
}; /* depends option */ |
1da177e4c 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 Linux-2.6.12-rc2 |
407 |
}; |
86e187ff9 kconfig: add an o... |
408 |
/* visibility option */ |
413cd19d8 kconfig: require ... |
409 |
visible: T_VISIBLE if_expr T_EOL |
86e187ff9 kconfig: add an o... |
410 411 412 |
{ menu_add_visibility($2); }; |
1da177e4c Linux-2.6.12-rc2 |
413 414 415 416 |
/* prompt statement */ prompt_stmt_opt: /* empty */ |
1be6e7913 kconfig: remove '... |
417 |
| T_WORD_QUOTE if_expr |
1da177e4c Linux-2.6.12-rc2 |
418 |
{ |
fb7f6ff61 [PATCH] kconfig: ... |
419 |
menu_add_prompt(P_PROMPT, $1, $2); |
1da177e4c Linux-2.6.12-rc2 |
420 |
}; |
caaebb3c6 kconfig: refactor... |
421 422 423 |
end: T_ENDMENU T_EOL { $$ = "menu"; } | T_ENDCHOICE T_EOL { $$ = "choice"; } | T_ENDIF T_EOL { $$ = "if"; } |
1da177e4c Linux-2.6.12-rc2 |
424 |
; |
1da177e4c 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 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 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 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 kconfig: add name... |
445 |
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); } |
1da177e4c Linux-2.6.12-rc2 |
446 |
; |
5a1aa8a1a kconfig: add name... |
447 448 |
word_opt: /* empty */ { $$ = NULL; } | T_WORD |
9ced3bdde kconfig: support ... |
449 |
/* assignment statement */ |
171a515d0 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 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 kconfig: support ... |
457 458 459 460 461 |
assign_val: /* empty */ { $$ = xstrdup(""); }; | T_ASSIGN_VAL ; |
1da177e4c 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 kconfig: new conf... |
470 |
_menu_init(); |
1da177e4c Linux-2.6.12-rc2 |
471 |
|
a02f0570a [PATCH] kconfig: ... |
472 |
if (getenv("ZCONF_DEBUG")) |
765f4cdef kconfig: use defa... |
473 474 |
yydebug = 1; yyparse(); |
9ced3bdde kconfig: support ... |
475 476 477 |
/* Variables are expanded in the parse phase. We can free them here. */ variable_all_del(); |
765f4cdef kconfig: use defa... |
478 |
if (yynerrs) |
1da177e4c Linux-2.6.12-rc2 |
479 |
exit(1); |
6902dccfd kconfig: do not s... |
480 481 |
if (!modules_sym) modules_sym = sym_find( "n" ); |
f6ce00b8c kconfig: expand b... |
482 |
|
96d8e48da kconfig: remove s... |
483 484 |
if (!menu_has_prompt(&rootmenu)) { current_entry = &rootmenu; |
137c0118a kconfig: make def... |
485 |
menu_add_prompt(P_MENU, "Main menu", NULL); |
96d8e48da kconfig: remove s... |
486 |
} |
f6ce00b8c kconfig: expand b... |
487 |
|
1da177e4c Linux-2.6.12-rc2 |
488 489 |
menu_finalize(&rootmenu); for_all_symbols(i, sym) { |
5447d34b0 kconfig: error ou... |
490 |
if (sym_check_deps(sym)) |
765f4cdef kconfig: use defa... |
491 |
yynerrs++; |
bb66fc671 kbuild: trivial -... |
492 |
} |
765f4cdef kconfig: use defa... |
493 |
if (yynerrs) |
5447d34b0 kconfig: error ou... |
494 |
exit(1); |
bfc10001b [PATCH] kconfig: ... |
495 |
sym_set_change_count(1); |
1da177e4c Linux-2.6.12-rc2 |
496 |
} |
caaebb3c6 kconfig: refactor... |
497 498 |
static bool zconf_endtoken(const char *tokenname, const char *expected_tokenname) |
1da177e4c Linux-2.6.12-rc2 |
499 |
{ |
caaebb3c6 kconfig: refactor... |
500 |
if (strcmp(tokenname, expected_tokenname)) { |
a02f0570a [PATCH] kconfig: ... |
501 |
zconf_error("unexpected '%s' within %s block", |
caaebb3c6 kconfig: refactor... |
502 |
tokenname, expected_tokenname); |
765f4cdef kconfig: use defa... |
503 |
yynerrs++; |
1da177e4c Linux-2.6.12-rc2 |
504 505 506 |
return false; } if (current_menu->file != current_file) { |
a02f0570a [PATCH] kconfig: ... |
507 |
zconf_error("'%s' in different file than '%s'", |
caaebb3c6 kconfig: refactor... |
508 |
tokenname, expected_tokenname); |
a02f0570a [PATCH] kconfig: ... |
509 510 511 |
fprintf(stderr, "%s:%d: location of the '%s' ", current_menu->file->name, current_menu->lineno, |
caaebb3c6 kconfig: refactor... |
512 |
expected_tokenname); |
765f4cdef kconfig: use defa... |
513 |
yynerrs++; |
1da177e4c 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 [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 kconfig: use defa... |
533 |
yynerrs++; |
a02f0570a [PATCH] kconfig: ... |
534 |
fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); |
1da177e4c 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 kconfig: use defa... |
541 |
static void yyerror(const char *err) |
1da177e4c Linux-2.6.12-rc2 |
542 543 544 545 |
{ fprintf(stderr, "%s:%d: %s ", zconf_curname(), zconf_lineno() + 1, err); } |
651665718 kconfig: Mark var... |
546 |
static void print_quoted_string(FILE *out, const char *str) |
1da177e4c 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 kconfig: Mark var... |
562 |
static void print_symbol(FILE *out, struct menu *menu) |
1da177e4c Linux-2.6.12-rc2 |
563 564 565 566 567 |
{ struct symbol *sym = menu->sym; struct property *prop; if (sym_is_choice(sym)) |
c6ccc30fd kconfig: fix zcon... |
568 569 570 |
fprintf(out, " choice "); |
1da177e4c Linux-2.6.12-rc2 |
571 |
else |
c6ccc30fd kconfig: fix zcon... |
572 573 574 |
fprintf(out, " config %s ", sym->name); |
1da177e4c Linux-2.6.12-rc2 |
575 576 |
switch (sym->type) { case S_BOOLEAN: |
b92d804a5 kconfig: drop 'bo... |
577 578 |
fputs(" bool ", out); |
1da177e4c 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 kconfig: fix zcon... |
629 630 631 632 633 634 |
case P_SELECT: fputs( " select ", out); expr_fprint(prop->expr, out); fputc(' ', out); break; |
237e3ad0f Kconfig: Introduc... |
635 636 637 638 639 640 |
case P_IMPLY: fputs( " imply ", out); expr_fprint(prop->expr, out); fputc(' ', out); break; |
c6ccc30fd 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 kconfig: handle P... |
653 654 |
case P_SYMBOL: fputs( " symbol ", out); |
6397d96ba kconfig: remove s... |
655 656 |
fprintf(out, "%s ", prop->menu->sym->name); |
ecd53ac2f kconfig: handle P... |
657 |
break; |
1da177e4c Linux-2.6.12-rc2 |
658 659 660 661 662 663 |
default: fprintf(out, " unknown prop %d! ", prop->type); break; } } |
03d291227 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 Linux-2.6.12-rc2 |
672 |
} |
1da177e4c 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 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 Linux-2.6.12-rc2 |
728 |
#include "menu.c" |