]> git.saurik.com Git - bison.git/blobdiff - data/glr.c
[defined YYSETJMP]: Don't include <setjmp.h>.
[bison.git] / data / glr.c
index 2d1cbc421dceebf66a7ac91086634b393ce40f1a..d2f192187e99feeab36a1547f5f93f7089be52ba 100644 (file)
@@ -179,7 +179,7 @@ b4_pre_prologue[
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
 ]m4_ifdef([b4_stype],
-[b4_syncline([b4_stype_line], [b4_filename])
+[b4_syncline([b4_stype_line], [b4_file_name])
 typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE;
 /* Line __line__ of glr.c.  */
 b4_syncline([@oline@], [@ofile@])],
@@ -221,7 +221,6 @@ b4_syncline([@oline@], [@ofile@])
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
-#include <setjmp.h>
 
 #ifndef YY_
 # if YYENABLE_NLS
@@ -255,6 +254,13 @@ b4_syncline([@oline@], [@ofile@])
 #define yytrue 1
 #define yyfalse 0
 
+#ifndef YYSETJMP
+# include <setjmp.h>
+# define YYJMP_BUF jmp_buf
+# define YYSETJMP(env) setjmp (env)
+# define YYLONGJMP(env, val) longjmp (env, val)
+#endif
+
 /*-----------------.
 | GCC extensions.  |
 `-----------------*/
@@ -728,7 +734,7 @@ struct yyGLRStack {
   int yyrawchar;
 ])[
   yySymbol* yytokenp;
-  jmp_buf yyexception_buffer;
+  YYJMP_BUF yyexception_buffer;
   yyGLRStackItem* yyitems;
   yyGLRStackItem* yynextFree;
   size_t yyspaceLeft;
@@ -746,7 +752,7 @@ yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
 {
   if (yymsg != NULL)
     yyerror (]b4_yyerror_args[yymsg);
-  longjmp (yystack->yyexception_buffer, 1);
+  YYLONGJMP (yystack->yyexception_buffer, 1);
 }
 
 static void yyMemoryExhausted (yyGLRStack* yystack)
@@ -754,7 +760,7 @@ static void yyMemoryExhausted (yyGLRStack* yystack)
 static void
 yyMemoryExhausted (yyGLRStack* yystack)
 {
-  longjmp (yystack->yyexception_buffer, 2);
+  YYLONGJMP (yystack->yyexception_buffer, 2);
 }
 
 #if YYDEBUG || YYERROR_VERBOSE
@@ -886,13 +892,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)
@@ -1981,9 +2018,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;
@@ -1995,7 +2030,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
 #define YYCHK1(YYE)                                                         \
   do {                                                                      \
     switch (YYE) {                                                          \
-    default:                                                                \
+    case yyok:                                                              \
       break;                                                                \
     case yyabort:                                                           \
       goto yyabortlab;                                                      \
@@ -2003,6 +2038,8 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
       goto yyacceptlab;                                                             \
     case yyerr:                                                                     \
       goto yyuser_error;                                                    \
+    default:                                                                \
+      goto yybuglab;                                                        \
     }                                                                       \
   } while (0)
 
@@ -2050,10 +2087,12 @@ b4_syncline([@oline@], [@ofile@])])dnl
 [
   if (! yyinitGLRStack (&yystack, YYINITDEPTH))
     goto yyexhaustedlab;
-  switch (setjmp (yystack.yyexception_buffer))
+  switch (YYSETJMP (yystack.yyexception_buffer))
     {
+    case 0: break;
     case 1: goto yyabortlab;
     case 2: goto yyexhaustedlab;
+    default: goto yybuglab;
     }
   yystack.yytokenp = &yytoken;
   yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc);
@@ -2158,6 +2197,10 @@ b4_syncline([@oline@], [@ofile@])])dnl
   yyresult = 0;
   goto yyreturn;
 
+ yybuglab:
+  YYASSERT (yyfalse);
+  /* Fall through.  */
+
  yyabortlab:
   yyresult = 1;
   goto yyreturn;
@@ -2183,9 +2226,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
          {
            yyGLRState *yys = yystates[0];
 ]b4_location_if([[       yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
-)[         yydestruct ("Cleanup: 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;
@@ -2279,7 +2320,7 @@ b4_token_defines(b4_tokens)
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
 m4_ifdef([b4_stype],
-[b4_syncline([b4_stype_line], [b4_filename])
+[b4_syncline([b4_stype_line], [b4_file_name])
 typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE;
 /* Line __line__ of glr.c.  */
 b4_syncline([@oline@], [@ofile@])],