2 #############################################
4 #############################################
6 input: nl start | start;
8 start: mainmenu_stmt stmt_list | no_mainmenu_stmt stmt_list;
12 mainmenu_stmt: T_MAINMENU prompt nl
14 menu_add_prompt(P_MENU, $2, NULL);
17 /* Default main menu, if there's no mainmenu entry */
19 no_mainmenu_stmt: /* empty */
22 * Hack: Keep the main menu title on the heap so we can safely free it
23 * later regardless of whether it comes from the 'prompt' in
24 * mainmenu_stmt or here
26 menu_add_prompt(P_MENU, xstrdup("Buildroot Configuration"), NULL);
32 | stmt_list common_stmt
33 | stmt_list choice_stmt
35 | stmt_list end { zconf_error("unexpected end statement"); }
36 | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); }
37 | stmt_list option_name error T_EOL
39 zconf_error("unexpected option \"%s\"", $2->name);
41 | stmt_list error T_EOL { zconf_error("invalid statement"); }
45 T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_IMPLY | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
58 T_WORD error T_EOL { zconf_error("unknown option \"%s\"", $1); }
59 | error T_EOL { zconf_error("invalid option"); }
63 /* config/menuconfig entry */
65 config_entry_start: T_CONFIG nonconst_symbol T_EOL
67 $2->flags |= SYMBOL_OPTIONAL;
69 printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
72 config_stmt: config_entry_start config_option_list
74 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
77 menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
79 $2->flags |= SYMBOL_OPTIONAL;
81 printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
84 menuconfig_stmt: menuconfig_entry_start config_option_list
86 if (current_entry->prompt)
87 current_entry->prompt->type = P_MENU;
89 zconfprint("warning: menuconfig statement without prompt");
90 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
95 | config_option_list config_option
96 | config_option_list symbol_option
97 | config_option_list depends
98 | config_option_list help
99 | config_option_list option_error
100 | config_option_list T_EOL
103 config_option: T_TYPE prompt_stmt_opt T_EOL
105 menu_set_type($1->stype);
106 printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
107 zconf_curname(), zconf_lineno(),
111 config_option: T_PROMPT prompt if_expr T_EOL
113 menu_add_prompt(P_PROMPT, $2, $3);
114 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
117 config_option: T_DEFAULT expr if_expr T_EOL
119 menu_add_expr(P_DEFAULT, $2, $3);
120 if ($1->stype != S_UNKNOWN)
121 menu_set_type($1->stype);
122 printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
123 zconf_curname(), zconf_lineno(),
127 config_option: T_SELECT nonconst_symbol if_expr T_EOL
129 menu_add_symbol(P_SELECT, $2, $3);
130 printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
133 config_option: T_IMPLY nonconst_symbol if_expr T_EOL
135 menu_add_symbol(P_IMPLY, $2, $3);
136 printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
139 config_option: T_RANGE symbol symbol if_expr T_EOL
141 menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
142 printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
145 symbol_option: T_OPTION symbol_option_list T_EOL
150 | symbol_option_list T_WORD symbol_option_arg
152 const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
153 if (id && id->flags & TF_OPTION) {
154 menu_add_option(id->token, $3);
158 zconfprint("warning: ignoring unknown option %s", $2);
163 /* empty */ { $$ = NULL; }
164 | T_EQUAL prompt { $$ = $2; }
169 choice: T_CHOICE word_opt T_EOL
171 struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
172 sym->flags |= SYMBOL_AUTO;
174 menu_add_expr(P_CHOICE, NULL, NULL);
176 printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
179 choice_entry: choice choice_option_list
181 $$ = menu_add_menu();
186 if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
188 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
192 choice_stmt: choice_entry choice_block choice_end
197 | choice_option_list choice_option
198 | choice_option_list depends
199 | choice_option_list help
200 | choice_option_list T_EOL
201 | choice_option_list option_error
204 choice_option: T_PROMPT prompt if_expr T_EOL
206 menu_add_prompt(P_PROMPT, $2, $3);
207 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
210 choice_option: T_TYPE prompt_stmt_opt T_EOL
212 if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
213 menu_set_type($1->stype);
214 printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
215 zconf_curname(), zconf_lineno(),
221 choice_option: T_OPTIONAL T_EOL
223 current_entry->sym->flags |= SYMBOL_OPTIONAL;
224 printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
227 choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
229 if ($1->stype == S_UNKNOWN) {
230 menu_add_symbol(P_DEFAULT, $2, $3);
231 printd(DEBUG_PARSE, "%s:%d:default\n",
232 zconf_curname(), zconf_lineno());
239 | choice_block common_stmt
244 if_entry: T_IF expr nl
246 printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
247 menu_add_entry(NULL);
249 $$ = menu_add_menu();
254 if (zconf_endtoken($1, T_IF, T_ENDIF)) {
256 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
260 if_stmt: if_entry if_block if_end
265 | if_block common_stmt
267 | if_block choice_stmt
272 menu: T_MENU prompt T_EOL
274 menu_add_entry(NULL);
275 menu_add_prompt(P_MENU, $2, NULL);
276 printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
279 menu_entry: menu visibility_list depends_list
281 $$ = menu_add_menu();
286 if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
288 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
292 menu_stmt: menu_entry menu_block menu_end
297 | menu_block common_stmt
298 | menu_block menu_stmt
299 | menu_block choice_stmt
302 source_stmt: T_SOURCE prompt T_EOL
304 printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
311 comment: T_COMMENT prompt T_EOL
313 menu_add_entry(NULL);
314 menu_add_prompt(P_COMMENT, $2, NULL);
315 printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
318 comment_stmt: comment depends_list
323 help_start: T_HELP T_EOL
325 printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
329 help: help_start T_HELPTEXT
331 if (current_entry->help) {
332 free(current_entry->help);
333 zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
334 current_entry->sym->name ?: "<choice>");
337 /* Is the help text empty or all whitespace? */
338 if ($2[strspn($2, " \f\n\r\t\v")] == '\0')
339 zconfprint("warning: '%s' defined with blank help text",
340 current_entry->sym->name ?: "<choice>");
342 current_entry->help = $2;
349 | depends_list depends
351 | depends_list option_error
354 depends: T_DEPENDS T_ON expr T_EOL
357 printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
360 /* visibility option */
364 | visibility_list visible
365 | visibility_list T_EOL
368 visible: T_VISIBLE if_expr
370 menu_add_visibility($2);
373 /* prompt statement */
379 menu_add_prompt(P_PROMPT, $1, $2);
386 end: T_ENDMENU T_EOL { $$ = $1; }
387 | T_ENDCHOICE T_EOL { $$ = $1; }
388 | T_ENDIF T_EOL { $$ = $1; }
396 if_expr: /* empty */ { $$ = NULL; }
397 | T_IF expr { $$ = $2; }
400 expr: symbol { $$ = expr_alloc_symbol($1); }
401 | symbol T_LESS symbol { $$ = expr_alloc_comp(E_LTH, $1, $3); }
402 | symbol T_LESS_EQUAL symbol { $$ = expr_alloc_comp(E_LEQ, $1, $3); }
403 | symbol T_GREATER symbol { $$ = expr_alloc_comp(E_GTH, $1, $3); }
404 | symbol T_GREATER_EQUAL symbol { $$ = expr_alloc_comp(E_GEQ, $1, $3); }
405 | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
406 | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
407 | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; }
408 | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); }
409 | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); }
410 | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
413 /* For symbol definitions, selects, etc., where quotes are not accepted */
414 nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
416 symbol: nonconst_symbol
417 | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
420 word_opt: /* empty */ { $$ = NULL; }