mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
yacc: fix YYBACKUP.
Reported by David Kastrup:
https://lists.gnu.org/archive/html/bug-bison/2011-10/msg00002.html.
* data/yacc.c (YYBACKUP): Accept rhs size.
Restore the proper state value.
* TODO (YYBACKUP): Make it...
* tests/actions.at: a new test case.
* NEWS, THANKS: Update.
(cherry picked from commit d115aad911)
Conflicts:
TODO
data/yacc.c
This commit is contained in:
2
NEWS
2
NEWS
@@ -7,6 +7,8 @@ Bison News
|
||||
|
||||
** Minor improvements have been made to the manual.
|
||||
|
||||
** YYBACKUP works as expected.
|
||||
|
||||
* Changes in version 2.5 (2011-05-14):
|
||||
|
||||
** Grammar symbol names can now contain non-initial dashes:
|
||||
|
||||
1
THANKS
1
THANKS
@@ -29,6 +29,7 @@ Csaba Raduly csaba_22@yahoo.co.uk
|
||||
Dagobert Michelsen dam@baltic-online.de
|
||||
Daniel Hagerty hag@gnu.org
|
||||
David J. MacKenzie djm@gnu.org
|
||||
David Kastrup dak@gnu.org
|
||||
Derek M. Jones derek@knosof.co.uk
|
||||
Di-an Jan dianj@freeshell.org
|
||||
Dick Streefland dick.streefland@altium.nl
|
||||
|
||||
@@ -714,11 +714,12 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
|
||||
|
||||
#define YYBACKUP(Token, Value) \
|
||||
do \
|
||||
if (yychar == YYEMPTY && yylen == 1) \
|
||||
if (yychar == YYEMPTY) \
|
||||
{ \
|
||||
yychar = (Token); \
|
||||
yylval = (Value); \
|
||||
YYPOPSTACK (1); \]b4_lac_if([[
|
||||
YYPOPSTACK (yylen); \
|
||||
yystate = *yyssp; \]b4_lac_if([[
|
||||
YY_LAC_DISCARD ("YYBACKUP"); \]])[
|
||||
goto yybackup; \
|
||||
} \
|
||||
|
||||
@@ -1525,3 +1525,68 @@ AT_PARSER_CHECK([[./input]], [[0]], [],
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
## ---------- ##
|
||||
## YYBACKUP. ##
|
||||
## ---------- ##
|
||||
|
||||
AT_SETUP([[YYBACKUP]])
|
||||
|
||||
AT_DATA_GRAMMAR([input.y],
|
||||
[[
|
||||
%error-verbose
|
||||
%debug
|
||||
%pure-parser
|
||||
%code {
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <assert.h>
|
||||
|
||||
static void yyerror (const char *msg);
|
||||
static int yylex (YYSTYPE *yylval);
|
||||
}
|
||||
%%
|
||||
input:
|
||||
exp exp {}
|
||||
;
|
||||
|
||||
exp:
|
||||
'a' { printf ("a: %d\n", $1); }
|
||||
| 'b' { YYBACKUP('a', 123); }
|
||||
| 'c' 'd' { YYBACKUP('a', 456); }
|
||||
;
|
||||
|
||||
%%
|
||||
static int
|
||||
yylex (YYSTYPE *yylval)
|
||||
{
|
||||
static char const input[] = "bcd";
|
||||
static size_t toknum;
|
||||
assert (toknum < sizeof input);
|
||||
*yylval = (toknum + 1) * 10;
|
||||
return input[toknum++];
|
||||
}
|
||||
|
||||
static void
|
||||
yyerror (const char *msg)
|
||||
{
|
||||
fprintf (stderr, "%s\n", msg);
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
yydebug = !!getenv("YYDEBUG");
|
||||
return yyparse ();
|
||||
}
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[-o input.c input.y]])
|
||||
AT_COMPILE([[input]])
|
||||
AT_PARSER_CHECK([[./input]], [[0]],
|
||||
[[a: 123
|
||||
a: 456
|
||||
a: 789
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
Reference in New Issue
Block a user