]> git.saurik.com Git - bison.git/blobdiff - data/bison.simple
* src/symtab.h, src/symtab.c (symbol_t): printer and
[bison.git] / data / bison.simple
index 299623545cfeccb26832b61baad44347222ed230..906f31395d362c46c3992a795dc8a6c666040e8e 100644 (file)
@@ -33,6 +33,20 @@ m4_define([b4_rhs_value],
 [yyvsp@<:@m4_eval([$2 - $1])@:>@m4_ifval([$3], [.$3])])
 
 
 [yyvsp@<:@m4_eval([$2 - $1])@:>@m4_ifval([$3], [.$3])])
 
 
+
+## ----------- ##
+## 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 @$.
@@ -48,6 +62,24 @@ m4_define([b4_rhs_location],
 [yylsp@<:@m4_eval([$2 - $1])@:>@])
 
 
 [yylsp@<:@m4_eval([$2 - $1])@:>@])
 
 
+
+## -------------- ##
+## %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.  ##
+## ------------------- ##
+
 m4_define_default([b4_input_suffix], [.y])
 
 m4_define_default([b4_output_parser_suffix],
 m4_define_default([b4_input_suffix], [.y])
 
 m4_define_default([b4_output_parser_suffix],
@@ -68,6 +100,10 @@ m4_define_default([b4_header_guard],
                                 [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])])
 
 
                                 [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])])
 
 
+## ------------------------- ##
+## Assigning token numbers.  ##
+## ------------------------- ##
+
 # b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 # -----------------------------------------
 # Output the definition of this token as #define.
 # b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 # -----------------------------------------
 # Output the definition of this token as #define.
@@ -167,10 +203,7 @@ m4_if(b4_prefix[], [yy], [],
 #define yychar  b4_prefix[]char
 #define yydebug b4_prefix[]debug
 #define yynerrs b4_prefix[]nerrs
 #define yychar  b4_prefix[]char
 #define yydebug b4_prefix[]debug
 #define yynerrs b4_prefix[]nerrs
-#if YYLSP_NEEDED
-# define yylloc b4_prefix[]lloc
-#endif
-])
+b4_location_if([#define yylloc b4_prefix[]lloc])])
 
 /* Copy the first part of user declarations.  */
 b4_pre_prologue
 
 /* Copy the first part of user declarations.  */
 b4_pre_prologue
@@ -260,9 +293,8 @@ union yyalloc
 {
   short yyss;
   YYSTYPE yyvs;
 {
   short yyss;
   YYSTYPE yyvs;
-# if YYLSP_NEEDED
-  YYLTYPE yyls;
-# endif
+  b4_location_if([  YYLTYPE yyls;
+])dnl
 };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
 };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
@@ -270,15 +302,13 @@ union yyalloc
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
-# if YYLSP_NEEDED
- define YYSTACK_BYTES(N) \
+b4_location_if(
+[# define YYSTACK_BYTES(N) \
      ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
      ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
-      + 2 * YYSTACK_GAP_MAX)
-# else
-#  define YYSTACK_BYTES(N) \
+      + 2 * YYSTACK_GAP_MAX)],
+[# define YYSTACK_BYTES(N) \
      ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
      ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
-      + YYSTACK_GAP_MAX)
-# endif
+      + YYSTACK_GAP_MAX)])
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
@@ -432,14 +462,12 @@ static const short yycheck[[]] =
   b4_check
 };
 
   b4_check
 };
 
-#if YYDEBUG
 /* YYSTOS[[STATE-NUM]] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const b4_uint_type(b4_stos_max) yystos[[]] =
 {
   b4_stos
 };
 /* YYSTOS[[STATE-NUM]] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const b4_uint_type(b4_stos_max) yystos[[]] =
 {
   b4_stos
 };
-#endif
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -507,23 +535,13 @@ while (0)
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
-#if YYPURE
-# if YYLSP_NEEDED
-#  ifdef YYLEX_PARAM
-#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
-#  else
-#   define YYLEX               yylex (&yylval, &yylloc)
-#  endif
-# else /* !YYLSP_NEEDED */
-#  ifdef YYLEX_PARAM
-#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
-#  else
-#   define YYLEX               yylex (&yylval)
-#  endif
-# endif /* !YYLSP_NEEDED */
-#else /* !YYPURE */
-# define YYLEX                 yylex ()
-#endif /* !YYPURE */
+b4_pure_if(
+[#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, b4_location_if([&yylloc, ])YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, b4_location_if([&yylloc, ]))
+#endif],
+[#define YYLEX yylex ()])
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -650,45 +668,42 @@ int yyparse (void);
 # endif
 #endif
 
 # endif
 #endif
 
-/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
-   variables are global, or local to YYPARSE.  */
-
-#define YY_DECL_NON_LSP_VARIABLES                      \
-/* The lookahead symbol.  */                           \
-int yychar;                                            \
-                                                       \
-/* The semantic value of the lookahead symbol.  */     \
-YYSTYPE yylval;                                                \
-                                                       \
-/* Number of parse errors so far.  */                  \
-int yynerrs;
-
-#if YYLSP_NEEDED
-# define YY_DECL_VARIABLES                     \
-YY_DECL_NON_LSP_VARIABLES                      \
-                                               \
-/* Location data for the lookahead symbol.  */ \
-YYLTYPE yylloc;
-#else
-# define YY_DECL_VARIABLES                     \
-YY_DECL_NON_LSP_VARIABLES
+#if defined (__STDC__) || defined (__cplusplus)
+static void yydestructor (int yytype,
+                         YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation]));
+# if YYDEBUG
+static void yysymprint (FILE* out, int yytype,
+                       YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation]));
+# endif
 #endif
 
 #endif
 
-/* If nonreentrant, generate the variables here.  */
+m4_divert_push([KILL])# ======================== M4 code.
+# b4_declare_parser_variables
+# ---------------------------
+# Declare the variables that are global, or local to YYPARSE if
+#  pure-parser
+m4_define([b4_declare_parser_variables],
+[/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;b4_location_if([
+/* Location data for the lookahead symbol.  */
+YYLTYPE yylloc;])
+])
+m4_divert_pop([KILL])dnl# ====================== End of M4 code.
 
 
-#if !YYPURE
-YY_DECL_VARIABLES
-#endif  /* !YYPURE */
+b4_pure_if([],
+           [b4_declare_parser_variables])
 
 int
 yyparse (YYPARSE_PARAM_ARG)
      YYPARSE_PARAM_DECL
 {[
 
 int
 yyparse (YYPARSE_PARAM_ARG)
      YYPARSE_PARAM_DECL
 {[
-  /* If reentrant, generate the variables here.  */
-#if YYPURE
-  YY_DECL_VARIABLES
-#endif  /* !YYPURE */
-
+  ]b4_pure_if([b4_declare_parser_variables])[
   register int yystate;
   register int yyn;
   int yyresult;
   register int yystate;
   register int yyn;
   int yyresult;
@@ -715,27 +730,20 @@ yyparse (YYPARSE_PARAM_ARG)
   YYSTYPE *yyvs = yyvsa;
   register YYSTYPE *yyvsp;
 
   YYSTYPE *yyvs = yyvsa;
   register YYSTYPE *yyvsp;
 
-#if YYLSP_NEEDED
-  /* The location stack.  */
+]b4_location_if(
+[[  /* The location stack.  */
   YYLTYPE yylsa[YYINITDEPTH];
   YYLTYPE *yyls = yylsa;
   YYLTYPE yylsa[YYINITDEPTH];
   YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-#endif
+  YYLTYPE *yylsp;]])[
 
 
-#if YYLSP_NEEDED
-# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
-#else
-# define YYPOPSTACK   (yyvsp--, yyssp--)
-#endif
+#define YYPOPSTACK   (yyvsp--, yyssp--]b4_location_if([, yylsp--])[)
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
-#if YYLSP_NEEDED
-  YYLTYPE yyloc;
-#endif
+]b4_location_if([  YYLTYPE yyloc;])[
 
   /* When reducing, the number of symbols on the RHS of the reduced
      rule.  */
 
   /* When reducing, the number of symbols on the RHS of the reduced
      rule.  */
@@ -755,9 +763,7 @@ yyparse (YYPARSE_PARAM_ARG)
 
   yyssp = yyss;
   yyvsp = yyvs;
 
   yyssp = yyss;
   yyvsp = yyvs;
-#if YYLSP_NEEDED
-  yylsp = yyls;
-#endif
+]b4_location_if([  yylsp = yyls;])[
   goto yysetstate;
 
 /*------------------------------------------------------------.
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -784,25 +790,18 @@ yyparse (YYPARSE_PARAM_ARG)
           memory.  */
        YYSTYPE *yyvs1 = yyvs;
        short *yyss1 = yyss;
           memory.  */
        YYSTYPE *yyvs1 = yyvs;
        short *yyss1 = yyss;
+]b4_location_if([      YYLTYPE *yyls1 = yyls;])[
 
        /* Each stack pointer address is followed by the size of the
 
        /* Each stack pointer address is followed by the size of the
-          data in use in that stack, in bytes.  */
-# if YYLSP_NEEDED
-       YYLTYPE *yyls1 = yyls;
-       /* This used to be a conditional around just the two extra args,
-          but that might be undefined if yyoverflow is a macro.  */
-       yyoverflow ("parser stack overflow",
-                   &yyss1, yysize * sizeof (*yyssp),
-                   &yyvs1, yysize * sizeof (*yyvsp),
-                   &yyls1, yysize * sizeof (*yylsp),
-                   &yystacksize);
-       yyls = yyls1;
-# else
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
        yyoverflow ("parser stack overflow",
                    &yyss1, yysize * sizeof (*yyssp),
                    &yyvs1, yysize * sizeof (*yyvsp),
        yyoverflow ("parser stack overflow",
                    &yyss1, yysize * sizeof (*yyssp),
                    &yyvs1, yysize * sizeof (*yyvsp),
+]b4_location_if([                  &yyls1, yysize * sizeof (*yylsp),])[
                    &yystacksize);
                    &yystacksize);
-# endif
+]b4_location_if([      yyls = yyls1;])[
        yyss = yyss1;
        yyvs = yyvs1;
       }
        yyss = yyss1;
        yyvs = yyvs1;
       }
@@ -825,9 +824,7 @@ yyparse (YYPARSE_PARAM_ARG)
          goto yyoverflowlab;
        YYSTACK_RELOCATE (yyss);
        YYSTACK_RELOCATE (yyvs);
          goto yyoverflowlab;
        YYSTACK_RELOCATE (yyss);
        YYSTACK_RELOCATE (yyvs);
-#  if YYLSP_NEEDED
-       YYSTACK_RELOCATE (yyls);
-#  endif
+]b4_location_if([      YYSTACK_RELOCATE (yyls);])[
 #  undef YYSTACK_RELOCATE
        if (yyss1 != yyssa)
          YYSTACK_FREE (yyss1);
 #  undef YYSTACK_RELOCATE
        if (yyss1 != yyssa)
          YYSTACK_FREE (yyss1);
@@ -837,9 +834,7 @@ yyparse (YYPARSE_PARAM_ARG)
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
-#if YYLSP_NEEDED
-      yylsp = yyls + yysize - 1;
-#endif
+]b4_location_if([      yylsp = yyls + yysize - 1;])[
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
                  (unsigned long int) yystacksize));
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
                  (unsigned long int) yystacksize));
@@ -896,14 +891,9 @@ yybackup:
        which are defined only if `YYDEBUG' is set.  */
       if (yydebug)
        {
        which are defined only if `YYDEBUG' is set.  */
       if (yydebug)
        {
-         YYFPRINTF (stderr, "Next token is %d (%s",
-                    yychar, yytname[yychar1]);
-         /* Give the individual parser a way to print the precise
-            meaning of a token, for further debugging info.  */
-# ifdef YYPRINT
-         YYPRINT (stderr, yychar, yylval);
-# endif
-         YYFPRINTF (stderr, ")\n");
+         YYFPRINTF (stderr, "Next token is ");
+         yysymprint (stderr, yychar1, yylval]b4_location_if([, yyloc])[);
+         YYFPRINTF (stderr, "\n");
        }
 #endif
     }
        }
 #endif
     }
@@ -943,9 +933,7 @@ yybackup:
     yychar = YYEMPTY;
 
   *++yyvsp = yylval;
     yychar = YYEMPTY;
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+]b4_location_if([  *++yylsp = yylloc;])[
 
   /* Count tokens shifted since error; after three, turn off error
      status.  */
 
   /* Count tokens shifted since error; after three, turn off error
      status.  */
@@ -983,10 +971,9 @@ yyreduce:
      GCC warning that YYVAL may be used uninitialized.  */
   yyval = yyvsp[1-yylen];
 
      GCC warning that YYVAL may be used uninitialized.  */
   yyval = yyvsp[1-yylen];
 
-#if YYLSP_NEEDED
-  /* Default location. */
-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-#endif
+]b4_location_if(
+[  /* Default location. */
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);])[
 
 #if YYDEBUG
   /* We have to keep this `#if YYDEBUG', since we use variables which
 
 #if YYDEBUG
   /* We have to keep this `#if YYDEBUG', since we use variables which
@@ -1014,9 +1001,7 @@ yyreduce:
 \f
 [  yyvsp -= yylen;
   yyssp -= yylen;
 \f
 [  yyvsp -= yylen;
   yyssp -= yylen;
-#if YYLSP_NEEDED
-  yylsp -= yylen;
-#endif
+]b4_location_if([  yylsp -= yylen;])[
 
 #if YYDEBUG
   if (yydebug)
 
 #if YYDEBUG
   if (yydebug)
@@ -1030,9 +1015,7 @@ yyreduce:
 #endif
 
   *++yyvsp = yyval;
 #endif
 
   *++yyvsp = yyval;
-#if YYLSP_NEEDED
-  *++yylsp = yyloc;
-#endif
+]b4_location_if([  *++yylsp = yyloc;])[
 
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
 
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
@@ -1120,9 +1103,31 @@ yyerrlab1:
 
       /* Return failure if at end of input.  */
       if (yychar == YYEOF)
 
       /* Return failure if at end of input.  */
       if (yychar == YYEOF)
-       YYABORT;
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+#if YYDEBUG
+             if (yydebug)
+               {
+                 YYFPRINTF (stderr, "Error: popping ");
+                 yysymprint (stderr,
+                             yystos[*yyssp],
+                             *yyvsp]b4_location_if([, *yylsp])[);
+                 YYFPRINTF (stderr, "\n");
+               }
+#endif
+             yydestructor (yystos[*yyssp], *yyvsp]b4_location_if([, *yylsp])[);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
       YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
                  yychar, yytname[yychar1]));
       YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
                  yychar, yytname[yychar1]));
+      yydestructor (yychar1, yylval]b4_location_if([, yylloc])[);
       yychar = YYEMPTY;
     }
 
       yychar = YYEMPTY;
     }
 
@@ -1152,28 +1157,18 @@ yyerrlab1:
 #if YYDEBUG
       if (yydebug)
        {
 #if YYDEBUG
       if (yydebug)
        {
-         if (yystos[yystate] < YYNTOKENS)
-           {
-             YYFPRINTF (stderr, "Error: popping token %d (%s",
-                        yytoknum[yystos[yystate]], yytname[yystos[yystate]]);
-# ifdef YYPRINT
-             YYPRINT (stderr, yytoknum[yystos[yystate]], *yyvsp);
-# endif
-             YYFPRINTF (stderr, ")\n");
-           }
-         else
-           {
-             YYFPRINTF (stderr, "Error: popping nonterminal (%s)\n",
-                        yytname[yystos[yystate]]);
-           }
+         YYFPRINTF (stderr, "Error: popping ");
+         yysymprint (stderr,
+                     yystos[*yyssp],
+                     *yyvsp]b4_location_if([, *yylsp])[);
+         YYFPRINTF (stderr, "\n");
        }
 #endif
 
        }
 #endif
 
+      yydestructor (yystos[yystate], *yyvsp]b4_location_if([, *yylsp])[);
       yyvsp--;
       yystate = *--yyssp;
       yyvsp--;
       yystate = *--yyssp;
-#if YYLSP_NEEDED
-      yylsp--;
-#endif
+]b4_location_if([      yylsp--;])[
 
 #if YYDEBUG
       if (yydebug)
 
 #if YYDEBUG
       if (yydebug)
@@ -1193,9 +1188,7 @@ yyerrlab1:
   YYDPRINTF ((stderr, "Shifting error token, "));
 
   *++yyvsp = yylval;
   YYDPRINTF ((stderr, "Shifting error token, "));
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+]b4_location_if([  *++yylsp = yylloc;])[
 
   yystate = yyn;
   goto yynewstate;
 
   yystate = yyn;
   goto yynewstate;
@@ -1215,13 +1208,15 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
   yyresult = 1;
   goto yyreturn;
 
-/*---------------------------------------------.
-| yyoverflowab -- parser overflow comes here.  |
-`---------------------------------------------*/
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
 yyoverflowlab:
   yyerror ("parser stack overflow");
   yyresult = 2;
   /* Fall through.  */
 yyoverflowlab:
   yyerror ("parser stack overflow");
   yyresult = 2;
   /* Fall through.  */
+#endif
 
 yyreturn:
 #ifndef yyoverflow
 
 yyreturn:
 #ifndef yyoverflow
@@ -1231,6 +1226,81 @@ yyreturn:
   return yyresult;
 ]}
 
   return yyresult;
 ]}
 
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+m4_divert_push([KILL])# M4 code.
+# b4_symbol_destructor(SYMBOL-NUMBER, DESTRUCTOR, TYPE-NAME)
+# ----------------------------------------------------------
+m4_define([b4_symbol_destructor],
+[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl
+m4_pushdef([b4_at_dollar], [yylocation])dnl
+      case $4: /* $3 */
+#line $2 "$1"
+        $5;
+#line __oline__ "__ofile__"
+        break;
+m4_popdef([b4_at_dollar])dnl
+m4_popdef([b4_dollar_dollar])])
+
+m4_divert_pop([KILL])dnl# End of M4 code.
+static void
+yydestructor (int yytype,
+             YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation]))
+{
+  switch (yytype)
+    {
+m4_map([b4_symbol_destructor], m4_defn([b4_symbol_destructors]))dnl
+      default:
+        break;
+    }
+}
+
+
+#if YYDEBUG
+/*---------------------------.
+| Print this symbol on OUT.  |
+`---------------------------*/
+
+m4_divert_push([KILL])# M4 code.
+# b4_symbol_printer(SYMBOL-NUMBER, PRINTER, TYPE-NAME)
+# ----------------------------------------------------------
+m4_define([b4_symbol_printer],
+[m4_pushdef([b4_dollar_dollar], [yyvalue.$6])dnl
+m4_pushdef([b4_at_dollar], [yylocation])dnl
+      case $4: /* $3 */
+#line $2 "$1"
+        $5;
+#line __oline__ "__ofile__"
+        break;
+m4_popdef([b4_at_dollar])dnl
+m4_popdef([b4_dollar_dollar])])
+
+m4_divert_pop([KILL])dnl# End of M4 code.
+static void
+yysymprint (FILE* out, int yytype,
+           YYSTYPE yyvalue[]b4_location_if([, YYLTYPE yylocation]))
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (out, "token %d (%s ", yytoknum[[yytype]], yytname[[yytype]]);
+  else
+    YYFPRINTF (out, "nterm %s (", yytname[[yytype]]);
+# ifdef YYPRINT
+  YYPRINT (out, yytype, yyvalue);
+# else
+  switch (yytype)
+    {
+m4_map([b4_symbol_printer], m4_defn([b4_symbol_printers]))dnl
+      default:
+        break;
+    }
+# endif /* !defined YYPRINT. */
+  YYFPRINTF (out, ")");
+}
+#endif /* YYDEBUG. */
+
 b4_epilogue
 m4_if(b4_defines_flag, 0, [],
 [#output "b4_output_header_name"
 b4_epilogue
 m4_if(b4_defines_flag, 0, [],
 [#output "b4_output_header_name"
@@ -1249,10 +1319,10 @@ typedef union b4_stype yystype;
 # define YYSTYPE yystype
 #endif
 
 # define YYSTYPE yystype
 #endif
 
-m4_if(b4_pure, [0],
+b4_pure_if([],
 [extern YYSTYPE b4_prefix[]lval;])
 
 [extern YYSTYPE b4_prefix[]lval;])
 
-m4_if(b4_locations_flag, [0], [],
+b4_location_if(
 [#ifndef YYLTYPE
 typedef struct yyltype
 {
 [#ifndef YYLTYPE
 typedef struct yyltype
 {