]> git.saurik.com Git - bison.git/blobdiff - data/glr.c
Undo previous change, then add comment as to why the
[bison.git] / data / glr.c
index 080d263cb2bd6f47d64ce3863c0196f0d6f095e8..342e5b16dd58e896c7c85dbbf6a34e4e6ad6152e 100644 (file)
@@ -261,27 +261,23 @@ b4_syncline([@oline@], [@ofile@])
 
 #ifndef __attribute__
 /* This feature is available in gcc versions 2.5 and later.  */
-# if !defined (__GNUC__) || __GNUC__ < 2 || \
-(__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# if (!defined (__GNUC__) || __GNUC__ < 2 \
+      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
 #  define __attribute__(Spec) /* empty */
-# else
-]b4_location_if([#  define YYOPTIONAL_LOC(Name) Name],[
-#  if defined (__cplusplus)
-#   define YYOPTIONAL_LOC(Name) /* empty */
-#  else
-#   define YYOPTIONAL_LOC(Name) Name ATTRIBUTE_UNUSED
-#  endif])[
 # endif
 #endif
 
+]b4_location_if([#define YYOPTIONAL_LOC(Name) Name],[
+#ifdef __cplusplus
+# define YYOPTIONAL_LOC(Name) /* empty */
+#else
+# define YYOPTIONAL_LOC(Name) Name __attribute__ ((__unused__))
+#endif])[
+
 #ifndef YYASSERT
 # define YYASSERT(condition) ((void) ((condition) || (abort (), 0)))
 #endif
 
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  ]b4_final_state_number[
 /* YYLAST -- Last index in YYTABLE.  */
@@ -536,6 +532,7 @@ do {                                                                \
       YYFPRINTF (stderr, "%s ", Title);                                \
       yysymprint (stderr,                                      \
                   Type, Value]b4_location_if([, Location])[);  \
+      YYFPRINTF (stderr, "\n");                                        \
     }                                                          \
 } while (0)
 
@@ -742,6 +739,8 @@ struct yyGLRStack {
 
 static void yyexpandGLRStack (yyGLRStack* yystack);
 
+static void yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
+  __attribute__ ((__noreturn__));
 static void
 yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
 {
@@ -750,6 +749,8 @@ yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
   longjmp (yystack->yyexception_buffer, 1);
 }
 
+static void yyMemoryExhausted (yyGLRStack* yystack)
+  __attribute__ ((__noreturn__));
 static void
 yyMemoryExhausted (yyGLRStack* yystack)
 {
@@ -772,7 +773,7 @@ yytokenName (yySymbol yytoken)
  *  at YYVSP[YYLOW0].yystate.yypred.  Leaves YYVSP[YYLOW1].yystate.yypred
  *  containing the pointer to the next state in the chain. Assumes
  *  YYLOW1 < YYLOW0.  */
-static void yyfillin (yyGLRStackItem *, int, int) ATTRIBUTE_UNUSED;
+static void yyfillin (yyGLRStackItem *, int, int) __attribute__ ((__unused__));
 static void
 yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
 {
@@ -793,7 +794,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
    YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1.
    For convenience, always return YYLOW1.  */
 static inline int yyfill (yyGLRStackItem *, int *, int, yybool)
-     ATTRIBUTE_UNUSED;
+     __attribute__ ((__unused__));
 static inline int
 yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal)
 {
@@ -817,7 +818,8 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
              yyGLRStack* yystack
               ]b4_user_formals[)
 {
-  yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL);
+  yybool yynormal __attribute__ ((__unused__)) =
+    (yystack->yysplitPoint == NULL);
   int yylow;
 
 # undef yyerrok
@@ -884,13 +886,44 @@ yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
 
 ]b4_yydestruct_generate([b4_c_ansi_function_def])[
 
-/** Number of symbols composing the right hand side of rule #RULE. */
+/** Number of symbols composing the right hand side of rule #RULE.  */
 static inline int
 yyrhsLength (yyRuleNum yyrule)
 {
   return yyr2[yyrule];
 }
 
+static void
+yydestroyGLRState (char const *yymsg, yyGLRState *yys)
+{
+  if (yys->yyresolved)
+    yydestruct (yymsg, yystos[yys->yylrState],
+               &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+  else
+    {
+#if YYDEBUG
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "%s unresolved ", yymsg);
+         yysymprint (stderr, yystos[yys->yylrState],
+                     &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+
+      if (yys->yysemantics.yyfirstVal)
+        {
+          yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
+          yyGLRState *yyrhs;
+          int yyn;
+          for (yyrhs = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
+               yyn > 0;
+               yyrhs = yyrhs->yypred, yyn -= 1)
+            yydestroyGLRState (yymsg, yyrhs);
+        }
+    }
+}
+
 /** Left-hand-side symbol for rule #RULE. */
 static inline yySymbol
 yylhsNonterm (yyRuleNum yyrule)
@@ -1575,6 +1608,9 @@ yyreportTree (yySemanticOption* yyx, int yyindent)
 }
 #endif
 
+static void yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1,
+                              yyGLRStack* yystack]b4_pure_formals[)
+  __attribute__ ((__noreturn__));
 static void
 yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1,
                   yyGLRStack* yystack]b4_pure_formals[)
@@ -1602,35 +1638,44 @@ yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack,
                YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
 {
   yySemanticOption* yybest;
-  yySemanticOption* yyp;
+  yySemanticOption** yypp;
   yybool yymerge;
 
   yybest = yyoptionList;
   yymerge = yyfalse;
-  for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext)
+  for (yypp = &yyoptionList->yynext; *yypp != NULL; )
     {
+      yySemanticOption* yyp = *yypp;
+
       if (yyidenticalOptions (yybest, yyp))
-       yymergeOptionSets (yybest, yyp);
+       {
+         yymergeOptionSets (yybest, yyp);
+         *yypp = yyp->yynext;
+       }
       else
-       switch (yypreference (yybest, yyp))
-         {
-         case 0:
-           yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[);
-           break;
-         case 1:
-           yymerge = yytrue;
-           break;
-         case 2:
-           break;
-         case 3:
-           yybest = yyp;
-           yymerge = yyfalse;
-           break;
-         }
+       {
+         switch (yypreference (yybest, yyp))
+           {
+           case 0:
+             yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[);
+             break;
+           case 1:
+             yymerge = yytrue;
+             break;
+           case 2:
+             break;
+           case 3:
+             yybest = yyp;
+             yymerge = yyfalse;
+             break;
+           }
+         yypp = &yyp->yynext;
+       }
     }
 
   if (yymerge)
     {
+      yySemanticOption* yyp;
       int yyprec = yydprec[yybest->yyrule];
       YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[));
       for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext)
@@ -1735,7 +1780,6 @@ yyprocessOneStack (yyGLRStack* yystack, size_t yyk,
              yychar = YYLEX;
              *yytokenp = YYTRANSLATE (yychar);
              YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
-             YYDPRINTF ((stderr, "\n"));
            }
          yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts);
 
@@ -1758,7 +1802,8 @@ yyprocessOneStack (yyGLRStack* yystack, size_t yyk,
              YY_SYMBOL_PRINT ("shifting", *yytokenp, yylvalp, yyllocp);
              yyglrShift (yystack, yyk, yyaction, yyposn+1,
                          *yylvalp, yyllocp);
-             YYDPRINTF ((stderr, ", now in state #%d\n",
+             YYDPRINTF ((stderr, "Stack %lu now in state #%d\n",
+                         (unsigned long int) yyk,
                          yystack->yytops.yystates[yyk]->yylrState));
              break;
            }
@@ -1918,7 +1963,6 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
        yychar = YYLEX;
        *yytokenp = YYTRANSLATE (yychar);
        YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
-       YYDPRINTF ((stderr, "\n"));
        yyj = yypact[yystack->yytops.yystates[0]->yylrState];
        if (yyis_pact_ninf (yyj))
          return;
@@ -1961,7 +2005,6 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
              YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range, 2);]])[
              YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
                               yylvalp, &yyerrloc);
-             YYDPRINTF ((stderr, "\n"));
              yyglrShift (yystack, 0, yytable[yyj],
                          yys->yyposn, *yylvalp, &yyerrloc);
              yys = yystack->yytops.yystates[0];
@@ -1969,9 +2012,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
            }
        }
 ]b4_location_if([[      yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
-      yydestruct ("Error: popping",
-                 yystos[yys->yylrState],
-                 &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+      yydestroyGLRState ("Error: popping", yys);
       yystack->yytops.yystates[0] = yys->yypred;
       yystack->yynextFree -= 1;
       yystack->yyspaceLeft += 1;
@@ -2082,7 +2123,6 @@ b4_syncline([@oline@], [@ofile@])])dnl
                  yychar = YYLEX;
                  yytoken = YYTRANSLATE (yychar);
                   YY_SYMBOL_PRINT ("Next token is", yytoken, yylvalp, yyllocp);
-                  YYDPRINTF ((stderr, "\n"));
                }
              yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
              if (*yyconflicts != 0)
@@ -2090,7 +2130,6 @@ b4_syncline([@oline@], [@ofile@])])dnl
              if (yyisShiftAction (yyaction))
                {
                  YY_SYMBOL_PRINT ("Shifting", yytoken, yylvalp, yyllocp);
-                 YYDPRINTF ((stderr, "\n"));
                  if (yytoken != YYEOF)
                    yytoken = YYEMPTY;
                  yyposn += 1;
@@ -2159,7 +2198,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
 
  yyreturn:
   if (yytoken != YYEOF && yytoken != YYEMPTY)
-    yydestruct ("Error: discarding lookahead",
+    yydestruct ("Cleanup: discarding lookahead",
                 yytoken, yylvalp]b4_location_if([, yyllocp])[);
 
   /* If the stack is well-formed, pop the stack until it is empty,
@@ -2173,9 +2212,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
          {
            yyGLRState *yys = yystates[0];
 ]b4_location_if([[       yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
-)[         yydestruct ("Error: popping",
-                       yystos[yys->yylrState],
-                       &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+)[         yydestroyGLRState ("Cleanup: popping", yys);
            yystates[0] = yys->yypred;
            yystack.yynextFree -= 1;
            yystack.yyspaceLeft += 1;
@@ -2188,8 +2225,9 @@ b4_syncline([@oline@], [@ofile@])])dnl
 
 /* DEBUGGING ONLY */
 #ifdef YYDEBUG
-static void yypstack (yyGLRStack* yystack, size_t yyk) ATTRIBUTE_UNUSED;
-static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED;
+static void yypstack (yyGLRStack* yystack, size_t yyk)
+  __attribute__ ((__unused__));
+static void yypdumpstack (yyGLRStack* yystack) __attribute__ ((__unused__));
 
 static void
 yy_yypstack (yyGLRState* yys)