]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.c
* data/c.m4 (b4_c_modern): New macro, with a new provision for _MSC_VER.
[bison.git] / src / parse-gram.c
index ed21950ada2d6e4eea793581a4d8cd7131f4f982..2c19d7ceda563c30bf7ba3f428e072fcffe2423d 100644 (file)
@@ -1,7 +1,7 @@
 /* A Bison parser, made by GNU Bison 2.1a.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
 /* A Bison parser, made by GNU Bison 2.1a.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-/* As a special exception, when this parser skeleton is copied by
-   Bison into a Bison output file, you may use that output file
-   without restriction.  This special exception was added by the Free
-   Software Foundation for C LALR(1) parsers in version 1.24 of
-   Bison.  */
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
 
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 #line 1 "parse-gram.y"
 /* Bison Grammar Parser                             -*- C -*-
 
 #line 1 "parse-gram.y"
 /* Bison Grammar Parser                             -*- C -*-
 
-   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    02110-1301  USA
 */
 
    02110-1301  USA
 */
 
+#include <config.h>
 #include "system.h"
 
 #include "complain.h"
 #include "system.h"
 
 #include "complain.h"
@@ -253,17 +253,19 @@ static int current_prec = 0;
 #endif
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
 #endif
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 81 "parse-gram.y"
-typedef union YYSTYPE {
+typedef union YYSTYPE 
+#line 82 "parse-gram.y"
+{
   symbol *symbol;
   symbol_list *list;
   int integer;
   char *chars;
   assoc assoc;
   uniqstr uniqstr;
   symbol *symbol;
   symbol_list *list;
   int integer;
   char *chars;
   assoc assoc;
   uniqstr uniqstr;
-} YYSTYPE;
+}
 /* Line 197 of yacc.c.  */
 /* Line 197 of yacc.c.  */
-#line 267 "parse-gram.c"
+#line 268 "parse-gram.c"
+       YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -287,7 +289,7 @@ typedef struct YYLTYPE
 
 
 /* Line 220 of yacc.c.  */
 
 
 /* Line 220 of yacc.c.  */
-#line 291 "parse-gram.c"
+#line 293 "parse-gram.c"
 
 /* Define YYMODERN_C if this compiler supports C89 or better.  If
    __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
 
 /* Define YYMODERN_C if this compiler supports C89 or better.  If
    __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
@@ -381,14 +383,14 @@ YYID (i)
 # endif
 
 # ifdef YYSTACK_ALLOC
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
+   /* Pacify GCC's `empty if-body' warning.  */
 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
@@ -482,18 +484,18 @@ union yyalloc
    typedef short int yysigned_char;
 #endif
 
    typedef short int yysigned_char;
 #endif
 
-/* YYFINAL -- State number of the termination state. */
+/* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   161
 
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
 #define YYLAST   161
 
-/* YYNTOKENS -- Number of terminals. */
+/* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  52
 #define YYNTOKENS  52
-/* YYNNTS -- Number of nonterminals. */
+/* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  25
 #define YYNNTS  25
-/* YYNRULES -- Number of rules. */
+/* YYNRULES -- Number of rules.  */
 #define YYNRULES  81
 #define YYNRULES  81
-/* YYNRULES -- Number of states. */
+/* YYNRULES -- Number of states.  */
 #define YYNSTATES  110
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYNSTATES  110
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
@@ -555,7 +557,7 @@ static const unsigned char yyprhs[] =
      203,   204
 };
 
      203,   204
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yysigned_char yyrhs[] =
 {
       53,     0,    -1,    54,    48,    66,    76,    -1,    -1,    54,
 static const yysigned_char yyrhs[] =
 {
       53,     0,    -1,    54,    48,    66,    76,    -1,    -1,    54,
@@ -584,21 +586,21 @@ static const yysigned_char yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
-       0,   191,   191,   199,   201,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   220,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   241,   242,   243,   247,   253,   260,   267,   271,   278,
-     278,   283,   283,   288,   298,   313,   314,   315,   319,   320,
-     326,   327,   332,   336,   341,   347,   353,   364,   365,   374,
-     375,   381,   382,   387,   394,   394,   398,   399,   400,   405,
-     406,   408,   410,   412,   414,   419,   420,   424,   430,   439,
-     444,   446
+       0,   192,   192,   200,   202,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   221,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   242,   243,   244,   248,   264,   271,   278,   282,   289,
+     289,   294,   294,   299,   309,   324,   325,   326,   330,   331,
+     337,   338,   343,   347,   352,   358,   364,   375,   376,   385,
+     386,   392,   393,   394,   401,   401,   405,   406,   407,   412,
+     413,   415,   417,   419,   421,   426,   427,   431,   437,   446,
+     451,   453
 };
 #endif
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
 };
 #endif
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   "\"end of file\"", "error", "$undefined", "\"string\"", "\"integer\"",
 static const char *const yytname[] =
 {
   "\"end of file\"", "error", "$undefined", "\"string\"", "\"integer\"",
@@ -683,7 +685,7 @@ static const unsigned char yydefact[] =
        0,     0,     0,    77,    70,    71,    67,    72,    73,    74
 };
 
        0,     0,     0,    77,    70,    71,    67,    72,    73,    74
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
+/* YYDEFGOTO[NTERM-NUM].  */
 static const yysigned_char yydefgoto[] =
 {
       -1,     1,     2,    41,    67,    43,    47,    46,    44,    45,
 static const yysigned_char yydefgoto[] =
 {
       -1,     1,     2,    41,    67,    43,    47,    46,    44,    45,
@@ -806,7 +808,7 @@ do                                                          \
       yychar = (Token);                                                \
       yylval = (Value);                                                \
       yytoken = YYTRANSLATE (yychar);                          \
       yychar = (Token);                                                \
       yylval = (Value);                                                \
       yytoken = YYTRANSLATE (yychar);                          \
-      YYPOPSTACK;                                              \
+      YYPOPSTACK (1);                                          \
       goto yybackup;                                           \
     }                                                          \
   else                                                         \
       goto yybackup;                                           \
     }                                                          \
   else                                                         \
@@ -829,7 +831,7 @@ while (YYID (0))
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)                               \
     do                                                                 \
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)                               \
     do                                                                 \
-      if (N)                                                           \
+      if (YYID (N))                                                    \
        {                                                               \
          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
        {                                                               \
          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
@@ -890,12 +892,13 @@ do {                                                                        \
   if (yydebug)                                                           \
     {                                                                    \
       YYFPRINTF (stderr, "%s ", Title);                                          \
   if (yydebug)                                                           \
     {                                                                    \
       YYFPRINTF (stderr, "%s ", Title);                                          \
-      yysymprint (stderr,                                                \
+      yy_symbol_print (stderr,                                           \
                   Type, Value, Location); \
       YYFPRINTF (stderr, "\n");                                                  \
     }                                                                    \
 } while (YYID (0))
 
                   Type, Value, Location); \
       YYFPRINTF (stderr, "\n");                                                  \
     }                                                                    \
 } while (YYID (0))
 
+
 /*--------------------------------.
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 /*--------------------------------.
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
@@ -903,10 +906,10 @@ do {                                                                        \
 /*ARGSUSED*/
 #if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
 static void
 /*ARGSUSED*/
 #if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
 static void
-yysymprint (FILE *yyoutput, int yytype, const YYSTYPE * const yyvaluep, const YYLTYPE * const yylocationp)
+yy_symbol_value_print (FILE *yyoutput, int yytype, const YYSTYPE * const yyvaluep, const YYLTYPE * const yylocationp)
 #else
 static void
 #else
 static void
-yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
     FILE *yyoutput;
     int yytype;
     const YYSTYPE * const yyvaluep;
     FILE *yyoutput;
     int yytype;
     const YYSTYPE * const yyvaluep;
@@ -915,14 +918,6 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
 {
   YYUSE (yyvaluep);
   YYUSE (yylocationp);
 {
   YYUSE (yyvaluep);
   YYUSE (yylocationp);
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-  YY_LOCATION_PRINT (yyoutput, *yylocationp);
-  YYFPRINTF (yyoutput, ": ");
-
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
@@ -930,98 +925,125 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
   switch (yytype)
     {
       case 3: /* "\"string\"" */
   switch (yytype)
     {
       case 3: /* "\"string\"" */
-#line 168 "parse-gram.y"
+#line 169 "parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 936 "parse-gram.c"
+#line 931 "parse-gram.c"
         break;
       case 4: /* "\"integer\"" */
         break;
       case 4: /* "\"integer\"" */
-#line 181 "parse-gram.y"
+#line 182 "parse-gram.y"
         { fprintf (stderr, "%d", (yyvaluep->integer)); };
         { fprintf (stderr, "%d", (yyvaluep->integer)); };
-#line 941 "parse-gram.c"
+#line 936 "parse-gram.c"
         break;
       case 8: /* "\"%destructor {...}\"" */
         break;
       case 8: /* "\"%destructor {...}\"" */
-#line 170 "parse-gram.y"
+#line 171 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 946 "parse-gram.c"
+#line 941 "parse-gram.c"
         break;
       case 9: /* "\"%printer {...}\"" */
         break;
       case 9: /* "\"%printer {...}\"" */
-#line 174 "parse-gram.y"
+#line 175 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 951 "parse-gram.c"
+#line 946 "parse-gram.c"
         break;
       case 10: /* "\"%union {...}\"" */
         break;
       case 10: /* "\"%union {...}\"" */
-#line 175 "parse-gram.y"
+#line 176 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 956 "parse-gram.c"
+#line 951 "parse-gram.c"
         break;
       case 26: /* "\"%initial-action {...}\"" */
         break;
       case 26: /* "\"%initial-action {...}\"" */
-#line 171 "parse-gram.y"
+#line 172 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 961 "parse-gram.c"
+#line 956 "parse-gram.c"
         break;
       case 27: /* "\"%lex-param {...}\"" */
         break;
       case 27: /* "\"%lex-param {...}\"" */
-#line 172 "parse-gram.y"
+#line 173 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 966 "parse-gram.c"
+#line 961 "parse-gram.c"
         break;
       case 34: /* "\"%parse-param {...}\"" */
         break;
       case 34: /* "\"%parse-param {...}\"" */
-#line 173 "parse-gram.y"
+#line 174 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 971 "parse-gram.c"
+#line 966 "parse-gram.c"
         break;
       case 42: /* "\"type\"" */
         break;
       case 42: /* "\"type\"" */
-#line 179 "parse-gram.y"
+#line 180 "parse-gram.y"
         { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
         { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
-#line 976 "parse-gram.c"
+#line 971 "parse-gram.c"
         break;
       case 46: /* "\"identifier\"" */
         break;
       case 46: /* "\"identifier\"" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 981 "parse-gram.c"
+#line 976 "parse-gram.c"
         break;
       case 47: /* "\"identifier:\"" */
         break;
       case 47: /* "\"identifier:\"" */
-#line 185 "parse-gram.y"
+#line 186 "parse-gram.y"
         { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
         { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
-#line 986 "parse-gram.c"
+#line 981 "parse-gram.c"
         break;
       case 49: /* "\"%{...%}\"" */
         break;
       case 49: /* "\"%{...%}\"" */
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 991 "parse-gram.c"
+#line 986 "parse-gram.c"
         break;
       case 50: /* "\"epilogue\"" */
         break;
       case 50: /* "\"epilogue\"" */
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 996 "parse-gram.c"
+#line 991 "parse-gram.c"
         break;
       case 51: /* "\"{...}\"" */
         break;
       case 51: /* "\"{...}\"" */
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1001 "parse-gram.c"
+#line 996 "parse-gram.c"
         break;
       case 72: /* "symbol" */
         break;
       case 72: /* "symbol" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1006 "parse-gram.c"
+#line 1001 "parse-gram.c"
         break;
       case 73: /* "action" */
         break;
       case 73: /* "action" */
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1011 "parse-gram.c"
+#line 1006 "parse-gram.c"
         break;
       case 74: /* "string_as_id" */
         break;
       case 74: /* "string_as_id" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1016 "parse-gram.c"
+#line 1011 "parse-gram.c"
         break;
       case 75: /* "string_content" */
         break;
       case 75: /* "string_content" */
-#line 168 "parse-gram.y"
+#line 169 "parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1021 "parse-gram.c"
+#line 1016 "parse-gram.c"
         break;
       default:
         break;
     }
         break;
       default:
         break;
     }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, const YYSTYPE * const yyvaluep, const YYLTYPE * const yylocationp)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
+    FILE *yyoutput;
+    int yytype;
+    const YYSTYPE * const yyvaluep;
+    const YYLTYPE * const yylocationp;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  YY_LOCATION_PRINT (yyoutput, *yylocationp);
+  YYFPRINTF (yyoutput, ": ");
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
   YYFPRINTF (yyoutput, ")");
 }
 
   YYFPRINTF (yyoutput, ")");
 }
 
@@ -1041,7 +1063,7 @@ yy_stack_print (bottom, top)
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
+  for (; bottom <= top; ++bottom)
     YYFPRINTF (stderr, " %d", *bottom);
   YYFPRINTF (stderr, "\n");
 }
     YYFPRINTF (stderr, " %d", *bottom);
   YYFPRINTF (stderr, "\n");
 }
@@ -1078,9 +1100,9 @@ yy_reduce_print (yyvsp, yylsp, yyrule
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       fprintf (stderr, "   $%d = ", yyi + 1);
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       fprintf (stderr, "   $%d = ", yyi + 1);
-      yysymprint (stderr, yyrhs[yyprhs[yyrule] + yyi],
-                  &(yyvsp[(yyi + 1) - (yynrhs)])
-                  , &(yylsp[(yyi + 1) - (yynrhs)])               );
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                       &(yyvsp[(yyi + 1) - (yynrhs)])
+                       , &(yylsp[(yyi + 1) - (yynrhs)])                       );
       fprintf (stderr, "\n");
     }
 }
       fprintf (stderr, "\n");
     }
 }
@@ -1450,10 +1472,10 @@ YYLTYPE yylloc;
   YYLTYPE yylsa[YYINITDEPTH];
   YYLTYPE *yyls = yylsa;
   YYLTYPE *yylsp;
   YYLTYPE yylsa[YYINITDEPTH];
   YYLTYPE *yyls = yylsa;
   YYLTYPE *yylsp;
-  /* The locations where the error started and ended. */
+  /* The locations where the error started and ended.  */
   YYLTYPE yyerror_range[2];
 
   YYLTYPE yyerror_range[2];
 
-#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
@@ -1462,9 +1484,9 @@ YYLTYPE yylloc;
   YYSTYPE yyval;
   YYLTYPE yyloc;
 
   YYSTYPE yyval;
   YYLTYPE yyloc;
 
-  /* When reducing, the number of symbols on the RHS of the reduced
-     rule.  */
-  int yylen;
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
@@ -1488,8 +1510,8 @@ YYLTYPE yylloc;
 #endif
 
 
 #endif
 
 
-  /* User initialization code. */
-#line 71 "parse-gram.y"
+  /* User initialization code.  */
+#line 72 "parse-gram.y"
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1498,7 +1520,7 @@ YYLTYPE yylloc;
   yylloc.start.column = yylloc.end.column = 0;
 }
 /* Line 1088 of yacc.c.  */
   yylloc.start.column = yylloc.end.column = 0;
 }
 /* Line 1088 of yacc.c.  */
-#line 1502 "parse-gram.c"
+#line 1524 "parse-gram.c"
   yylsp[0] = yylloc;
   goto yysetstate;
 
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -1507,8 +1529,7 @@ YYLTYPE yylloc;
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
-     have just been pushed. so pushing a state here evens the stacks.
-     */
+     have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
  yysetstate:
   yyssp++;
 
  yysetstate:
@@ -1521,7 +1542,7 @@ YYLTYPE yylloc;
 
 #ifdef yyoverflow
       {
 
 #ifdef yyoverflow
       {
-       /* Give user a chance to reallocate the stack. Use copies of
+       /* Give user a chance to reallocate the stack.  Use copies of
           these so that the &'s don't force the real ones into
           memory.  */
        YYSTYPE *yyvs1 = yyvs;
           these so that the &'s don't force the real ones into
           memory.  */
        YYSTYPE *yyvs1 = yyvs;
@@ -1588,12 +1609,10 @@ YYLTYPE yylloc;
 `-----------*/
 yybackup:
 
 `-----------*/
 yybackup:
 
-/* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
-/* yyresume: */
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
 
   /* First try to decide what to do without reference to look-ahead token.  */
 
   /* First try to decide what to do without reference to look-ahead token.  */
-
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
@@ -1635,22 +1654,21 @@ yybackup:
   if (yyn == YYFINAL)
     YYACCEPT;
 
   if (yyn == YYFINAL)
     YYACCEPT;
 
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
   /* Shift the look-ahead token.  */
   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
   /* Shift the look-ahead token.  */
   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
-  /* Discard the token being shifted unless it is eof.  */
+  /* Discard the shifted token unless it is eof.  */
   if (yychar != YYEOF)
     yychar = YYEMPTY;
 
   if (yychar != YYEOF)
     yychar = YYEMPTY;
 
+  yystate = yyn;
   *++yyvsp = yylval;
   *++yylsp = yylloc;
   *++yyvsp = yylval;
   *++yylsp = yylloc;
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  yystate = yyn;
   goto yynewstate;
 
 
   goto yynewstate;
 
 
@@ -1681,58 +1699,58 @@ 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];
 
-  /* Default location. */
+  /* Default location.  */
   YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 6:
   YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 6:
-#line 206 "parse-gram.y"
+#line 207 "parse-gram.y"
     { prologue_augment ((yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 7:
     { prologue_augment ((yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 7:
-#line 207 "parse-gram.y"
+#line 208 "parse-gram.y"
     { debug_flag = true; }
     break;
 
   case 8:
     { debug_flag = true; }
     break;
 
   case 8:
-#line 208 "parse-gram.y"
+#line 209 "parse-gram.y"
     { muscle_insert ((yyvsp[(2) - (2)].chars), "1"); }
     break;
 
   case 9:
     { muscle_insert ((yyvsp[(2) - (2)].chars), "1"); }
     break;
 
   case 9:
-#line 209 "parse-gram.y"
+#line 210 "parse-gram.y"
     { muscle_insert ((yyvsp[(2) - (3)].chars), (yyvsp[(3) - (3)].chars)); }
     break;
 
   case 10:
     { muscle_insert ((yyvsp[(2) - (3)].chars), (yyvsp[(3) - (3)].chars)); }
     break;
 
   case 10:
-#line 210 "parse-gram.y"
+#line 211 "parse-gram.y"
     { defines_flag = true; }
     break;
 
   case 11:
     { defines_flag = true; }
     break;
 
   case 11:
-#line 211 "parse-gram.y"
+#line 212 "parse-gram.y"
     { error_verbose = true; }
     break;
 
   case 12:
     { error_verbose = true; }
     break;
 
   case 12:
-#line 212 "parse-gram.y"
+#line 213 "parse-gram.y"
     { expected_sr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 13:
     { expected_sr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 13:
-#line 213 "parse-gram.y"
+#line 214 "parse-gram.y"
     { expected_rr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 14:
     { expected_rr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 14:
-#line 214 "parse-gram.y"
+#line 215 "parse-gram.y"
     { spec_file_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 15:
     { spec_file_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 15:
-#line 216 "parse-gram.y"
+#line 217 "parse-gram.y"
     {
     nondeterministic_parser = true;
     glr_parser = true;
     {
     nondeterministic_parser = true;
     glr_parser = true;
@@ -1740,95 +1758,105 @@ yyreduce:
     break;
 
   case 16:
     break;
 
   case 16:
-#line 221 "parse-gram.y"
+#line 222 "parse-gram.y"
     {
     muscle_code_grow ("initial_action", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)]));
   }
     break;
 
   case 17:
     {
     muscle_code_grow ("initial_action", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)]));
   }
     break;
 
   case 17:
-#line 224 "parse-gram.y"
+#line 225 "parse-gram.y"
     { add_param ("lex_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 18:
     { add_param ("lex_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 18:
-#line 225 "parse-gram.y"
+#line 226 "parse-gram.y"
     { locations_flag = true; }
     break;
 
   case 19:
     { locations_flag = true; }
     break;
 
   case 19:
-#line 226 "parse-gram.y"
+#line 227 "parse-gram.y"
     { spec_name_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 20:
     { spec_name_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 20:
-#line 227 "parse-gram.y"
+#line 228 "parse-gram.y"
     { no_lines_flag = true; }
     break;
 
   case 21:
     { no_lines_flag = true; }
     break;
 
   case 21:
-#line 228 "parse-gram.y"
+#line 229 "parse-gram.y"
     { nondeterministic_parser = true; }
     break;
 
   case 22:
     { nondeterministic_parser = true; }
     break;
 
   case 22:
-#line 229 "parse-gram.y"
+#line 230 "parse-gram.y"
     { spec_outfile = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 23:
     { spec_outfile = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 23:
-#line 230 "parse-gram.y"
+#line 231 "parse-gram.y"
     { add_param ("parse_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 24:
     { add_param ("parse_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 24:
-#line 231 "parse-gram.y"
+#line 232 "parse-gram.y"
     { pure_parser = true; }
     break;
 
   case 25:
     { pure_parser = true; }
     break;
 
   case 25:
-#line 232 "parse-gram.y"
+#line 233 "parse-gram.y"
     { version_check (&(yylsp[(2) - (2)]), (yyvsp[(2) - (2)].chars)); }
     break;
 
   case 26:
     { version_check (&(yylsp[(2) - (2)]), (yyvsp[(2) - (2)].chars)); }
     break;
 
   case 26:
-#line 233 "parse-gram.y"
+#line 234 "parse-gram.y"
     { skeleton = (yyvsp[(2) - (2)].chars); }
     break;
 
   case 27:
     { skeleton = (yyvsp[(2) - (2)].chars); }
     break;
 
   case 27:
-#line 234 "parse-gram.y"
+#line 235 "parse-gram.y"
     { token_table_flag = true; }
     break;
 
   case 28:
     { token_table_flag = true; }
     break;
 
   case 28:
-#line 235 "parse-gram.y"
+#line 236 "parse-gram.y"
     { report_flag = report_states; }
     break;
 
   case 29:
     { report_flag = report_states; }
     break;
 
   case 29:
-#line 236 "parse-gram.y"
+#line 237 "parse-gram.y"
     { yacc_flag = true; }
     break;
 
   case 33:
     { yacc_flag = true; }
     break;
 
   case 33:
-#line 244 "parse-gram.y"
+#line 245 "parse-gram.y"
     {
       grammar_start_symbol_set ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]));
     }
     break;
 
   case 34:
     {
       grammar_start_symbol_set ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]));
     }
     break;
 
   case 34:
-#line 248 "parse-gram.y"
+#line 249 "parse-gram.y"
     {
     {
+      char const *body = (yyvsp[(1) - (1)].chars);
+
+      if (typed)
+       {
+         /* Concatenate the union bodies, turning the first one's
+            trailing '}' into '\n', and omitting the second one's '{'.  */
+         char *code = muscle_find ("stype");
+         code[strlen (code) - 1] = '\n';
+         body++;
+       }
+
       typed = true;
       typed = true;
-      MUSCLE_INSERT_INT ("stype_line", (yylsp[(1) - (1)]).start.line);
-      muscle_insert ("stype", (yyvsp[(1) - (1)].chars));
+      muscle_code_grow ("stype", body, (yylsp[(1) - (1)]));
     }
     break;
 
   case 35:
     }
     break;
 
   case 35:
-#line 254 "parse-gram.y"
+#line 265 "parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
@@ -1838,7 +1866,7 @@ yyreduce:
     break;
 
   case 36:
     break;
 
   case 36:
-#line 261 "parse-gram.y"
+#line 272 "parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
@@ -1848,26 +1876,26 @@ yyreduce:
     break;
 
   case 37:
     break;
 
   case 37:
-#line 268 "parse-gram.y"
+#line 279 "parse-gram.y"
     {
       default_prec = true;
     }
     break;
 
   case 38:
     {
       default_prec = true;
     }
     break;
 
   case 38:
-#line 272 "parse-gram.y"
+#line 283 "parse-gram.y"
     {
       default_prec = false;
     }
     break;
 
   case 39:
     {
       default_prec = false;
     }
     break;
 
   case 39:
-#line 278 "parse-gram.y"
+#line 289 "parse-gram.y"
     { current_class = nterm_sym; }
     break;
 
   case 40:
     { current_class = nterm_sym; }
     break;
 
   case 40:
-#line 279 "parse-gram.y"
+#line 290 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1875,12 +1903,12 @@ yyreduce:
     break;
 
   case 41:
     break;
 
   case 41:
-#line 283 "parse-gram.y"
+#line 294 "parse-gram.y"
     { current_class = token_sym; }
     break;
 
   case 42:
     { current_class = token_sym; }
     break;
 
   case 42:
-#line 284 "parse-gram.y"
+#line 295 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1888,7 +1916,7 @@ yyreduce:
     break;
 
   case 43:
     break;
 
   case 43:
-#line 289 "parse-gram.y"
+#line 300 "parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
     {
       symbol_list *list;
       for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
@@ -1898,7 +1926,7 @@ yyreduce:
     break;
 
   case 44:
     break;
 
   case 44:
-#line 299 "parse-gram.y"
+#line 310 "parse-gram.y"
     {
       symbol_list *list;
       ++current_prec;
     {
       symbol_list *list;
       ++current_prec;
@@ -1913,173 +1941,165 @@ yyreduce:
     break;
 
   case 45:
     break;
 
   case 45:
-#line 313 "parse-gram.y"
+#line 324 "parse-gram.y"
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
-#line 314 "parse-gram.y"
+#line 325 "parse-gram.y"
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
-#line 315 "parse-gram.y"
+#line 326 "parse-gram.y"
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
-#line 319 "parse-gram.y"
+#line 330 "parse-gram.y"
     { current_type = NULL; }
     break;
 
   case 49:
     { current_type = NULL; }
     break;
 
   case 49:
-#line 320 "parse-gram.y"
+#line 331 "parse-gram.y"
     { current_type = (yyvsp[(1) - (1)].uniqstr); }
     break;
 
   case 50:
     { current_type = (yyvsp[(1) - (1)].uniqstr); }
     break;
 
   case 50:
-#line 326 "parse-gram.y"
+#line 337 "parse-gram.y"
     { (yyval.list) = symbol_list_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
     break;
 
   case 51:
     { (yyval.list) = symbol_list_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
     break;
 
   case 51:
-#line 327 "parse-gram.y"
+#line 338 "parse-gram.y"
     { (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 52:
     { (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 52:
-#line 333 "parse-gram.y"
+#line 344 "parse-gram.y"
     {
        current_type = (yyvsp[(1) - (1)].uniqstr);
      }
     break;
 
   case 53:
     {
        current_type = (yyvsp[(1) - (1)].uniqstr);
      }
     break;
 
   case 53:
-#line 337 "parse-gram.y"
+#line 348 "parse-gram.y"
     {
     {
-       symbol_class_set ((yyvsp[(1) - (1)].symbol), current_class, (yylsp[(1) - (1)]));
+       symbol_class_set ((yyvsp[(1) - (1)].symbol), current_class, (yylsp[(1) - (1)]), true);
        symbol_type_set ((yyvsp[(1) - (1)].symbol), current_type, (yylsp[(1) - (1)]));
      }
     break;
 
   case 54:
        symbol_type_set ((yyvsp[(1) - (1)].symbol), current_type, (yylsp[(1) - (1)]));
      }
     break;
 
   case 54:
-#line 342 "parse-gram.y"
+#line 353 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]));
+      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true);
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
       symbol_user_token_number_set ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].integer), (yylsp[(2) - (2)]));
     }
     break;
 
   case 55:
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
       symbol_user_token_number_set ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].integer), (yylsp[(2) - (2)]));
     }
     break;
 
   case 55:
-#line 348 "parse-gram.y"
+#line 359 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]));
+      symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true);
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
       symbol_make_alias ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].symbol), (yyloc));
     }
     break;
 
   case 56:
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
       symbol_make_alias ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].symbol), (yyloc));
     }
     break;
 
   case 56:
-#line 354 "parse-gram.y"
+#line 365 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[(1) - (3)].symbol), current_class, (yylsp[(1) - (3)]));
+      symbol_class_set ((yyvsp[(1) - (3)].symbol), current_class, (yylsp[(1) - (3)]), true);
       symbol_type_set ((yyvsp[(1) - (3)].symbol), current_type, (yylsp[(1) - (3)]));
       symbol_user_token_number_set ((yyvsp[(1) - (3)].symbol), (yyvsp[(2) - (3)].integer), (yylsp[(2) - (3)]));
       symbol_make_alias ((yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol), (yyloc));
     }
     break;
 
       symbol_type_set ((yyvsp[(1) - (3)].symbol), current_type, (yylsp[(1) - (3)]));
       symbol_user_token_number_set ((yyvsp[(1) - (3)].symbol), (yyvsp[(2) - (3)].integer), (yylsp[(2) - (3)]));
       symbol_make_alias ((yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol), (yyloc));
     }
     break;
 
-  case 62:
-#line 383 "parse-gram.y"
-    {
-      if (yacc_flag)
-       complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));
-    }
-    break;
-
   case 63:
   case 63:
-#line 388 "parse-gram.y"
+#line 395 "parse-gram.y"
     {
       yyerrok;
     }
     break;
 
   case 64:
     {
       yyerrok;
     }
     break;
 
   case 64:
-#line 394 "parse-gram.y"
+#line 401 "parse-gram.y"
     { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
     break;
 
   case 66:
     { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
     break;
 
   case 66:
-#line 398 "parse-gram.y"
-    { grammar_rule_end ((yylsp[(1) - (1)])); }
+#line 405 "parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(1) - (1)])); }
     break;
 
   case 67:
     break;
 
   case 67:
-#line 399 "parse-gram.y"
-    { grammar_rule_end ((yylsp[(3) - (3)])); }
+#line 406 "parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(3) - (3)])); }
     break;
 
   case 69:
     break;
 
   case 69:
-#line 405 "parse-gram.y"
-    { grammar_rule_begin (current_lhs, current_lhs_location); }
+#line 412 "parse-gram.y"
+    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
     break;
 
   case 70:
     break;
 
   case 70:
-#line 407 "parse-gram.y"
+#line 414 "parse-gram.y"
     { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 71:
     { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 71:
-#line 409 "parse-gram.y"
+#line 416 "parse-gram.y"
     { grammar_current_rule_action_append ((yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])); }
     break;
 
   case 72:
     { grammar_current_rule_action_append ((yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])); }
     break;
 
   case 72:
-#line 411 "parse-gram.y"
+#line 418 "parse-gram.y"
     { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
     break;
 
   case 73:
     { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
     break;
 
   case 73:
-#line 413 "parse-gram.y"
+#line 420 "parse-gram.y"
     { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
     break;
 
   case 74:
     { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
     break;
 
   case 74:
-#line 415 "parse-gram.y"
+#line 422 "parse-gram.y"
     { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
     break;
 
   case 75:
     { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
     break;
 
   case 75:
-#line 419 "parse-gram.y"
+#line 426 "parse-gram.y"
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 76:
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 76:
-#line 420 "parse-gram.y"
+#line 427 "parse-gram.y"
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 77:
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 77:
-#line 425 "parse-gram.y"
+#line 432 "parse-gram.y"
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 78:
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 78:
-#line 431 "parse-gram.y"
+#line 438 "parse-gram.y"
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
-      symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]));
+      symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
     }
     break;
 
   case 79:
     }
     break;
 
   case 79:
-#line 440 "parse-gram.y"
+#line 447 "parse-gram.y"
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 81:
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 81:
-#line 447 "parse-gram.y"
+#line 454 "parse-gram.y"
     {
       muscle_code_grow ("epilogue", (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
       scanner_last_string_free ();
     {
       muscle_code_grow ("epilogue", (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
       scanner_last_string_free ();
@@ -2087,17 +2107,14 @@ yyreduce:
     break;
 
 
     break;
 
 
+/* Line 1277 of yacc.c.  */
+#line 2112 "parse-gram.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
-/* Line __line__ of yacc.c.  */
-#line 2096 "parse-gram.c"
-\f
-  yyvsp -= yylen;
-  yyssp -= yylen;
-  yylsp -= yylen;
-
+  YYPOPSTACK (yylen);
+  yylen = 0;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
@@ -2201,9 +2218,11 @@ yyerrorlab:
      goto yyerrorlab;
 
   yyerror_range[0] = yylsp[1-yylen];
      goto yyerrorlab;
 
   yyerror_range[0] = yylsp[1-yylen];
-  yylsp -= yylen;
-  yyvsp -= yylen;
-  yyssp -= yylen;
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
   yystate = *yyssp;
   goto yyerrlab1;
 
   yystate = *yyssp;
   goto yyerrlab1;
 
@@ -2235,7 +2254,7 @@ yyerrlab1:
       yyerror_range[0] = *yylsp;
       yydestruct ("Error: popping",
                   yystos[yystate], yyvsp, yylsp);
       yyerror_range[0] = *yylsp;
       yydestruct ("Error: popping",
                   yystos[yystate], yyvsp, yylsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
@@ -2247,11 +2266,11 @@ yyerrlab1:
 
   yyerror_range[1] = yylloc;
   /* Using YYLLOC is tempting, but would change the location of
 
   yyerror_range[1] = yylloc;
   /* Using YYLLOC is tempting, but would change the location of
-     the look-ahead.  YYLOC is available though. */
+     the look-ahead.  YYLOC is available though.  */
   YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2);
   *++yylsp = yyloc;
 
   YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2);
   *++yylsp = yyloc;
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -2286,11 +2305,15 @@ yyreturn:
   if (yychar != YYEOF && yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
                 yytoken, &yylval, &yylloc);
   if (yychar != YYEOF && yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
                 yytoken, &yylval, &yylloc);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
                  yystos[*yyssp], yyvsp, yylsp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
                  yystos[*yyssp], yyvsp, yylsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
@@ -2304,7 +2327,7 @@ yyreturn:
 }
 
 
 }
 
 
-#line 453 "parse-gram.y"
+#line 460 "parse-gram.y"