mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
%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:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user