]> git.saurik.com Git - bison.git/blobdiff - data/glr.c
(YYRHSLOC): New macro, taken from glr.c.
[bison.git] / data / glr.c
index 060b3283e1e67c47c84f7c361882431f791b1617..a6182755af1ae5f1c0fddd0359b21729cd063df6 100644 (file)
@@ -205,13 +205,12 @@ typedef struct YYLTYPE
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 
-/* Default (constant) values used for initialization for null
+/* Default (constant) value used for initialization for null
    right-hand sides.  Unlike the standard yacc.c template,
-   here we set the default values of $$ and $@@ to zeroed-out
-   values.  Since the default value of these quantities is undefined,
-   this behavior is technically correct. */
+   here we set the default value of $$ to a zeroed-out value.
+   Since the default value is undefined, this behavior is
+   technically correct. */
 static YYSTYPE yyval_default;
-static YYLTYPE yyloc_default;
 
 /* Copy the second part of user declarations.  */
 ]b4_post_prologue[
@@ -420,17 +419,29 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
 /* Error token number */
 #define YYTERROR 1
 
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].  */
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   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)                 \
-   ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line,    \
-    (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column,        \
-    (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line,    \
-    (yyCurrent).last_column  = YYRHSLOC(yyRhs, YYN).last_column)
+# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN)                         \
+do {                                                                   \
+  if (YYN)                                                             \
+    {                                                                  \
+      (yyCurrent).first_line   = YYRHSLOC(yyRhs, 1).first_line;                \
+      (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column;      \
+      (yyCurrent).last_line    = YYRHSLOC(yyRhs, YYN).last_line;       \
+      (yyCurrent).last_column  = YYRHSLOC(yyRhs, YYN).last_column;     \
+    }                                                                  \
+  else                                                                 \
+    {                                                                  \
+      (yyCurrent).first_line   = YYRHSLOC(yyRhs, 0).last_line;         \
+      (yyCurrent).first_column = YYRHSLOC(yyRhs, 0).last_column;       \
+      (yyCurrent).last_line    = YYRHSLOC(yyRhs, 0).last_line;         \
+      (yyCurrent).last_column  = YYRHSLOC(yyRhs, 0).last_column;       \
+    }                                                                  \
+} while(0)
 
 /* YY_LOCATION_PRINT -- Print the location on the stream.
    This macro was not mandated originally: define only if we know
@@ -600,6 +611,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;
@@ -691,7 +704,9 @@ yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal)
  *  yyerr for YYERROR, yyabort for YYABORT. */
 static YYRESULTTAG
 yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
-             YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack
+             YYSTYPE* yyvalp,
+             YYLTYPE* yylocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[,
+             yyGLRStack* yystack
               ]b4_user_formals[)
 {
   yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL);
@@ -718,16 +733,12 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
 
   yylow = 1;
   if (yyrhslen == 0)
-    {
-      *yyvalp = yyval_default;
-      *yylocp = yyloc_default;
-    }
+    *yyvalp = yyval_default;
   else
-    {
-      *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
-      YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
-    }
-
+    *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)
     {
@@ -1693,7 +1704,9 @@ yyreportSyntaxError (yyGLRStack* yystack,
    value, and location of the look-ahead.  */
 static void
 yyrecoverSyntaxError (yyGLRStack* yystack,
-                     YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[)
+                     YYSTYPE* yylvalp,
+                     YYLTYPE* yyllocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[
+                     ]b4_user_formals[)
 {
   yySymbol* const yytokenp = yystack->yytokenp;
   size_t yyk;
@@ -1710,6 +1723,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])[);
@@ -1720,8 +1734,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);
@@ -1762,13 +1783,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])[);
@@ -1825,7 +1854,24 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
   if (setjmp (yystack.yyexception_buffer) != 0)
     goto yyDone;
 
-  yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[);
+  yylval = yyval_default;
+]b4_location_if([
+#if YYLTYPE_IS_TRIVIAL
+  yylloc.first_line   = yylloc.last_line   = 1;
+  yylloc.first_column = yylloc.last_column = 0;
+#endif
+])
+m4_ifdef([b4_initial_action], [
+m4_pushdef([b4_at_dollar],     [yylval])dnl
+m4_pushdef([b4_dollar_dollar], [yylloc])dnl
+  /* User initialization code. */
+  b4_initial_action
+m4_popdef([b4_dollar_dollar])dnl
+m4_popdef([b4_at_dollar])dnl
+/* Line __line__ of glr.c.  */
+b4_syncline([@oline@], [@ofile@])])dnl
+[
+  yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc]b4_user_args[);
   yytoken = YYEMPTY;
   yyposn = 0;
 
@@ -1850,6 +1896,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
              yyrule = yydefaultAction (yystate);
              if (yyrule == 0)
                {
+]b4_location_if([[               yystack.yyerror_range[0] = *yyllocp;]])[
                  yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
                  goto yyuser_error;
                }
@@ -1880,6 +1927,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
                }
              else if (yyisErrorAction (yyaction))
                {
+]b4_location_if([[               yystack.yyerror_range[0] = *yyllocp;]])[
                  yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
                  goto yyuser_error;
                }
@@ -1905,6 +1953,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
                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;
            }
@@ -2040,7 +2089,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;])
 ])
 ])