]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.c
* bootstrap: Undo changes to gnulib files that autoreconf made.
[bison.git] / src / parse-gram.c
index ed21950ada2d6e4eea793581a4d8cd7131f4f982..dac1b2e22ba472f6693cda64df65c7bebc73da5b 100644 (file)
@@ -1,7 +1,7 @@
 /* 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
    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.  */
 #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.
 
    02110-1301  USA
 */
 
+#include <config.h>
 #include "system.h"
 
 #include "complain.h"
@@ -253,17 +253,19 @@ static int current_prec = 0;
 #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;
-} YYSTYPE;
+}
 /* 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
@@ -287,27 +289,15 @@ typedef struct YYLTYPE
 
 
 /* Line 220 of yacc.c.  */
-#line 291 "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
-   as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
-   reasons, but it defines __C99__FUNC__ so check that as well.
-   Consider a C++ compiler to be modern if it defines __cplusplus.  */
-#ifndef YYMODERN_C
-# if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
-#  define YYMODERN_C 1
-# else
-#  define YYMODERN_C 0
-# endif
-#endif
+#line 293 "parse-gram.c"
 
 #ifndef YYSIZE_T
 # if defined (__SIZE_TYPE__)
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined (size_t)
 #  define YYSIZE_T size_t
-# elif ! defined (YYSIZE_T) && YYMODERN_C
+# elif ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -340,7 +330,8 @@ typedef struct YYLTYPE
 #ifndef lint
 # define YYID(n) (n)
 #else
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static int
 YYID (int i)
 #else
@@ -370,7 +361,8 @@ YYID (i)
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined (_ALLOCA_H) && ! defined (_STDLIB_H) && YYMODERN_C
+#    if ! defined (_ALLOCA_H) && ! defined (_STDLIB_H) && (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #     ifndef _STDLIB_H
 #      define _STDLIB_H 1
@@ -381,14 +373,14 @@ YYID (i)
 # 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_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
@@ -401,13 +393,15 @@ extern "C" {
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined (malloc) && ! defined (_STDLIB_H) && YYMODERN_C
+#   if ! defined (malloc) && ! defined (_STDLIB_H) && (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined (free) && ! defined (_STDLIB_H)  && YYMODERN_C
+#   if ! defined (free) && ! defined (_STDLIB_H) && (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -476,24 +470,25 @@ union yyalloc
 
 #endif
 
-#if YYMODERN_C
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
    typedef signed char yysigned_char;
 #else
    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
 
-/* YYNTOKENS -- Number of terminals. */
+/* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  52
-/* YYNNTS -- Number of nonterminals. */
+/* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  25
-/* YYNRULES -- Number of rules. */
+/* YYNRULES -- Number of rules.  */
 #define YYNRULES  81
-/* YYNRULES -- Number of states. */
+/* YYNRULES -- Number of states.  */
 #define YYNSTATES  110
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
@@ -555,7 +550,7 @@ static const unsigned char yyprhs[] =
      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,
@@ -584,21 +579,21 @@ static const yysigned_char yyrhs[] =
 /* 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.
-   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\"",
@@ -683,7 +678,7 @@ static const unsigned char yydefact[] =
        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,
@@ -806,7 +801,7 @@ do                                                          \
       yychar = (Token);                                                \
       yylval = (Value);                                                \
       yytoken = YYTRANSLATE (yychar);                          \
-      YYPOPSTACK;                                              \
+      YYPOPSTACK (1);                                          \
       goto yybackup;                                           \
     }                                                          \
   else                                                         \
@@ -829,7 +824,7 @@ while (YYID (0))
 #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;      \
@@ -890,23 +885,25 @@ do {                                                                        \
   if (yydebug)                                                           \
     {                                                                    \
       YYFPRINTF (stderr, "%s ", Title);                                          \
-      yysymprint (stderr,                                                \
+      yy_symbol_print (stderr,                                           \
                   Type, Value, Location); \
       YYFPRINTF (stderr, "\n");                                                  \
     }                                                                    \
 } while (YYID (0))
 
+
 /*--------------------------------.
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 
 /*ARGSUSED*/
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 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
-yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
     FILE *yyoutput;
     int yytype;
     const YYSTYPE * const yyvaluep;
@@ -915,14 +912,6 @@ yysymprint (yyoutput, yytype, yyvaluep, 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);
@@ -930,98 +919,126 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
   switch (yytype)
     {
       case 3: /* "\"string\"" */
-#line 168 "parse-gram.y"
+#line 169 "parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 936 "parse-gram.c"
+#line 925 "parse-gram.c"
         break;
       case 4: /* "\"integer\"" */
-#line 181 "parse-gram.y"
+#line 182 "parse-gram.y"
         { fprintf (stderr, "%d", (yyvaluep->integer)); };
-#line 941 "parse-gram.c"
+#line 930 "parse-gram.c"
         break;
       case 8: /* "\"%destructor {...}\"" */
-#line 170 "parse-gram.y"
+#line 171 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 946 "parse-gram.c"
+#line 935 "parse-gram.c"
         break;
       case 9: /* "\"%printer {...}\"" */
-#line 174 "parse-gram.y"
+#line 175 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 951 "parse-gram.c"
+#line 940 "parse-gram.c"
         break;
       case 10: /* "\"%union {...}\"" */
-#line 175 "parse-gram.y"
+#line 176 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 956 "parse-gram.c"
+#line 945 "parse-gram.c"
         break;
       case 26: /* "\"%initial-action {...}\"" */
-#line 171 "parse-gram.y"
+#line 172 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 961 "parse-gram.c"
+#line 950 "parse-gram.c"
         break;
       case 27: /* "\"%lex-param {...}\"" */
-#line 172 "parse-gram.y"
+#line 173 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 966 "parse-gram.c"
+#line 955 "parse-gram.c"
         break;
       case 34: /* "\"%parse-param {...}\"" */
-#line 173 "parse-gram.y"
+#line 174 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 971 "parse-gram.c"
+#line 960 "parse-gram.c"
         break;
       case 42: /* "\"type\"" */
-#line 179 "parse-gram.y"
+#line 180 "parse-gram.y"
         { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
-#line 976 "parse-gram.c"
+#line 965 "parse-gram.c"
         break;
       case 46: /* "\"identifier\"" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 981 "parse-gram.c"
+#line 970 "parse-gram.c"
         break;
       case 47: /* "\"identifier:\"" */
-#line 185 "parse-gram.y"
+#line 186 "parse-gram.y"
         { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
-#line 986 "parse-gram.c"
+#line 975 "parse-gram.c"
         break;
       case 49: /* "\"%{...%}\"" */
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 991 "parse-gram.c"
+#line 980 "parse-gram.c"
         break;
       case 50: /* "\"epilogue\"" */
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 996 "parse-gram.c"
+#line 985 "parse-gram.c"
         break;
       case 51: /* "\"{...}\"" */
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1001 "parse-gram.c"
+#line 990 "parse-gram.c"
         break;
       case 72: /* "symbol" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1006 "parse-gram.c"
+#line 995 "parse-gram.c"
         break;
       case 73: /* "action" */
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1011 "parse-gram.c"
+#line 1000 "parse-gram.c"
         break;
       case 74: /* "string_as_id" */
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1016 "parse-gram.c"
+#line 1005 "parse-gram.c"
         break;
       case 75: /* "string_content" */
-#line 168 "parse-gram.y"
+#line 169 "parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1021 "parse-gram.c"
+#line 1010 "parse-gram.c"
         break;
       default:
         break;
     }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
+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, ")");
 }
 
@@ -1030,7 +1047,8 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static void
 yy_stack_print (short int *bottom, short int *top)
 #else
@@ -1041,7 +1059,7 @@ yy_stack_print (bottom, top)
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
+  for (; bottom <= top; ++bottom)
     YYFPRINTF (stderr, " %d", *bottom);
   YYFPRINTF (stderr, "\n");
 }
@@ -1057,7 +1075,8 @@ do {                                                              \
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static void
 yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
 #else
@@ -1078,9 +1097,9 @@ yy_reduce_print (yyvsp, yylsp, yyrule
   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");
     }
 }
@@ -1127,13 +1146,15 @@ int yydebug;
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static YYSIZE_T
-#   if YYMODERN_C
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
   YYSIZE_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
@@ -1149,14 +1170,16 @@ yystrlen (yystr)
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static char *
-#   if YYMODERN_C
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1332,7 +1355,8 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
 `-----------------------------------------------*/
 
 /*ARGSUSED*/
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
 #else
@@ -1363,11 +1387,11 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
-# if YYMODERN_C
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
 #if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
@@ -1386,14 +1410,18 @@ int yyparse ();
 `----------*/
 
 #ifdef YYPARSE_PARAM
-# if YYMODERN_C
-int yyparse (void *YYPARSE_PARAM)
-# else
-int yyparse (YYPARSE_PARAM)
-  void *YYPARSE_PARAM;
-# endif
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined (__STDC__) || defined (__C99__FUNC__) \
+     || defined (__cplusplus) || defined (_MSC_VER))
 int
 yyparse (void)
 #else
@@ -1450,10 +1478,10 @@ YYLTYPE yylloc;
   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];
 
-#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
 
   YYSIZE_T yystacksize = YYINITDEPTH;
 
@@ -1462,9 +1490,9 @@ YYLTYPE yylloc;
   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"));
 
@@ -1488,8 +1516,8 @@ YYLTYPE yylloc;
 #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. */
@@ -1497,8 +1525,8 @@ YYLTYPE yylloc;
   yylloc.start.line   = yylloc.end.line   = 1;
   yylloc.start.column = yylloc.end.column = 0;
 }
-/* Line 1088 of yacc.c.  */
-#line 1502 "parse-gram.c"
+/* Line 1056 of yacc.c.  */
+#line 1530 "parse-gram.c"
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -1507,8 +1535,7 @@ YYLTYPE yylloc;
 `------------------------------------------------------------*/
  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:
@@ -1521,7 +1548,7 @@ YYLTYPE yylloc;
 
 #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;
@@ -1588,12 +1615,10 @@ YYLTYPE yylloc;
 `-----------*/
 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.  */
-
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
@@ -1635,22 +1660,21 @@ yybackup:
   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);
 
-  /* Discard the token being shifted unless it is eof.  */
+  /* Discard the shifted token unless it is eof.  */
   if (yychar != YYEOF)
     yychar = YYEMPTY;
 
+  yystate = yyn;
   *++yyvsp = yylval;
   *++yylsp = yylloc;
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  yystate = yyn;
   goto yynewstate;
 
 
@@ -1681,58 +1705,58 @@ yyreduce:
      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:
-#line 206 "parse-gram.y"
+#line 207 "parse-gram.y"
     { 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:
-#line 208 "parse-gram.y"
+#line 209 "parse-gram.y"
     { 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:
-#line 210 "parse-gram.y"
+#line 211 "parse-gram.y"
     { defines_flag = true; }
     break;
 
   case 11:
-#line 211 "parse-gram.y"
+#line 212 "parse-gram.y"
     { 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:
-#line 213 "parse-gram.y"
+#line 214 "parse-gram.y"
     { 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:
-#line 216 "parse-gram.y"
+#line 217 "parse-gram.y"
     {
     nondeterministic_parser = true;
     glr_parser = true;
@@ -1740,95 +1764,105 @@ yyreduce:
     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:
-#line 224 "parse-gram.y"
+#line 225 "parse-gram.y"
     { 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:
-#line 226 "parse-gram.y"
+#line 227 "parse-gram.y"
     { 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:
-#line 228 "parse-gram.y"
+#line 229 "parse-gram.y"
     { 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:
-#line 230 "parse-gram.y"
+#line 231 "parse-gram.y"
     { 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:
-#line 232 "parse-gram.y"
+#line 233 "parse-gram.y"
     { 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:
-#line 234 "parse-gram.y"
+#line 235 "parse-gram.y"
     { token_table_flag = true; }
     break;
 
   case 28:
-#line 235 "parse-gram.y"
+#line 236 "parse-gram.y"
     { report_flag = report_states; }
     break;
 
   case 29:
-#line 236 "parse-gram.y"
+#line 237 "parse-gram.y"
     { 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:
-#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;
-      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:
-#line 254 "parse-gram.y"
+#line 265 "parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
@@ -1838,7 +1872,7 @@ yyreduce:
     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)
@@ -1848,26 +1882,26 @@ yyreduce:
     break;
 
   case 37:
-#line 268 "parse-gram.y"
+#line 279 "parse-gram.y"
     {
       default_prec = true;
     }
     break;
 
   case 38:
-#line 272 "parse-gram.y"
+#line 283 "parse-gram.y"
     {
       default_prec = false;
     }
     break;
 
   case 39:
-#line 278 "parse-gram.y"
+#line 289 "parse-gram.y"
     { current_class = nterm_sym; }
     break;
 
   case 40:
-#line 279 "parse-gram.y"
+#line 290 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1875,12 +1909,12 @@ yyreduce:
     break;
 
   case 41:
-#line 283 "parse-gram.y"
+#line 294 "parse-gram.y"
     { current_class = token_sym; }
     break;
 
   case 42:
-#line 284 "parse-gram.y"
+#line 295 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1888,7 +1922,7 @@ yyreduce:
     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)
@@ -1898,7 +1932,7 @@ yyreduce:
     break;
 
   case 44:
-#line 299 "parse-gram.y"
+#line 310 "parse-gram.y"
     {
       symbol_list *list;
       ++current_prec;
@@ -1913,173 +1947,165 @@ yyreduce:
     break;
 
   case 45:
-#line 313 "parse-gram.y"
+#line 324 "parse-gram.y"
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
-#line 314 "parse-gram.y"
+#line 325 "parse-gram.y"
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
-#line 315 "parse-gram.y"
+#line 326 "parse-gram.y"
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
-#line 319 "parse-gram.y"
+#line 330 "parse-gram.y"
     { 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:
-#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:
-#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:
-#line 333 "parse-gram.y"
+#line 344 "parse-gram.y"
     {
        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:
-#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:
-#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:
-#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;
 
-  case 62:
-#line 383 "parse-gram.y"
-    {
-      if (yacc_flag)
-       complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));
-    }
-    break;
-
   case 63:
-#line 388 "parse-gram.y"
+#line 395 "parse-gram.y"
     {
       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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#line 419 "parse-gram.y"
+#line 426 "parse-gram.y"
     { (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:
-#line 425 "parse-gram.y"
+#line 432 "parse-gram.y"
     { (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)]));
-      symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]));
+      symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false);
     }
     break;
 
   case 79:
-#line 440 "parse-gram.y"
+#line 447 "parse-gram.y"
     { (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 ();
@@ -2087,17 +2113,14 @@ yyreduce:
     break;
 
 
+/* Line 1245 of yacc.c.  */
+#line 2118 "parse-gram.c"
       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;
@@ -2201,9 +2224,11 @@ yyerrorlab:
      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;
 
@@ -2235,7 +2260,7 @@ yyerrlab1:
       yyerror_range[0] = *yylsp;
       yydestruct ("Error: popping",
                   yystos[yystate], yyvsp, yylsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
@@ -2247,11 +2272,11 @@ yyerrlab1:
 
   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;
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -2286,11 +2311,15 @@ yyreturn:
   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);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
@@ -2304,7 +2333,7 @@ yyreturn:
 }
 
 
-#line 453 "parse-gram.y"
+#line 460 "parse-gram.y"