%nterm: do not accept character literals

Reported by Rici Lake.
http://lists.gnu.org/archive/html/bug-bison/2018-10/msg00000.html

* src/complain.h: Formatting change.
* src/parse-gram.y (id): Reject character literals used in a context
for non-terminals.
* tests/input.at (Invalid %nterm uses): Check that.
This commit is contained in:
Akim Demaille
2018-11-25 18:07:46 +01:00
parent 4bddd33439
commit 9686b585e7
3 changed files with 25 additions and 3 deletions

View File

@@ -78,8 +78,7 @@ void complain_init (void);
typedef enum typedef enum
{ {
/**< Issue no warnings. */ Wnone = 0, /**< Issue no warnings. */
Wnone = 0,
Wmidrule_values = 1 << warning_midrule_values, Wmidrule_values = 1 << warning_midrule_values,
Wyacc = 1 << warning_yacc, Wyacc = 1 << warning_yacc,

View File

@@ -553,6 +553,9 @@ symbol_def:
symbol_defs.1: symbol_defs.1:
symbol_def symbol_def
| symbol_defs.1 symbol_def | symbol_defs.1 symbol_def
/* FIXME: cannot do that, results in infinite loop in LAC.
| error { yyerrok; }
*/
; ;
@@ -669,6 +672,12 @@ id:
{ $$ = symbol_from_uniqstr ($1, @1); } { $$ = symbol_from_uniqstr ($1, @1); }
| CHAR | CHAR
{ {
if (current_class == nterm_sym)
{
gram_error (&@1,
_("character literals cannot be non-terminals"));
YYERROR;
}
$$ = symbol_get (char_name ($1), @1); $$ = symbol_get (char_name ($1), @1);
symbol_class_set ($$, token_sym, @1, false); symbol_class_set ($$, token_sym, @1, false);
symbol_user_token_number_set ($$, $1, @1); symbol_user_token_number_set ($$, $1, @1);

View File

@@ -140,10 +140,12 @@ AT_DATA([input.y],
[[%nterm expr "expression"; [[%nterm expr "expression";
%nterm term 123; %nterm term 123;
%nterm fact 124 "factor"; %nterm fact 124 "factor";
%nterm '+' '*';
%nterm "number";
%% %%
expr: expr '+' term | term; expr: expr '+' term | term;
term: term '*' fact | fact; term: term '*' fact | fact;
fact: '0'; fact: "number";
]]) ]])
AT_BISON_CHECK([-fcaret input.y], [1], [], AT_BISON_CHECK([-fcaret input.y], [1], [],
@@ -168,6 +170,18 @@ input.y:3.13-15: error: non-terminals cannot be given an explicit number
input.y:3.17-24: error: non-terminals cannot be given a string alias input.y:3.17-24: error: non-terminals cannot be given a string alias
%nterm fact 124 "factor"; %nterm fact 124 "factor";
^^^^^^^^ ^^^^^^^^
input.y:4.1-6: warning: deprecated directive, use '%type' [-Wdeprecated]
%nterm '+' '*';
^^^^^^
input.y:4.8-10: error: character literals cannot be non-terminals
%nterm '+' '*';
^^^
input.y:5.1-6: warning: deprecated directive, use '%type' [-Wdeprecated]
%nterm "number";
^^^^^^
input.y:5.8-15: error: syntax error, unexpected string, expecting char or identifier or <tag>
%nterm "number";
^^^^^^^^
]]) ]])
AT_CLEANUP AT_CLEANUP