diff options
| author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-12-11 06:00:52 -0500 |
|---|---|---|
| committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-12-15 03:45:20 -0500 |
| commit | 6900ae9eeee397436df25ef51835a8b27865d46d (patch) | |
| tree | ff9ef0c99d6e1500e5826d4d7df2ffb1ce19bf4f /scripts | |
| parent | 723679339d087d79e36c0af67f4be84d866fee20 (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')
| -rw-r--r-- | scripts/kconfig/zconf.y | 11 |
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]; | |||
| 31 | static struct menu *current_menu, *current_entry; | 31 | static 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 | ||
| 137 | option_name: | ||
| 138 | T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_IMPLY | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE | ||
| 139 | ; | ||
| 140 | |||
| 141 | common_stmt: | 132 | common_stmt: |
| 142 | if_stmt | 133 | if_stmt |
| 143 | | comment_stmt | 134 | | comment_stmt |
