summaryrefslogtreecommitdiffstats
path: root/scripts/kconfig
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2018-12-11 06:01:06 -0500
committerMasahiro Yamada <yamada.masahiro@socionext.com>2018-12-21 10:25:54 -0500
commitcaaebb3c6de3493c7f11f79a5dddc6691a40e55f (patch)
tree06a4d167748f5432b813a6e7a774404b0aad40f6 /scripts/kconfig
parentf5451582c4e22ce8912aae4950810f3598c9b516 (diff)
kconfig: refactor end token rules
T_ENDMENU, T_ENDCHOICE, T_ENDIF are the last users of kconf_id associated with yylval. Refactor them to not use it. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Diffstat (limited to 'scripts/kconfig')
-rw-r--r--scripts/kconfig/zconf.y43
1 files changed, 15 insertions, 28 deletions
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 2127f1d65170..71c2fe737e37 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -24,7 +24,8 @@ int yylex(void);
24static void yyerror(const char *err); 24static void yyerror(const char *err);
25static void zconfprint(const char *err, ...); 25static void zconfprint(const char *err, ...);
26static void zconf_error(const char *err, ...); 26static void zconf_error(const char *err, ...);
27static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); 27static bool zconf_endtoken(const char *tokenname,
28 const char *expected_tokenname);
28 29
29struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 30struct symbol *symbol_hash[SYMBOL_HASHSIZE];
30 31
@@ -98,7 +99,7 @@ static struct menu *current_menu, *current_entry;
98%type <type> type logic_type default 99%type <type> type logic_type default
99%type <expr> expr 100%type <expr> expr
100%type <expr> if_expr 101%type <expr> if_expr
101%type <id> end 102%type <string> end
102%type <menu> if_entry menu_entry choice_entry 103%type <menu> if_entry menu_entry choice_entry
103%type <string> word_opt assign_val 104%type <string> word_opt assign_val
104%type <flavor> assign_op 105%type <flavor> assign_op
@@ -256,7 +257,7 @@ choice_entry: choice choice_option_list
256 257
257choice_end: end 258choice_end: end
258{ 259{
259 if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { 260 if (zconf_endtoken($1, "choice")) {
260 menu_end_menu(); 261 menu_end_menu();
261 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); 262 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
262 } 263 }
@@ -330,7 +331,7 @@ if_entry: T_IF expr T_EOL
330 331
331if_end: end 332if_end: end
332{ 333{
333 if (zconf_endtoken($1, T_IF, T_ENDIF)) { 334 if (zconf_endtoken($1, "if")) {
334 menu_end_menu(); 335 menu_end_menu();
335 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); 336 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
336 } 337 }
@@ -355,7 +356,7 @@ menu_entry: menu menu_option_list
355 356
356menu_end: end 357menu_end: end
357{ 358{
358 if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { 359 if (zconf_endtoken($1, "menu")) {
359 menu_end_menu(); 360 menu_end_menu();
360 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); 361 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
361 } 362 }
@@ -445,9 +446,9 @@ prompt: T_WORD
445 | T_WORD_QUOTE 446 | T_WORD_QUOTE
446; 447;
447 448
448end: T_ENDMENU T_EOL { $$ = $1; } 449end: T_ENDMENU T_EOL { $$ = "menu"; }
449 | T_ENDCHOICE T_EOL { $$ = $1; } 450 | T_ENDCHOICE T_EOL { $$ = "choice"; }
450 | T_ENDIF T_EOL { $$ = $1; } 451 | T_ENDIF T_EOL { $$ = "if"; }
451; 452;
452 453
453if_expr: /* empty */ { $$ = NULL; } 454if_expr: /* empty */ { $$ = NULL; }
@@ -530,35 +531,21 @@ void conf_parse(const char *name)
530 sym_set_change_count(1); 531 sym_set_change_count(1);
531} 532}
532 533
533static const char *zconf_tokenname(int token) 534static bool zconf_endtoken(const char *tokenname,
534{ 535 const char *expected_tokenname)
535 switch (token) {
536 case T_MENU: return "menu";
537 case T_ENDMENU: return "endmenu";
538 case T_CHOICE: return "choice";
539 case T_ENDCHOICE: return "endchoice";
540 case T_IF: return "if";
541 case T_ENDIF: return "endif";
542 case T_DEPENDS: return "depends";
543 case T_VISIBLE: return "visible";
544 }
545 return "<token>";
546}
547
548static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken)
549{ 536{
550 if (id->token != endtoken) { 537 if (strcmp(tokenname, expected_tokenname)) {
551 zconf_error("unexpected '%s' within %s block", 538 zconf_error("unexpected '%s' within %s block",
552 id->name, zconf_tokenname(starttoken)); 539 tokenname, expected_tokenname);
553 yynerrs++; 540 yynerrs++;
554 return false; 541 return false;
555 } 542 }
556 if (current_menu->file != current_file) { 543 if (current_menu->file != current_file) {
557 zconf_error("'%s' in different file than '%s'", 544 zconf_error("'%s' in different file than '%s'",
558 id->name, zconf_tokenname(starttoken)); 545 tokenname, expected_tokenname);
559 fprintf(stderr, "%s:%d: location of the '%s'\n", 546 fprintf(stderr, "%s:%d: location of the '%s'\n",
560 current_menu->file->name, current_menu->lineno, 547 current_menu->file->name, current_menu->lineno,
561 zconf_tokenname(starttoken)); 548 expected_tokenname);
562 yynerrs++; 549 yynerrs++;
563 return false; 550 return false;
564 } 551 }