From 660bc8dd090bbdbcac3b3d01945aa4c515ed8041 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 24 May 2002 12:37:12 +0000 Subject: [PATCH] (yyparse): Correct error handling to conform to POSIX and yacc. Specifically, after syntax error is discovered, do not reduce further before shifting the error token. Clean up the code a bit by removing the labels yyerrdefault, yyerrhandle, yyerrpop. --- data/bison.simple | 85 +++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 58 deletions(-) diff --git a/data/bison.simple b/data/bison.simple index ad42a919..7a491feb 100644 --- a/data/bison.simple +++ b/data/bison.simple @@ -1120,71 +1120,40 @@ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ - goto yyerrhandle; - - -/*-------------------------------------------------------------------. -| yyerrdefault -- current state does not do anything special for the | -| error token. | -`-------------------------------------------------------------------*/ -yyerrdefault: -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - - /* If its default is to accept any token, ok. Otherwise pop it. */ - yyn = yydefact[yystate]; - if (yyn) - goto yydefault; -#endif - + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYFLAG) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } -/*---------------------------------------------------------------. -| yyerrpop -- pop the current state because it cannot handle the | -| error token. | -`---------------------------------------------------------------*/ -yyerrpop: - if (yyssp == yyss) - YYABORT; - yyvsp--; - yystate = *--yyssp; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + yyvsp--; + yystate = *--yyssp; #if YYLSP_NEEDED - yylsp--; + yylsp--; #endif #if YYDEBUG - if (yydebug) - { - short *yyssp1 = yyss - 1; - YYFPRINTF (stderr, "Error: state stack now"); - while (yyssp1 != yyssp) - YYFPRINTF (stderr, " %d", *++yyssp1); - YYFPRINTF (stderr, "\n"); - } + if (yydebug) + { + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); + } #endif - -/*--------------. -| yyerrhandle. | -`--------------*/ -yyerrhandle: - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -- 2.45.2