Clean up handling of %destructor for the end token (token 0).

Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-07/msg00019.html>
and
<http://lists.gnu.org/archive/html/help-bison/2006-07/msg00013.html>.

Make the skeletons consistent in how they pop the end token and invoke
its %destructor.
* data/glr.c (yyrecoverSyntaxError, yyparse): Don't pop the start
state, which has token number 0, since this would invoke the
%destructor for the end token.
* data/lalr1.cc (yy::parser::parse): Don't check for the final state
until after shifting the end token, or else it won't be popped.
* data/yacc.c (yyparse): Likewise.

* data/glr.c (yyparse): Clear the lookahead after shifting it even when
it's the end token.  Upon termination, destroy an unshifted lookahead
even when it's the end token.
* data/lalr1.cc (yy::parser::parse): Likewise.
* data/yacc.c (yyparse): Likewise.

* src/reader.c (packgram): Don't check rule 0.  This suppresses unused
value warnings for the end token when the user gives the end token a
%destructor.

* tests/actions.at (Printers and Destructors): Test all the above.
This commit is contained in:
Joel E. Denny
2006-07-29 04:11:33 +00:00
parent 62a9592d3d
commit 868d2d9638
6 changed files with 101 additions and 33 deletions

View File

@@ -2261,7 +2261,8 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
}
}
]b4_locations_if([[ yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
yydestroyGLRState ("Error: popping", yys]b4_user_args[);
if (yys->yypred != NULL)
yydestroyGLRState ("Error: popping", yys]b4_user_args[);
yystackp->yytops.yystates[0] = yys->yypred;
yystackp->yynextFree -= 1;
yystackp->yyspaceLeft += 1;
@@ -2373,8 +2374,7 @@ m4_popdef([b4_at_dollar])])dnl
if (yyisShiftAction (yyaction))
{
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
if (yychar != YYEOF)
yychar = YYEMPTY;
yychar = YYEMPTY;
yyposn += 1;
yyglrShift (&yystack, 0, yyaction, yyposn, &yylval, &yylloc);
if (0 < yystack.yyerrState)
@@ -2490,7 +2490,7 @@ m4_popdef([b4_at_dollar])])dnl
goto yyreturn;
yyreturn:
if (yychar != YYEOF && yychar != YYEMPTY)
if (yychar != YYEMPTY)
yydestruct ("Cleanup: discarding lookahead",
YYTRANSLATE (yychar),
&yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
@@ -2512,7 +2512,8 @@ m4_popdef([b4_at_dollar])])dnl
{
yyGLRState *yys = yystates[yyk];
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
)[ yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
)[ if (yys->yypred != NULL)
yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
yystates[yyk] = yys->yypred;
yystack.yynextFree -= 1;
yystack.yyspaceLeft += 1;