mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-19 09:13: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.
|
** Minor improvements have been made to the manual.
|
||||||
|
|
||||||
|
** YYBACKUP works as expected.
|
||||||
|
|
||||||
* Changes in version 2.5 (2011-05-14):
|
* Changes in version 2.5 (2011-05-14):
|
||||||
|
|
||||||
** Grammar symbol names can now contain non-initial dashes:
|
** 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
|
Dagobert Michelsen dam@baltic-online.de
|
||||||
Daniel Hagerty hag@gnu.org
|
Daniel Hagerty hag@gnu.org
|
||||||
David J. MacKenzie djm@gnu.org
|
David J. MacKenzie djm@gnu.org
|
||||||
|
David Kastrup dak@gnu.org
|
||||||
Derek M. Jones derek@knosof.co.uk
|
Derek M. Jones derek@knosof.co.uk
|
||||||
Di-an Jan dianj@freeshell.org
|
Di-an Jan dianj@freeshell.org
|
||||||
Dick Streefland dick.streefland@altium.nl
|
Dick Streefland dick.streefland@altium.nl
|
||||||
|
|||||||
25
data/yacc.c
25
data/yacc.c
@@ -712,18 +712,19 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
|
|||||||
|
|
||||||
#define YYRECOVERING() (!!yyerrstatus)
|
#define YYRECOVERING() (!!yyerrstatus)
|
||||||
|
|
||||||
#define YYBACKUP(Token, Value) \
|
#define YYBACKUP(Token, Value) \
|
||||||
do \
|
do \
|
||||||
if (yychar == YYEMPTY && yylen == 1) \
|
if (yychar == YYEMPTY) \
|
||||||
{ \
|
{ \
|
||||||
yychar = (Token); \
|
yychar = (Token); \
|
||||||
yylval = (Value); \
|
yylval = (Value); \
|
||||||
YYPOPSTACK (1); \]b4_lac_if([[
|
YYPOPSTACK (yylen); \
|
||||||
YY_LAC_DISCARD ("YYBACKUP"); \]])[
|
yystate = *yyssp; \]b4_lac_if([[
|
||||||
goto yybackup; \
|
YY_LAC_DISCARD ("YYBACKUP"); \]])[
|
||||||
} \
|
goto yybackup; \
|
||||||
else \
|
} \
|
||||||
{ \
|
else \
|
||||||
|
{ \
|
||||||
yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
|
yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
|
||||||
YYERROR; \
|
YYERROR; \
|
||||||
} \
|
} \
|
||||||
|
|||||||
@@ -1525,3 +1525,68 @@ AT_PARSER_CHECK([[./input]], [[0]], [],
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
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