On 2005-05-01, at 06:28:46 -0700, Paul Eggert wrote: > Thanks for the patch, but I suspect the code patch isn't quite general > enough, since a similar problem occurs if the user invokes YYACCEPT or > YYABORT. How about this patch instead?
Yes, that's a lot better. My patch rather only fixed the stack overflow case (plus, it added redundancy). I never looked at the skeleton code before I noticed this particular problem, so I'm not too familiar with it. :-) Does the test part of my patch make any sense? Thanks, Marcus > 2005-05-01 Paul Eggert <[EMAIL PROTECTED]> > > * data/yacc.c (yyerrlab): Move the code that destroys the stack > from here.... > (yyreturn): to here. That way, destructors are called properly > even if the stack overflows, or the user calls YYACCEPT or > YYABORT. Stack-overflow problem reported by Marcus Holland-Moritz. > (yyoverflowlab): Destroy the lookahead. > > --- yacc.c.~1.86.~ 2005-04-24 20:13:06 -0700 > +++ yacc.c 2005-05-01 06:12:32 -0700 > @@ -1203,15 +1203,7 @@ yyerrlab: > /* If at end of input, pop the error token, > then the rest of the stack, then return failure. */ > if (yychar == YYEOF) > - for (;;) > - { > -]b4_location_if([[ yyerror_range[0] = *yylsp;]])[ > - YYPOPSTACK; > - if (yyssp == yyss) > - YYABORT; > - yydestruct (_("Error: popping"), > - yystos[*yyssp], yyvsp]b4_location_if([, > yylsp])[); > - } > + YYABORT; > } > else > { > @@ -1316,11 +1308,23 @@ yyabortlab: > `----------------------------------------------*/ > yyoverflowlab: > yyerror (]b4_yyerror_args[_("parser stack overflow")); > + yydestruct (_("Error: discarding lookahead"), > + yytoken, &yylval]b4_location_if([, &yylloc])[); > yyresult = 2; > /* Fall through. */ > #endif > > yyreturn: > + if (yyssp != yyss) > + for (;;) > + { > +]b4_location_if([[ yyerror_range[0] = *yylsp;]])[ > + YYPOPSTACK; > + if (yyssp == yyss) > + break; > + yydestruct (_("Error: popping"), > + yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[); > + } > #ifndef yyoverflow > if (yyss != yyssa) > YYSTACK_FREE (yyss); _______________________________________________ Help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison