reader: reject rules on YYEOF

We crashed when rules were given on YYEOF.
Reported by Han Zheng.
Fixes https://github.com/akimd/bison/issues/92.

* src/reader.c (check_and_convert_grammar): Make sure YYEOF is not
an nterm.
* tests/input.at (Rule for YYEOF): New.
This commit is contained in:
Akim Demaille
2022-09-10 14:04:11 +02:00
parent 3661ebbb2c
commit dd6ca19927
2 changed files with 36 additions and 0 deletions

View File

@@ -954,6 +954,10 @@ check_and_convert_grammar (void)
if (!eoftoken) if (!eoftoken)
{ {
eoftoken = symbol_get ("YYEOF", empty_loc); eoftoken = symbol_get ("YYEOF", empty_loc);
if (eoftoken->content->class == nterm_sym)
complain (&eoftoken->location, complaint,
_("rule given for %s, which is a token"),
eoftoken->tag);
eoftoken->content->class = token_sym; eoftoken->content->class = token_sym;
eoftoken->content->number = 0; eoftoken->content->number = 0;
/* Value specified by POSIX. */ /* Value specified by POSIX. */

View File

@@ -1888,6 +1888,38 @@ input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wothe
AT_CLEANUP AT_CLEANUP
## ---------------- ##
## Rule for YYEOF. ##
## ---------------- ##
AT_SETUP([Rule for YYEOF])
# We crashed when rules were given on YYEOF.
# https://github.com/akimd/bison/issues/92.
AT_DATA([input1.y],
[[%%
start: YYEOF;
YYEOF: 'x';
]])
AT_BISON_CHECK([input1.y], [1], [],
[[input1.y:3.1-5: error: rule given for YYEOF, which is a token
]])
# This is ok, YYEOF is not special.
AT_DATA([input2.y],
[[%token MYEOF 0
%%
start: YYEOF;
YYEOF: 'x';
]])
AT_BISON_CHECK([input2.y])
AT_CLEANUP
## --------------------- ## ## --------------------- ##
## %prec takes a token. ## ## %prec takes a token. ##
## --------------------- ## ## --------------------- ##