summaryrefslogtreecommitdiffstats
path: root/scripts/kconfig
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2018-12-11 06:00:52 -0500
committerMasahiro Yamada <yamada.masahiro@socionext.com>2018-12-15 03:45:20 -0500
commit6900ae9eeee397436df25ef51835a8b27865d46d (patch)
treeff9ef0c99d6e1500e5826d4d7df2ffb1ce19bf4f /scripts/kconfig
parent723679339d087d79e36c0af67f4be84d866fee20 (diff)
kconfig: remove grammatically ambiguous "unexpected option" diagnostic
This commit decreases 15 shift/reduce conflicts. The location of this error recovery is ambiguous. For example, there are two ways to interpret the following code: 1 config FOO 2 bool "foo" [A] Both lines are reduced together into a config_stmt. [B] The only line 1 is reduced into a config_stmt, and the line 2 matches to "option_name error T_EOL" Of course, we expect [A], but [B] could be grammatically possible. Kconfig has no terminator for a config block. So, we cannot detect its end until we see a non-property keyword. People often insert a blank line between two config blocks, but it is just a coding convention. Blank lines are actually allowed anywhere in Kconfig files. The real error is when a property keyword appears right after "endif", "endchoice", "endmenu", "source", "comment", or variable assignment. Instead of fixing the grammatical ambiguity, I chose to simply remove this error recovery. The difference is unexpected option "bool" ... is turned into a more generic message: invalid statement Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Diffstat (limited to 'scripts/kconfig')
-rw-r--r--scripts/kconfig/zconf.y11
1 files changed, 1 insertions, 10 deletions
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 02bfc62ba92c..cef6123228c0 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -31,7 +31,7 @@ struct symbol *symbol_hash[SYMBOL_HASHSIZE];
31static struct menu *current_menu, *current_entry; 31static struct menu *current_menu, *current_entry;
32 32
33%} 33%}
34%expect 21 34%expect 6
35 35
36%union 36%union
37{ 37{
@@ -94,7 +94,6 @@ static struct menu *current_menu, *current_entry;
94%type <expr> expr 94%type <expr> expr
95%type <expr> if_expr 95%type <expr> if_expr
96%type <id> end 96%type <id> end
97%type <id> option_name
98%type <menu> if_entry menu_entry choice_entry 97%type <menu> if_entry menu_entry choice_entry
99%type <string> symbol_option_arg word_opt assign_val 98%type <string> symbol_option_arg word_opt assign_val
100 99
@@ -127,17 +126,9 @@ stmt_list:
127 | stmt_list menu_stmt 126 | stmt_list menu_stmt
128 | stmt_list end { zconf_error("unexpected end statement"); } 127 | stmt_list end { zconf_error("unexpected end statement"); }
129 | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } 128 | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); }
130 | stmt_list option_name error T_EOL
131{
132 zconf_error("unexpected option \"%s\"", $2->name);
133}
134 | stmt_list error T_EOL { zconf_error("invalid statement"); } 129 | stmt_list error T_EOL { zconf_error("invalid statement"); }
135; 130;
136 131
137option_name:
138 T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_IMPLY | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
139;
140
141common_stmt: 132common_stmt:
142 if_stmt 133 if_stmt
143 | comment_stmt 134 | comment_stmt