* data/glr.c (yydestroyGLRState): Renamed from yydestroyStackItem.

All uses changed.  Invoke user destructor after an error during a
split parse (trivial change from Joel E. Denny).

* tests/glr-regression.at
(User destructor after an error during a split parse):  New test case.
Problem reported by Joel E. Denny in:
http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html
This commit is contained in:
Paul Eggert
2005-08-26 20:16:16 +00:00
parent 5b4aaf787b
commit 42a6501d1a
3 changed files with 104 additions and 18 deletions

View File

@@ -1,3 +1,14 @@
2005-08-26 Paul Eggert <eggert@cs.ucla.edu>
* data/glr.c (yydestroyGLRState): Renamed from yydestroyStackItem.
All uses changed. Invoke user destructor after an error during a
split parse (trivial change from Joel E. Denny).
* tests/glr-regression.at
(User destructor after an error during a split parse): New test case.
Problem reported by Joel E. Denny in:
http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html
2005-08-25 Paul Eggert <eggert@cs.ucla.edu>
* README-cvs: Give URLs for recommended tools.

View File

@@ -886,8 +886,15 @@ yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
]b4_yydestruct_generate([b4_c_ansi_function_def])[
/** Number of symbols composing the right hand side of rule #RULE. */
static inline int
yyrhsLength (yyRuleNum yyrule)
{
return yyr2[yyrule];
}
static void
yydestroyStackItem (char const *yymsg, yyGLRState *yys)
yydestroyGLRState (char const *yymsg, yyGLRState *yys)
{
if (yys->yyresolved)
yydestruct (yymsg, yystos[yys->yylrState],
@@ -903,14 +910,18 @@ yydestroyStackItem (char const *yymsg, yyGLRState *yys)
YYFPRINTF (stderr, "\n");
}
#endif
}
}
/** Number of symbols composing the right hand side of rule #RULE. */
static inline int
yyrhsLength (yyRuleNum yyrule)
{
return yyr2[yyrule];
if (yys->yysemantics.yyfirstVal)
{
yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
yyGLRState *yyrhs;
int yyn;
for (yyrhs = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
yyn > 0;
yyrhs = yyrhs->yypred, yyn -= 1)
yydestroyGLRState (yymsg, yyrhs);
}
}
}
/** Left-hand-side symbol for rule #RULE. */
@@ -2001,7 +2012,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
}
}
]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
yydestroyStackItem ("Error: popping", yys);
yydestroyGLRState ("Error: popping", yys);
yystack->yytops.yystates[0] = yys->yypred;
yystack->yynextFree -= 1;
yystack->yyspaceLeft += 1;
@@ -2201,7 +2212,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
{
yyGLRState *yys = yystates[0];
]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
)[ yydestroyStackItem ("Cleanup: popping", yys);
)[ yydestroyGLRState ("Cleanup: popping", yys);
yystates[0] = yys->yypred;
yystack.yynextFree -= 1;
yystack.yyspaceLeft += 1;

View File

@@ -406,7 +406,7 @@ merge (YYSTYPE s1, YYSTYPE s2)
static void
yyerror (char const *msg)
{
printf ("%s\n", msg);
fprintf (stderr, "%s\n", msg);
}
]])
@@ -422,11 +422,11 @@ AT_CHECK([[./glr-regr4]], 0,
AT_CLEANUP
## ---------------------------------------------------------------------- ##
## User destructor for unresolved GLR semantic value ##
## Thanks to Joel E. Denny for this test; see ##
## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
## ---------------------------------------------------------------------- ##
## ------------------------------------------------------------------------- ##
## User destructor for unresolved GLR semantic value ##
## Thanks to Joel E. Denny for this test; see ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ##
## ------------------------------------------------------------------------- ##
AT_SETUP([User destructor for unresolved GLR semantic value])
@@ -470,7 +470,7 @@ yylex (void)
static void
yyerror (char const *msg)
{
printf ("%s\n", msg);
fprintf (stderr, "%s\n", msg);
}
int
@@ -485,7 +485,71 @@ AT_CHECK([[bison -o glr-regr5.c glr-regr5.y]], 0, [],
])
AT_COMPILE([glr-regr5])
AT_CHECK([[./glr-regr5]], 0,
AT_CHECK([[./glr-regr5]], 0, [],
[syntax is ambiguous
])
AT_CLEANUP
## ------------------------------------------------------------------------- ##
## User destructor after an error during a split parse ##
## Thanks to Joel E. Denny for this test; see ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ##
## ------------------------------------------------------------------------- ##
AT_SETUP([User destructor after an error during a split parse])
AT_DATA_GRAMMAR([glr-regr6.y],
[[%{
#include <stdio.h>
#include <stdlib.h>
static void yyerror (char const *);
static int yylex (void);
%}
%glr-parser
%union { int value; }
%type <value> 'a'
%destructor {
printf ("Destructor called.\n");
} 'a'
%%
start: 'a' | 'a' ;
%%
static int
yylex (void)
{
static char const *input = "a";
return *input++;
}
static void
yyerror (char const *msg)
{
fprintf (stderr, "%s\n", msg);
}
int
main (void)
{
return yyparse () != 1;
}
]])
AT_CHECK([[bison -o glr-regr6.c glr-regr6.y]], 0, [],
[glr-regr6.y: conflicts: 1 reduce/reduce
])
AT_COMPILE([glr-regr6])
AT_CHECK([[./glr-regr6]], 0,
[Destructor called.
],
[syntax is ambiguous
])