]> git.saurik.com Git - bison.git/commitdiff
yysyntax_error: adjust prior fixes for branch-2.5's lalr1.cc.
authorJoel E. Denny <joeldenny@joeldenny.org>
Sun, 7 Nov 2010 21:10:09 +0000 (16:10 -0500)
committerJoel E. Denny <joeldenny@joeldenny.org>
Sun, 7 Nov 2010 21:10:09 +0000 (16:10 -0500)
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.

ChangeLog
data/lalr1.cc
tests/conflicts.at

index 0e711e5e83f27119e6a49df6f7aa693269ee907e..1d80e92d775c38d0073afcfb87475213acb923f3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2010-11-07  Joel E. Denny  <jdenny@clemson.edu>
+
+       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.
+
 2010-11-07  Joel E. Denny  <jdenny@clemson.edu>
 
        yysyntax_error: fix for consistent error with lookahead.
 2010-11-07  Joel E. Denny  <jdenny@clemson.edu>
 
        yysyntax_error: fix for consistent error with lookahead.
index 33ab08eeddbfc8051720e96917d3956b0b6eae49..8c91fb6876c807a22cd5ab79233dc1c6f858e860 100644 (file)
@@ -692,6 +692,17 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
        default:
           break;
       }
        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);
     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:
   | 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_)
       {
     /* 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_)
 
   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.  */
 
     /* Do not reclaim the symbols of the rule which action triggered
        this YYABORT or YYACCEPT.  */
index 1d4eb04e8423ab7693e489914ecf9698f570c4e3..f455d1f5627cdd13446a8cdb7ec30e0013231c1d 100644 (file)
@@ -161,6 +161,7 @@ AT_SKEL_JAVA_IF([AT_DATA], [AT_DATA_GRAMMAR])([input.y],
 }]], [[
 
 %code {]AT_SKEL_CC_IF([[
 }]], [[
 
 %code {]AT_SKEL_CC_IF([[
+  #include <cassert>
   #include <string>]], [[
   #include <assert.h>
   #include <stdio.h>
   #include <string>]], [[
   #include <assert.h>
   #include <stdio.h>
@@ -376,7 +377,7 @@ error-reduce:
 ;
 
 consistent-reduction: /*empty*/ {
 ;
 
 consistent-reduction: /*empty*/ {
-  assert (yychar == YYEMPTY);
+  assert (yychar == ]AT_SKEL_CC_IF([[yyempty_]], [[YYEMPTY]])[);
   yylval = 0;
   yychar = 'b';
 } ;
   yylval = 0;
   yychar = 'b';
 } ;
@@ -400,7 +401,11 @@ AT_CONSISTENT_ERRORS_CHECK([[%glr-parser]],
                            [AT_USER_ACTION_GRAMMAR],
                            [AT_USER_ACTION_INPUT],
                            [['b']], [[none]])
                            [AT_USER_ACTION_GRAMMAR],
                            [AT_USER_ACTION_INPUT],
                            [['b']], [[none]])
-# No C++ or Java test because yychar cannot be manipulated by users.
+AT_CONSISTENT_ERRORS_CHECK([[%language "c++"]],
+                           [AT_USER_ACTION_GRAMMAR],
+                           [AT_USER_ACTION_INPUT],
+                           [['b']], [[none]])
+# No Java test because yychar cannot be manipulated by users.
 
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reductions consistent]],
                            [AT_USER_ACTION_GRAMMAR],
 
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reductions consistent]],
                            [AT_USER_ACTION_GRAMMAR],