yysyntax_error: adjust prior fixes for branch-2.5's lalr1.cc.

On master, there is no yychar in lalr1.cc, but there is on
branch-2.5, and the prior cherry-pick of "Fix handling of yychar
manipulation in user semantic actions" wasn't adjusted for that
difference.
* data/lalr1.cc (yy::parser::parse): Translate yychar before
every use of yytoken, and add comments explaining this approach.
* tests/conflicts.at (%error-verbose and consistent errors):
Extend to test yychar manipulation with lalr1.cc.
This commit is contained in:
Joel E. Denny
2010-11-07 16:10:09 -05:00
parent 095a1d11ca
commit 3b8378825e
3 changed files with 41 additions and 3 deletions

View File

@@ -692,6 +692,17 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
default:
break;
}
/* User semantic actions sometimes alter yychar, and that requires
that yytoken be updated with the new translation. We take the
approach of translating immediately before every use of yytoken.
One alternative is translating here after every semantic action,
but that translation would be missed if the semantic action
invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
yychar. In the case of YYABORT or YYACCEPT, an incorrect
destructor might then be invoked immediately. In the case of
YYERROR, subsequent parser actions might lead to an incorrect
destructor call or verbose syntax error message before the
lookahead is translated. */
YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
yypop_ (yylen);
@@ -715,6 +726,10 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
yytoken = yytranslate_ (yychar);
/* If not already recovering from an error, report this error. */
if (!yyerrstatus_)
{
@@ -826,7 +841,13 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
yyreturn:
if (yychar != yyempty_)
yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
{
/* Make sure we have latest lookahead translation. See comments
at user semantic actions for why this is necessary. */
yytoken = yytranslate_ (yychar);
yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval,
&yylloc);
}
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */