]> git.saurik.com Git - bison.git/blobdiff - data/glr.c
* src/output.c (prepare): Move the definition of `tokens_number',
[bison.git] / data / glr.c
index c2fab0b8d3e71e3628d9b1e763eee419c9bc8d44..e631cb97782fa61233652a79de67014f4443bad0 100644 (file)
@@ -19,6 +19,33 @@ m4_include([c.m4])
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 # 02111-1307  USA
 
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 # 02111-1307  USA
 
+
+## ---------------- ##
+## Default values.  ##
+## ---------------- ##
+
+# Stack parameters.
+m4_define_default([b4_stack_depth_max], [10000])
+m4_define_default([b4_stack_depth_init],  [200])
+
+# Location type.
+m4_define_default([b4_location_type], [yyltype])
+
+# Accumule in b4_lex_param all the yylex arguments.
+# Yes, this is quite ugly...
+m4_define([b4_lex_param],
+m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[yylvalp]]][]dnl
+b4_location_if([, [[YYLTYPE *], [yyllocp]]])])dnl
+m4_ifdef([b4_lex_param], [, ]b4_lex_param)))
+
+m4_define_default([b4_parse_param])
+
+
+## ----------------- ##
+## Semantic Values.  ##
+## ----------------- ##
+
+
 # b4_lhs_value([TYPE])
 # --------------------
 # Expansion of $<TYPE>$.
 # b4_lhs_value([TYPE])
 # --------------------
 # Expansion of $<TYPE>$.
@@ -39,15 +66,6 @@ m4_define([b4_rhs_value],
 ## Locations.  ##
 ## ----------- ##
 
 ## Locations.  ##
 ## ----------- ##
 
-# b4_location_if(IF-TRUE, IF-FALSE)
-# ---------------------------------
-# Expand IF-TRUE, if locations are used, IF-FALSE otherwise.
-m4_define([b4_location_if],
-[m4_if(b4_locations_flag, [1],
-       [$1],
-       [$2])])
-
-
 # b4_lhs_location()
 # -----------------
 # Expansion of @$.
 # b4_lhs_location()
 # -----------------
 # Expansion of @$.
@@ -64,19 +82,6 @@ m4_define([b4_rhs_location],
 
 
 
 
 
 
-## -------------- ##
-## %pure-parser.  ##
-## -------------- ##
-
-# b4_pure_if(IF-TRUE, IF-FALSE)
-# -----------------------------
-# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise.
-m4_define([b4_pure_if],
-[m4_if(b4_pure, [1],
-       [$1],
-       [$2])])
-
-
 ## ------------------- ##
 ## Output file names.  ##
 ## ------------------- ##
 ## ------------------- ##
 ## Output file names.  ##
 ## ------------------- ##
@@ -108,11 +113,12 @@ b4_copyright([Skeleton parser for GLR parsing with Bison], [2002])
 /* This is the parser code for GLR (Generalized LR) parser. */
 
 /* FIXME: minimize these */
 /* This is the parser code for GLR (Generalized LR) parser. */
 
 /* FIXME: minimize these */
-#include <stdlib.h>
+#include <assert.h>
 #include <setjmp.h>
 #include <setjmp.h>
-#include <stdio.h>
 #include <stdarg.h>
 #include <stdarg.h>
-#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 /* Identify Bison output.  */
 #define YYBISON        1
 
 /* Identify Bison output.  */
 #define YYBISON        1
@@ -135,10 +141,10 @@ b4_copyright([Skeleton parser for GLR parsing with Bison], [2002])
 #define yynerrs b4_prefix[]nerrs
 b4_location_if([#define yylloc b4_prefix[]lloc])])
 
 #define yynerrs b4_prefix[]nerrs
 b4_location_if([#define yylloc b4_prefix[]lloc])])
 
-/* Copy the first part of user declarations.  */
-b4_pre_prologue
+b4_token_defines(b4_tokens)
 
 
-b4_token_defines(b4_tokens)[
+/* Copy the first part of user declarations.  */
+b4_pre_prologue[
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -168,12 +174,12 @@ typedef union b4_stype yystype;
 typedef struct yyltype
 {
 ]b4_location_if([
 typedef struct yyltype
 {
 ]b4_location_if([
-  int yyfirst_line;
-  int yyfirst_column;
-  int yylast_line;
-  int yylast_column;])[
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;])[
 } yyltype;
 } yyltype;
-# define YYLTYPE ]b4_ltype[
+# define YYLTYPE ]b4_location_type[
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 
@@ -197,6 +203,12 @@ static YYLTYPE yyloc_default;
 #  define yyfalse 0
 #endif
 
 #  define yyfalse 0
 #endif
 
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
 /*-----------------.
 | GCC extensions.  |
 `-----------------*/
 /*-----------------.
 | GCC extensions.  |
 `-----------------*/
@@ -219,7 +231,7 @@ static YYLTYPE yyloc_default;
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  ]b4_final_state_number[
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  ]b4_final_state_number[
-#define YYFLAG  ]b4_flag[
+/* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   ]b4_last[
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYLAST   ]b4_last[
 
 /* YYNTOKENS -- Number of terminals. */
@@ -332,24 +344,25 @@ static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.  */
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
 #define YYTABLE_NINF ]b4_table_ninf[
 static const ]b4_int_type_for([b4_table])[ yytable[] =
 {
   ]b4_table[
 };
 
 #define YYTABLE_NINF ]b4_table_ninf[
 static const ]b4_int_type_for([b4_table])[ yytable[] =
 {
   ]b4_table[
 };
 
-/* YYCONFLP[YYPACT[STATE-NUM]] -- pointer into yyconfl of start of list
-   of conflicting reductions corresponding to action entry for state
-   STATE-NUM in yytable.  0 means no conflicts.  The list in yyconfl
-   is terminated by a rule number of 0. */
+/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
+   list of conflicting reductions corresponding to action entry for
+   state STATE-NUM in yytable.  0 means no conflicts.  The list in
+   yyconfl is terminated by a rule number of 0.  */
 static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] =
 {
   ]b4_conflict_list_heads[
 };
 
 static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] =
 {
   ]b4_conflict_list_heads[
 };
 
-/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated
-   by 0, pointed into by YYCONFLP. */
+/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by
+   0, pointed into by YYCONFLP.  */
 ]dnl Do not use b4_int_type_for here, since there are places where
 dnl pointers onto yyconfl are taken, which type is "short *".
 dnl We probably ought to introduce a type for confl.
 ]dnl Do not use b4_int_type_for here, since there are places where
 dnl pointers onto yyconfl are taken, which type is "short *".
 dnl We probably ought to introduce a type for confl.
@@ -395,25 +408,17 @@ int yyparse (void);
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN)                 \
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN)                 \
-  yyCurrent.yyfirst_line   = YYRHSLOC(yyRhs,1).yyfirst_line;   \
-  yyCurrent.yyfirst_column = YYRHSLOC(yyRhs,1).yyfirst_column; \
-  yyCurrent.yylast_line    = YYRHSLOC(yyRhs,YYN).yylast_line;  \
-  yyCurrent.yylast_column  = YYRHSLOC(yyRhs,YYN).yylast_column;
+  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;
 #endif
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
 #endif
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
+#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 
 ]b4_pure_if(
 [
 
 ]b4_pure_if(
 [
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (yylvalp, b4_location_if([yyllocp, ])YYLEX_PARAM)
-#else
-# define YYLEX yylex (yylvalp[]b4_location_if([, yyllocp]))
-#endif],
-[#define YYLEX  yylex ()])
-
-b4_pure_if(
-[
 #undef yynerrs
 #define yynerrs (yystack->yyerrcnt)
 #undef yychar
 #undef yynerrs
 #define yynerrs (yystack->yyerrcnt)
 #undef yychar
@@ -455,7 +460,7 @@ int yydebug;
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef        YYINITDEPTH
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef        YYINITDEPTH
-# define YYINITDEPTH ]b4_initdepth[
+# define YYINITDEPTH ]b4_stack_depth_init[
 #endif
 
 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
 #endif
 
 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
@@ -470,7 +475,7 @@ int yydebug;
 #endif
 
 #ifndef YYMAXDEPTH
 #endif
 
 #ifndef YYMAXDEPTH
-# define YYMAXDEPTH ]b4_maxdepth[
+# define YYMAXDEPTH ]b4_stack_depth_max[
 #endif
 
 /* Minimum number of free items on the stack allowed after an
 #endif
 
 /* Minimum number of free items on the stack allowed after an
@@ -691,7 +696,7 @@ yydefaultAction (yyStateNum yystate)
   return yydefact[yystate];
 }
 
   return yydefact[yystate];
 }
 
-/** Set *ACTION to the action to take in STATE on seeing TOKEN.
+/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
  *  Result R means
  *    R < 0:  Reduce on rule -R.
  *    R = 0:  Error.
  *  Result R means
  *    R < 0:  Reduce on rule -R.
  *    R = 0:  Error.
@@ -704,16 +709,21 @@ yygetLRActions (yyStateNum yystate, int yytoken,
                int* yyaction, const short** yyconflicts)
 {
   int yyindex = yypact[yystate] + yytoken;
                int* yyaction, const short** yyconflicts)
 {
   int yyindex = yypact[yystate] + yytoken;
-  if (yyindex < 0 || yyindex > YYLAST || yycheck[yyindex] != yytoken)
+  if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
     {
       *yyaction = -yydefact[yystate];
       *yyconflicts = yyconfl;
     }
     {
       *yyaction = -yydefact[yystate];
       *yyconflicts = yyconfl;
     }
-  else
+  else if (yytable[yyindex] != YYTABLE_NINF)
     {
       *yyaction = yytable[yyindex];
       *yyconflicts = yyconfl + yyconflp[yyindex];
     }
     {
       *yyaction = yytable[yyindex];
       *yyconflicts = yyconfl + yyconflp[yyindex];
     }
+  else
+    {
+      *yyaction = 0;
+      *yyconflicts = yyconfl + yyconflp[yyindex];
+    }
 }
 
 static inline yyStateNum
 }
 
 static inline yyStateNum
@@ -721,7 +731,7 @@ yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
 {
   int yyr;
   yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
 {
   int yyr;
   yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
-  if (yyr >= 0 && yyr <= YYLAST && yycheck[yyr] == yystate)
+  if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
     return yytable[yyr];
   else
     return yydefgoto[yylhs - YYNTOKENS];
     return yytable[yyr];
   else
     return yydefgoto[yylhs - YYNTOKENS];
@@ -730,13 +740,13 @@ yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
 static inline bool
 yyisShiftAction (int yyaction)
 {
 static inline bool
 yyisShiftAction (int yyaction)
 {
-  return yyaction > 0;
+  return 0 < yyaction;
 }
 
 static inline bool
 yyisErrorAction (int yyaction)
 {
 }
 
 static inline bool
 yyisErrorAction (int yyaction)
 {
-  return yyaction == 0 || yyaction == YYPACT_NINF;
+  return yyaction == 0;
 }
 
                                /* GLRStates */
 }
 
                                /* GLRStates */
@@ -751,14 +761,14 @@ yyhasResolvedValue (yyGLRState* yystate)
 
 static void
 yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate,
 
 static void
 yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate,
-                    yyGLRState* yyrhs, yyRuleNum yyrule)
+                    yyGLRState* rhs, yyRuleNum yyrule)
 {
   yySemanticOption* yynewItem;
   yynewItem = &yystack->yynextFree->yyoption;
   yystack->yyspaceLeft -= 1;
   yystack->yynextFree += 1;
   yynewItem->yyisState = yyfalse;
 {
   yySemanticOption* yynewItem;
   yynewItem = &yystack->yynextFree->yyoption;
   yystack->yyspaceLeft -= 1;
   yystack->yynextFree += 1;
   yynewItem->yyisState = yyfalse;
-  yynewItem->yystate = yyrhs;
+  yynewItem->yystate = rhs;
   yynewItem->yyrule = yyrule;
   yynewItem->yynext = yystate->yysemantics.yyfirstVal;
   yystate->yysemantics.yyfirstVal = yynewItem;
   yynewItem->yyrule = yyrule;
   yynewItem->yynext = yystate->yysemantics.yyfirstVal;
   yystate->yysemantics.yyfirstVal = yynewItem;
@@ -816,14 +826,14 @@ yyexpandGLRStack (yyGLRStack* yystack)
   size_t yysize, yynewSize;
   size_t yyn;
   yysize = yystack->yynextFree - yystack->yyitems;
   size_t yysize, yynewSize;
   size_t yyn;
   yysize = yystack->yynextFree - yystack->yyitems;
-  if (yysize >= YYMAXDEPTH)
+  if (YYMAXDEPTH <= yysize)
     yyFail (yystack, "parsing stack overflow (%d items)", yysize);
   yynewSize = 2*yysize;
     yyFail (yystack, "parsing stack overflow (%d items)", yysize);
   yynewSize = 2*yysize;
-  if (yynewSize > YYMAXDEPTH)
+  if (YYMAXDEPTH < yynewSize)
     yynewSize = YYMAXDEPTH;
   yyinitGLRStack (&yynewStack, yynewSize);
   for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize;
     yynewSize = YYMAXDEPTH;
   yyinitGLRStack (&yynewStack, yynewSize);
   for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize;
-       yyn > 0;
+       0 < yyn;
        yyn -= 1, yyp0 += 1, yyp1 += 1)
     {
       *yyp1 = *yyp0;
        yyn -= 1, yyp0 += 1, yyp1 += 1)
     {
       *yyp1 = *yyp0;
@@ -961,7 +971,7 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn,
  * the (unresolved) semantic value of RHS under the action for RULE. */
 static inline void
 yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
  * the (unresolved) semantic value of RHS under the action for RULE. */
 static inline void
 yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
-                size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
+                size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
 {
   yyGLRStackItem* yynewItem;
 
 {
   yyGLRStackItem* yynewItem;
 
@@ -975,7 +985,7 @@ yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
   yystack->yytops.yystates[yyk] = &yynewItem->yystate;
   yystack->yynextFree += 1;
   yystack->yyspaceLeft -= 1;
   yystack->yytops.yystates[yyk] = &yynewItem->yystate;
   yystack->yynextFree += 1;
   yystack->yyspaceLeft -= 1;
-  yyaddDeferredAction (yystack, &yynewItem->yystate, yyrhs, yyrule);
+  yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule);
 }
 
 /** Pop the symbols consumed by reduction #RULE from the top of stack
 }
 
 /** Pop the symbols consumed by reduction #RULE from the top of stack
@@ -993,7 +1003,7 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule,
   if (yystack->yysplitPoint == NULL)
     {
       /* Standard special case: single stack. */
   if (yystack->yysplitPoint == NULL)
     {
       /* Standard special case: single stack. */
-      yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk];
+      yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk];
       assert (yyk == 0);
       yystack->yynextFree -= yynrhs;
       yystack->yyspaceLeft += yynrhs;
       assert (yyk == 0);
       yystack->yynextFree -= yynrhs;
       yystack->yyspaceLeft += yynrhs;
@@ -1005,17 +1015,17 @@ yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule,
        }
       else
        {
        }
       else
        {
-         *yyvalp = yyrhs[1-yynrhs].yystate.yysemantics.yysval;
-         *yylocp = yyrhs[1-yynrhs].yystate.yyloc;
+         *yyvalp = rhs[1-yynrhs].yystate.yysemantics.yysval;
+         *yylocp = rhs[1-yynrhs].yystate.yyloc;
        }
        }
-      return yyuserAction (yyrule, yynrhs, yyrhs, yyvalp, yylocp, yystack);
+      return yyuserAction (yyrule, yynrhs, rhs, yyvalp, yylocp, yystack);
     }
   else
     {
       int yyi;
       yyGLRState* yys;
       yyGLRStackItem yyrhsVals[YYMAXRHS];
     }
   else
     {
       int yyi;
       yyGLRState* yys;
       yyGLRStackItem yyrhsVals[YYMAXRHS];
-      for (yyi = yynrhs-1, yys = yystack->yytops.yystates[yyk]; yyi >= 0;
+      for (yyi = yynrhs-1, yys = yystack->yytops.yystates[yyk]; 0 <= yyi;
           yyi -= 1, yys = yys->yypred)
        {
          assert (yys->yypred != NULL);
           yyi -= 1, yys = yys->yypred)
        {
          assert (yys->yypred != NULL);
@@ -1062,13 +1072,25 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule,
       YYSTYPE yysval;
       YYLTYPE yyloc;
 
       YYSTYPE yysval;
       YYLTYPE yyloc;
 
+#if YYDEBUG
+      if (yydebug)
+       {
+         int yyi;
+         YYDPRINTF ((stderr, "Reducing stack %d by rule %d (line %d),",
+                     yyk, yyrule - 1, yyrline[yyrule]));
+         /* Print the symbols being reduced, and their result.  */
+         for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+           YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi]));
+         YYFPRINTF (stderr, " -> %s\n", yytokenName (yyr1[yyrule]));
+       }
+#endif
       YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc));
       yyglrShift (yystack, yyk,
                  yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState,
                                 yylhsNonterm (yyrule)),
                yyposn, yysval, &yyloc);
       YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc));
       yyglrShift (yystack, yyk,
                  yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState,
                                 yylhsNonterm (yyrule)),
                yyposn, yysval, &yyloc);
-      YYDPRINTF ((stderr, "Reduced stack %d by rule #%d. Now in state %d.\n",
-                 yyk, yyrule-1, yystack->yytops.yystates[yyk]->yylrState));
+      YYDPRINTF ((stderr, "Stack %d entering state %d\n",
+                 yyk, yystack->yytops.yystates[yyk]->yylrState));
     }
   else
     {
     }
   else
     {
@@ -1078,7 +1100,7 @@ yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule,
       yyStateNum yynewLRState;
 
       for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
       yyStateNum yynewLRState;
 
       for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
-          yyn > 0; yyn -= 1)
+          0 < yyn; yyn -= 1)
        {
          yys = yys->yypred;
          assert (yys != NULL);
        {
          yys = yys->yypred;
          assert (yys != NULL);
@@ -1201,7 +1223,7 @@ yypreference (yySemanticOption* y0, yySemanticOption* y1)
     return 0;
   if (p0 < p1)
     return 3;
     return 0;
   if (p0 < p1)
     return 3;
-  if (p0 > p1)
+  if (p1 < p0)
     return 2;
   return 0;
 }
     return 2;
   return 0;
 }
@@ -1214,7 +1236,7 @@ static YYRESULTTAG
 yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack)
 {
   YYRESULTTAG yyflag;
 yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack)
 {
   YYRESULTTAG yyflag;
-  if (yyn > 0)
+  if (0 < yyn)
     {
       assert (yys->yypred != NULL);
       yyflag = yyresolveStates (yys->yypred, yyn-1, yystack);
     {
       assert (yys->yypred != NULL);
       yyflag = yyresolveStates (yys->yypred, yyn-1, yystack);
@@ -1242,7 +1264,7 @@ yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack,
 
   yynrhs = yyrhsLength (yyopt->yyrule);
   YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack));
 
   yynrhs = yyrhsLength (yyopt->yyrule);
   YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack));
-  for (yyi = yynrhs-1, yys = yyopt->yystate; yyi >= 0;
+  for (yyi = yynrhs-1, yys = yyopt->yystate; 0 <= yyi;
        yyi -= 1, yys = yys->yypred)
     {
       assert (yys->yypred != NULL);
        yyi -= 1, yys = yys->yypred)
     {
       assert (yys->yypred != NULL);
@@ -1255,7 +1277,16 @@ yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack,
 }
 
 #if YYDEBUG
 }
 
 #if YYDEBUG
-static yyGLRState YYLEFTMOST_STATE = { 0, NULL, -1, 0, { NULL } };
+static yyGLRState YYLEFTMOST_STATE =
+  {
+    0, 0, -1, NULL, 0, { NULL },
+    /* yyloc.  */
+    {
+#if YYLTYPE_IS_TRIVIAL
+]b4_location_if([      0, 0, 0, 0])[
+#endif
+    }
+  };
 
 static void yyreportTree (yySemanticOption* yyx, int yyindent)
 {
 
 static void yyreportTree (yySemanticOption* yyx, int yyindent)
 {
@@ -1264,14 +1295,14 @@ static void yyreportTree (yySemanticOption* yyx, int yyindent)
   yyGLRState* yys;
   yyGLRState* yystates[YYMAXRHS];
 
   yyGLRState* yys;
   yyGLRState* yystates[YYMAXRHS];
 
-  for (yyi = yynrhs, yys = yyx->yystate; yyi > 0; yyi -= 1, yys = yys->yypred)
+  for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred)
     yystates[yyi] = yys;
   if (yys == NULL)
     yystates[0] = &YYLEFTMOST_STATE;
   else
     yystates[0] = yys;
 
     yystates[yyi] = yys;
   if (yys == NULL)
     yystates[0] = &YYLEFTMOST_STATE;
   else
     yystates[0] = yys;
 
-  if (yys->yyposn+1 > yyx->yystate->yyposn)
+  if (yyx->yystate->yyposn < yys->yyposn + 1)
     YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n",
               yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
               yyx->yyrule);
     YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n",
               yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
               yyx->yyrule);
@@ -1447,9 +1478,11 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk,
        {
          if (*yytokenp == YYEMPTY)
            {
        {
          if (*yytokenp == YYEMPTY)
            {
+             YYDPRINTF ((stderr, "Reading a token: "));
              yychar = YYLEX;
              *yytokenp = YYTRANSLATE(yychar);
              yychar = YYLEX;
              *yytokenp = YYTRANSLATE(yychar);
-             YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp)));
+             YYDPRINTF ((stderr, "Next token is %s\n",
+                         yytokenName (*yytokenp)));
            }
          yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts);
 
            }
          yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts);
 
@@ -1466,7 +1499,7 @@ yyprocessOneStack (yyGLRStack* yystack, int yyk,
 
          if (yyisShiftAction (yyaction))
            {
 
          if (yyisShiftAction (yyaction))
            {
-             YYDPRINTF ((stderr, "Shifted token %s on stack %d, ",
+             YYDPRINTF ((stderr, "Shifting token %s on stack %d, ",
                          yytokenName (*yytokenp), yyk));
              yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp);
              YYDPRINTF ((stderr, "which is now in state #%d\n",
                          yytokenName (*yytokenp), yyk));
              yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp);
              YYDPRINTF ((stderr, "which is now in state #%d\n",
@@ -1497,7 +1530,8 @@ yyreportParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
     {
 #if YYERROR_VERBOSE
       yySymbol* const yytokenp = yystack->yytokenp;
     {
 #if YYERROR_VERBOSE
       yySymbol* const yytokenp = yystack->yytokenp;
-      int yyn, yyx, yycount, yysize;
+      int yyn, yyx, yycount;
+      size_t yysize;
       const char* yyprefix;
       char* yyp;
       char* yymsg;
       const char* yyprefix;
       char* yyp;
       char* yymsg;
@@ -1516,15 +1550,17 @@ yyreportParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
              yysize += strlen (yytokenName (yyx)) + strlen (yyprefix),
                yycount += 1, yyprefix = " or ";
          yymsg = yyp = (char*) malloc (yysize);
              yysize += strlen (yytokenName (yyx)) + strlen (yyprefix),
                yycount += 1, yyprefix = " or ";
          yymsg = yyp = (char*) malloc (yysize);
-         yyp += sprintf (yyp, "parse error, unexpected %s",
-                         yytokenName (*yytokenp));
+         sprintf (yyp, "parse error, unexpected %s",
+                  yytokenName (*yytokenp));
+         yyp += strlen (yyp);
          if (yycount < 5)
            {
              yyprefix = ", expecting ";
              for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1)
          if (yycount < 5)
            {
              yyprefix = ", expecting ";
              for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1)
-               if (yycheck[yyx + yyn] == yyx)
+               if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
                  {
                  {
-                   yyp += sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
+                   sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
+                   yyp += strlen (yyp);
                    yyprefix = " or ";
                  }
            }
                    yyprefix = " or ";
                  }
            }
@@ -1538,13 +1574,9 @@ yyreportParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
     }
 }
 
     }
 }
 
-/* Recover from a syntax error on STACK, assuming that TOKENP,
+/* Recover from a syntax error on YYSTACK, assuming that YYTOKENP,
    YYLVALP, and YYLLOCP point to the syntactic category, semantic
    YYLVALP, and YYLLOCP point to the syntactic category, semantic
-   value, and location of the lookahead.
-   NOTE: This uses the panic-mode recovery algorithm described in the
-   Bison documentation, which differs from what is in bison.simple.
-   Specifically, this routine performs no reductions before shifting
-   the error token. */
+   value, and location of the lookahead.  */
 static void
 yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
 {
 static void
 yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
 {
@@ -1555,34 +1587,34 @@ yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
   if (yystack->yyerrState == 0)
     yystack->yyerrState = 3;
   else if (yystack->yyerrState == 3)
   if (yystack->yyerrState == 0)
     yystack->yyerrState = 3;
   else if (yystack->yyerrState == 3)
-    {
-      /* We just shifted the error token and (perhaps) took some
-        reductions. Skip tokens until we can proceed. */
-      do {
+    /* We just shifted the error token and (perhaps) took some
+       reductions.  Skip tokens until we can proceed.  */
+    while (yytrue)
+      {
        if (*yytokenp == YYEOF)
          yyFail (yystack, NULL);
        if (*yytokenp != YYEMPTY)
          YYDPRINTF ((stderr, "Discarding token %s\n",
                      yytokenName (*yytokenp)));
        if (*yytokenp == YYEOF)
          yyFail (yystack, NULL);
        if (*yytokenp != YYEMPTY)
          YYDPRINTF ((stderr, "Discarding token %s\n",
                      yytokenName (*yytokenp)));
+       YYDPRINTF ((stderr, "Reading a token: "));
        yychar = YYLEX;
        *yytokenp = YYTRANSLATE (yychar);
        yychar = YYLEX;
        *yytokenp = YYTRANSLATE (yychar);
-       YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp)));
+       YYDPRINTF ((stderr, "Next token is %s\n", yytokenName (*yytokenp)));
        yyj = yypact[yystack->yytops.yystates[0]->yylrState];
        if (yyj == YYPACT_NINF)
        yyj = yypact[yystack->yytops.yystates[0]->yylrState];
        if (yyj == YYPACT_NINF)
-         /* Something's not right; we shouldn't be here */
+         /* Something's not right; we shouldn't be here */
          yyFail (yystack, NULL);
        yyj += *yytokenp;
          yyFail (yystack, NULL);
        yyj += *yytokenp;
-       if (yyj < 0 || yyj > YYLAST || yycheck[yyj] != *yytokenp)
+       if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != *yytokenp)
          {
            if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0)
              return;
          }
        else if (yytable[yyj] != 0 && yytable[yyj] != YYTABLE_NINF)
          return;
          {
            if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0)
              return;
          }
        else if (yytable[yyj] != 0 && yytable[yyj] != YYTABLE_NINF)
          return;
-      } while (yytrue);
-    }
+      }
 
 
-  /* Reduce to one stack */
+  /* Reduce to one stack */
   for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1)
     if (yystack->yytops.yystates[yyk] != NULL)
       break;
   for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1)
     if (yystack->yytops.yystates[yyk] != NULL)
       break;
@@ -1648,6 +1680,8 @@ yyparse (YYPARSE_PARAM_ARG)
   yyinitGLRStack (&yystack, YYINITDEPTH);
   yystack.yytokenp = &yytoken;
 
   yyinitGLRStack (&yystack, YYINITDEPTH);
   yystack.yytokenp = &yytoken;
 
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
   if (setjmp (yystack.yyexception_buffer) != 0)
     goto yyDone;
 
   if (setjmp (yystack.yyexception_buffer) != 0)
     goto yyDone;
 
@@ -1657,9 +1691,9 @@ yyparse (YYPARSE_PARAM_ARG)
 
   while (yytrue)
     {
 
   while (yytrue)
     {
-      /* For efficiency, we have two loops, of which the first of which
-       * is specialized to deterministic operation (single stack, no
-       * potential ambiguity). */
+      /* For efficiency, we have two loops, the first of which is
+        specialized to deterministic operation (single stack, no
+        potential ambiguity).  */
 
       /* Standard mode */
       while (yytrue)
 
       /* Standard mode */
       while (yytrue)
@@ -1685,9 +1719,10 @@ yyparse (YYPARSE_PARAM_ARG)
            {
              if (yytoken == YYEMPTY)
                {
            {
              if (yytoken == YYEMPTY)
                {
+                 YYDPRINTF ((stderr, "Reading a token: "));
                  yychar = YYLEX;
                  yytoken = YYTRANSLATE (yychar);
                  yychar = YYLEX;
                  yytoken = YYTRANSLATE (yychar);
-                 YYDPRINTF ((stderr, "Read token %s\n",
+                 YYDPRINTF ((stderr, "Next token is %s\n",
                              yytokenName (yytoken)));
                }
              yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
                              yytokenName (yytoken)));
                }
              yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
@@ -1695,15 +1730,15 @@ yyparse (YYPARSE_PARAM_ARG)
                break;
              if (yyisShiftAction (yyaction))
                {
                break;
              if (yyisShiftAction (yyaction))
                {
-                 YYDPRINTF ((stderr, "Shifted token %s. ",
+                 YYDPRINTF ((stderr, "Shifting token %s, ",
                              yytokenName (yytoken)));
                  if (yytoken != YYEOF)
                    yytoken = YYEMPTY;
                  yyposn += 1;
                  yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp);
                              yytokenName (yytoken)));
                  if (yytoken != YYEOF)
                    yytoken = YYEMPTY;
                  yyposn += 1;
                  yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp);
-                 if (yystack.yyerrState > 0)
+                 if (0 < yystack.yyerrState)
                    yystack.yyerrState -= 1;
                    yystack.yyerrState -= 1;
-                 YYDPRINTF ((stderr, "Now in state #%d\n",
+                 YYDPRINTF ((stderr, "Entering state %d\n",
                              yystack.yytops.yystates[0]->yylrState));
                }
              else if (yyisErrorAction (yyaction))
                              yystack.yytops.yystates[0]->yylrState));
                }
              else if (yyisErrorAction (yyaction))
@@ -1761,20 +1796,19 @@ static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED;
 static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED;
 
 static void
 static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED;
 
 static void
-yypstates (yyGLRState* yyst)
+yy_yypstack (yyGLRState* yys)
 {
 {
-  static void
-  yy_yypstack (yyGLRState* yys)
+  if (yys->yypred)
     {
     {
-      if (yys->yypred == NULL)
-       fprintf (stderr, "%d@%d", yys->yylrState, yys->yyposn);
-      else
-       {
-         yy_yypstack (yys->yypred);
-         fprintf (stderr, " -> %d@%d", yys->yylrState, yys->yyposn);
-       }
+      yy_yypstack (yys->yypred);
+      fprintf (stderr, " -> ");
     }
     }
+  fprintf (stderr, "%d@%lu", yys->yylrState, (unsigned long) yys->yyposn);
+}
 
 
+static void
+yypstates (yyGLRState* yyst)
+{
   if (yyst == NULL)
     fprintf (stderr, "<null>");
   else
   if (yyst == NULL)
     fprintf (stderr, "<null>");
   else
@@ -1799,28 +1833,30 @@ yypdumpstack (yyGLRStack* yystack)
   size_t yyi;
   for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1)
     {
   size_t yyi;
   for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1)
     {
-      fprintf (stderr, "%3d. ", yyp - yystack->yyitems);
+      fprintf (stderr, "%3lu. ", (unsigned long) (yyp - yystack->yyitems));
       if (*(bool*) yyp)
        {
       if (*(bool*) yyp)
        {
-         fprintf (stderr, "Res: %d, LR State: %d, posn: %d, pred: %d",
+         fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
                   yyp->yystate.yyresolved, yyp->yystate.yylrState,
                   yyp->yystate.yyresolved, yyp->yystate.yylrState,
-                  yyp->yystate.yyposn,
-                  YYINDEX(yyp->yystate.yypred));
+                  (unsigned long) yyp->yystate.yyposn,
+                  (long) YYINDEX (yyp->yystate.yypred));
          if (! yyp->yystate.yyresolved)
          if (! yyp->yystate.yyresolved)
-           fprintf (stderr, ", firstVal: %d",
-                    YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
+           fprintf (stderr, ", firstVal: %ld",
+                    (long) YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
        }
       else
        {
        }
       else
        {
-         fprintf (stderr, "Option. rule: %d, state: %d, next: %d",
-                  yyp->yyoption.yyrule, YYINDEX (yyp->yyoption.yystate),
-                  YYINDEX (yyp->yyoption.yynext));
+         fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld",
+                  yyp->yyoption.yyrule,
+                  (long) YYINDEX (yyp->yyoption.yystate),
+                  (long) YYINDEX (yyp->yyoption.yynext));
        }
       fprintf (stderr, "\n");
     }
   fprintf (stderr, "Tops:");
   for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
        }
       fprintf (stderr, "\n");
     }
   fprintf (stderr, "Tops:");
   for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
-    fprintf (stderr, "%d: %d; ", yyi, YYINDEX (yystack->yytops.yystates[yyi]));
+    fprintf (stderr, "%lu: %ld; ", (unsigned long) yyi,
+            (long) YYINDEX (yystack->yytops.yystates[yyi]));
   fprintf (stderr, "\n");
 }
 
   fprintf (stderr, "\n");
 }
 
@@ -1852,10 +1888,10 @@ b4_location_if(
 [#ifndef YYLTYPE
 typedef struct yyltype
 {
 [#ifndef YYLTYPE
 typedef struct yyltype
 {
-  int yyfirst_line;
-  int yyfirst_column;
-  int yylast_line;
-  int yylast_column;
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
 } yyltype;
 # define YYLTYPE yyltype
 #endif
 } yyltype;
 # define YYLTYPE yyltype
 #endif