]> git.saurik.com Git - bison.git/commitdiff
* data/glr.c (YYRHSLOC): Move its definition next to its uses.
authorAkim Demaille <akim@epita.fr>
Mon, 25 Oct 2004 10:37:35 +0000 (10:37 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 25 Oct 2004 10:37:35 +0000 (10:37 +0000)
Introduce another definition to address simple location arrays.
(yyGLRStack): New member: yyerror_range.
(yyrecoverSyntaxError, yyparse): Update it.
(yyrecoverSyntaxError): Use it when shifting the error token to
have an accurate range, equivalent to the one computed by both
yacc.c and lalr1.cc.
* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so
that column numbers start at column 0, as per GNU Coding
Standards, the others tests, and the doc.
(_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC):
Adjust to the above change (first column is 0).
And adjust the location of the "<error>", now covering the whole
line.

ChangeLog
NEWS
data/glr.c
tests/cxx-type.at

index be0344ba75d4ddb8c6e0c2dd25f836e6f53767e5..1c82ae20008047389c65c8bb5b921181d207a960 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2004-10-25  Akim Demaille  <akim@epita.fr>
+
+       * data/glr.c (YYRHSLOC): Move its definition next to its uses.
+       Introduce another definition to address simple location arrays.
+       (yyGLRStack): New member: yyerror_range.
+       (yyrecoverSyntaxError, yyparse): Update it.
+       (yyrecoverSyntaxError): Use it when shifting the error token to
+       have an accurate range, equivalent to the one computed by both
+       yacc.c and lalr1.cc.
+       * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so
+       that column numbers start at column 0, as per GNU Coding
+       Standards, the others tests, and the doc.
+       (_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC):
+       Adjust to the above change (first column is 0).
+       And adjust the location of the "<error>", now covering the whole
+       line.
+
 2004-10-22  Akim Demaille  <akim@epita.fr>
        and  Paul Eggert  <eggert@cs.ucla.edu>
 
diff --git a/NEWS b/NEWS
index 36c20426acee0410cc30cc750f70518c6ff3ab26..ddf584734e497c316e2ba68ca7a17e16af0cd2ff 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,7 +8,14 @@ Changes in version 1.875e:
   initializing @$) from yyparse before parsing starts.
 
 * The option `--report=lookahead' was changed to `--report=look-ahead'.
-  The old spelling still works, but is not documented and will be removed.
+  The old spelling still works, but is not documented and will be
+  removed.
+
+* Error token location.
+  During error recovery, the location of the syntax error is updated
+  to cover the whole sequence covered by the error token: it includes
+  the shifted symbols thrown away during the first part of the error
+  recovery, and the lookahead rejected during the second part.
 
 Changes in version 1.875d, 2004-05-21:
 
index 7f4c92165d18e6844b5d10384b162305ef9664a9..6c2f3b129c67b1a5a5d71e0b49ff148a24be529c 100644 (file)
@@ -425,8 +425,6 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
    the previous symbol: RHS[0] (always defined).  */
 
 ]b4_location_if([[
-#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
-
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN)                         \
 do {                                                                   \
@@ -614,6 +612,8 @@ union yyGLRStackItem {
 struct yyGLRStack {
   int yyerrflag;
   int yyerrState;
+]b4_location_if([[  /* To compute the location of the error token,  */
+  YYLTYPE yyerror_range[2];]])[
 ]b4_pure_if(
 [
   int yyerrcnt;
@@ -735,8 +735,9 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
     *yyvalp = yyval_default;
   else
     *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
+# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
   YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
-
+# undef YYRHSLOC
 ]
   switch (yyn)
     {
@@ -1719,6 +1720,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
            while (yystack->yytops.yystates[0] != NULL)
              {
                yyGLRState *yys = yystack->yytops.yystates[0];
+]b4_location_if([[             yystack->yyerror_range[0] = yys->yyloc;]])[
                yydestruct ("Error: popping",
                             yystos[yys->yylrState],
                            &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
@@ -1729,8 +1731,15 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
            yyFail (yystack][]b4_lpure_args[, NULL);
          }
        if (*yytokenp != YYEMPTY)
-         yydestruct ("Error: discarding",
-                      *yytokenp, yylvalp]b4_location_if([, yyllocp])[);
+         {]b4_location_if([[
+           /* We throw away the lookahead, but the error range
+              of the shifted error token must take it into account. */
+           yyGLRState *yys = yystack->yytops.yystates[0];
+           yys->yyloc.last_line   = yyllocp->last_line;
+           yys->yyloc.last_column = yyllocp->last_column;]])[
+           yydestruct ("Error: discarding",
+                       *yytokenp, yylvalp]b4_location_if([, yyllocp])[);
+         }
        YYDPRINTF ((stderr, "Reading a token: "));
        yychar = YYLEX;
        *yytokenp = YYTRANSLATE (yychar);
@@ -1771,13 +1780,21 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
          if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
              && yyisShiftAction (yytable[yyj]))
            {
+             /* Shift the error token having adjusted its location.  */
+             YYLTYPE yyerrloc;]b4_location_if([[
+             yystack->yyerror_range[1] = *yyllocp;
+#             define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK])
+             YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range - 1, 2);
+#             undef YYRHSLOC]])[
              YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
-                              yylvalp, yyllocp);
+                              yylvalp, &yyerrloc);
              yyglrShift (yystack, 0, yytable[yyj],
-                         yys->yyposn, *yylvalp, yyllocp]b4_user_args[);
+                         yys->yyposn, *yylvalp, &yyerrloc]b4_user_args[);
+             yys = yystack->yytops.yystates[0];
              break;
            }
        }
+]b4_location_if([[      yystack->yyerror_range[0] = yys->yyloc;]])[
       yydestruct ("Error: popping",
                  yystos[yys->yylrState],
                  &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
@@ -1876,6 +1893,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
              yyrule = yydefaultAction (yystate);
              if (yyrule == 0)
                {
+]b4_location_if([[               yystack.yyerror_range[0] = *yyllocp;]])[
                  yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
                  goto yyuser_error;
                }
@@ -1906,6 +1924,8 @@ b4_syncline([@oline@], [@ofile@])])dnl
                }
              else if (yyisErrorAction (yyaction))
                {
+                 yyGLRState *yys = yystack.yytops.yystates[0];
+]b4_location_if([[               yystack.yyerror_range[0] = *yyllocp;]])[
                  yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
                  goto yyuser_error;
                }
@@ -1931,6 +1951,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
                yyFail (&yystack][]b4_lpure_args[, "syntax error");
              YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
              YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+]b4_location_if([[           yystack.yyerror_range[0] = *yyllocp;]])[
              yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
              goto yyuser_error;
            }
@@ -2066,7 +2087,7 @@ b4_location_if([
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 
-b4_location_if([m4_if(b4_pure, [0],
+b4_location_if([b4_pure_if([],
 [extern YYLTYPE b4_prefix[]lloc;])
 ])
 ])
index 89afc58a03d87a93aea0a6cce80df75dbe5bd550..057a4eed12d2e47b4f29b283024903e8b9ae0808 100644 (file)
@@ -1,5 +1,5 @@
 # Checking GLR Parsing.                         -*- Autotest -*-
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -123,8 +123,7 @@ yylex (LEX_PARAMETERS)
   int c;
   unsigned int i;
   static int lineNum = 1;
-  static int colNum = 1;
-
+  static int colNum = 0;
 
 #if YYPURE
 # define yylloc (*llocp)
@@ -139,14 +138,14 @@ yylex (LEX_PARAMETERS)
        case EOF:
          return 0;
        case '\t':
-         colNum = 1 + ((colNum + 7) & ~7);
+         colNum = (colNum + 7) & ~7;
          break;
        case ' ': case '\f':
          colNum += 1;
          break;
        case '\n':
          lineNum += 1;
-         colNum = 1;
+         colNum = 0;
          break;
        default:
          {
@@ -267,15 +266,15 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT],
 ]])
 
 m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
-[[3.1-3.6: +(z,q)
-5.1-5.4: <declare>(T,x)
-7.1-7.8: <init-declare>(T,x,y)
-9.1-9.6: =(x,y)
-11.1-11.10: +(<cast>(x,T),y)
-13.1-13.6: <declare>(T,x)
-15.1-15.14: <init-declare>(T,y,+(z,q))
-17.6-17.16: <error>
-19.1-19.6: +(z,q)
+[[3.0-3.5: +(z,q)
+5.0-5.3: <declare>(T,x)
+7.0-7.7: <init-declare>(T,x,y)
+9.0-9.5: =(x,y)
+11.0-11.9: +(<cast>(x,T),y)
+13.0-13.5: <declare>(T,x)
+15.0-15.13: <init-declare>(T,y,+(z,q))
+17.0-17.15: <error>
+19.0-19.5: +(z,q)
 ]])
 
 m4_define([_AT_AMBIG_GLR_OUTPUT],
@@ -291,15 +290,15 @@ m4_define([_AT_AMBIG_GLR_OUTPUT],
 ]])
 
 m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
-[[3.1-3.6: +(z,q)
-5.1-5.4: <declare>(T,x)
-7.1-7.8: <init-declare>(T,x,y)
-9.1-9.6: =(x,y)
-11.1-11.10: +(<cast>(x,T),y)
-13.1-13.6: <OR>(<declare>(T,x),<cast>(x,T))
-15.1-15.14: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.6-17.16: <error>
-19.1-19.6: +(z,q)
+[[3.0-3.5: +(z,q)
+5.0-5.3: <declare>(T,x)
+7.0-7.7: <init-declare>(T,x,y)
+9.0-9.5: =(x,y)
+11.0-11.9: +(<cast>(x,T),y)
+13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
+15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
+17.0-17.15: <error>
+19.0-19.5: +(z,q)
 ]])
 
 m4_define([_AT_GLR_STDERR],