** 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:
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
** YYFAIL
It is seems to be *really* obsolete now, shall we remove it?
-** YYBACKUP
-There is no test about it, no examples in the doc, and I'm not sure
-what it should look like. For instance what follows crashes.
-
- %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);
- }
- %%
- exp:
- 'a' { printf ("a: %d\n", $1); }
- | 'b' { YYBACKUP('a', 123); }
- ;
- %%
- static int
- yylex (YYSTYPE *yylval)
- {
- static char const input[] = "b";
- 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 ();
- }
-
** yychar == yyempty_
The code in yyerrlab reads:
#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; \
} \
]])
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