mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Fix bug that mistakes braced code in a declaration in the rules section
to be a rule action. Mentioned at <http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00105.html>. * src/scan-gram.l: Move midrule action detection from the start of the scanning of any braced code to... * src/parse-gram.y (rhs): ... the parsing of braced code as a rule action. For readability, use $2 and @2 rather than the equivalent global variables. * tests/regression.at (Braced code in declaration in rules section): New test to catch the error fixed by the above patch. Work on code readability some. * src/scan-code.l (current_rule): Get rid of this misleading and redundant declaration: it's actually extern'ed in reader.h. (YY_DECL, code_lex, handle_action_dollar, handle_action_at, translate_action): Add a rule argument and use it instead of the global current_rule. (translate_rule_action): This already receives current_rule through an argument, so pass it on to translate_action instead of assigning current_rule to current_rule. (translate_symbol_action, translate_code): Pass rule = NULL to translate_action.
This commit is contained in:
@@ -1004,3 +1004,79 @@ AT_CLEANUP
|
||||
AT_CHECK_EXPECT2()
|
||||
AT_CHECK_EXPECT2([%glr-parser])
|
||||
AT_CHECK_EXPECT2([%skeleton "lalr1.cc"])
|
||||
|
||||
|
||||
|
||||
## --------------------------------------------- ##
|
||||
## Braced code in declaration in rules section. ##
|
||||
## --------------------------------------------- ##
|
||||
|
||||
AT_SETUP([Braced code in declaration in rules section])
|
||||
|
||||
# Bison once mistook braced code in a declaration in the rules section to be a
|
||||
# rule action.
|
||||
|
||||
AT_DATA_GRAMMAR([input.y],
|
||||
[[%{
|
||||
#include <stdio.h>
|
||||
void yyerror (char const *msg);
|
||||
int yylex (void);
|
||||
%}
|
||||
|
||||
%error-verbose
|
||||
|
||||
%%
|
||||
|
||||
start:
|
||||
{
|
||||
printf ("Bison would once convert this action to a midrule because of the"
|
||||
" subsequent braced code.\n");
|
||||
}
|
||||
;
|
||||
|
||||
%destructor { fprintf (stderr, "DESTRUCTOR\n"); } 'a';
|
||||
%printer { fprintf (yyoutput, "PRINTER"); } 'a';
|
||||
|
||||
%%
|
||||
|
||||
void
|
||||
yyerror (char const *msg)
|
||||
{
|
||||
fprintf (stderr, "%s\n", msg);
|
||||
}
|
||||
|
||||
int
|
||||
yylex (void)
|
||||
{
|
||||
return 'a';
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
yydebug = 1;
|
||||
return !yyparse ();
|
||||
}
|
||||
]])
|
||||
|
||||
AT_CHECK([bison -t -o input.c input.y])
|
||||
AT_COMPILE([input])
|
||||
AT_PARSER_CHECK([./input], 0,
|
||||
[[Bison would once convert this action to a midrule because of the subsequent braced code.
|
||||
]],
|
||||
[[Starting parse
|
||||
Entering state 0
|
||||
Reducing stack by rule 1 (line 22):
|
||||
-> $$ = nterm start ()
|
||||
Stack now 0
|
||||
Entering state 1
|
||||
Reading a token: Next token is token 'a' (PRINTER)
|
||||
syntax error, unexpected 'a', expecting $end
|
||||
Error: popping nterm start ()
|
||||
Stack now 0
|
||||
Cleanup: discarding lookahead token 'a' (PRINTER)
|
||||
DESTRUCTOR
|
||||
Stack now 0
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
Reference in New Issue
Block a user