diff --git a/src/complain.h b/src/complain.h index 599afb97..41d0c566 100644 --- a/src/complain.h +++ b/src/complain.h @@ -78,8 +78,7 @@ void complain_init (void); typedef enum { - /**< Issue no warnings. */ - Wnone = 0, + Wnone = 0, /**< Issue no warnings. */ Wmidrule_values = 1 << warning_midrule_values, Wyacc = 1 << warning_yacc, diff --git a/src/parse-gram.y b/src/parse-gram.y index 45484a73..52c85c8e 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -553,6 +553,9 @@ 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); } | CHAR { + if (current_class == nterm_sym) + { + gram_error (&@1, + _("character literals cannot be non-terminals")); + YYERROR; + } $$ = symbol_get (char_name ($1), @1); symbol_class_set ($$, token_sym, @1, false); symbol_user_token_number_set ($$, $1, @1); diff --git a/tests/input.at b/tests/input.at index 84fd0944..4618d513 100644 --- a/tests/input.at +++ b/tests/input.at @@ -140,10 +140,12 @@ AT_DATA([input.y], [[%nterm expr "expression"; %nterm term 123; %nterm fact 124 "factor"; +%nterm '+' '*'; +%nterm "number"; %% expr: expr '+' term | term; term: term '*' fact | fact; -fact: '0'; +fact: "number"; ]]) 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 %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 + %nterm "number"; + ^^^^^^^^ ]]) AT_CLEANUP