]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.c
During deterministic GLR operation, user actions should be able to
[bison.git] / src / parse-gram.c
index b62ba6bb3468479e2bc3d273fcbb0dd599a7c9e5..2a28ff983d30faa3044b1016e8461abf65082057 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
@@ -23,8 +23,8 @@
    This special exception was added by the Free Software Foundation
    in version 1.24 of Bison.  */
 
    This special exception was added by the Free Software Foundation
    in version 1.24 of Bison.  */
 
-/* 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.  */
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
 
 
 /* Copy the first part of user declarations.  */
 
 
 /* Copy the first part of user declarations.  */
-#line 1 "../../src/parse-gram.y"
+#line 1 "parse-gram.y"
 /* Bison Grammar Parser                             -*- C -*-
 
 /* 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"
 static YYLTYPE lloc_default (YYLTYPE const *, int);
 
 #define YY_LOCATION_PRINT(File, Loc) \
 static YYLTYPE lloc_default (YYLTYPE const *, int);
 
 #define YY_LOCATION_PRINT(File, Loc) \
-          location_print (File, Loc)
+         location_print (File, Loc)
 
 static void version_check (location const *loc, char const *version);
 
 
 static void version_check (location const *loc, char const *version);
 
@@ -221,18 +222,30 @@ static void version_check (location const *loc, char const *version);
    FIXME: depends on the undocumented availability of YYLLOC.  */
 #undef  yyerror
 #define yyerror(Msg) \
    FIXME: depends on the undocumented availability of YYLLOC.  */
 #undef  yyerror
 #define yyerror(Msg) \
-        gram_error (&yylloc, Msg)
+       gram_error (&yylloc, Msg)
 static void gram_error (location const *, char const *);
 
 static void add_param (char const *, char *, location);
 
 static symbol_class current_class = unknown_sym;
 static uniqstr current_type = 0;
 static void gram_error (location const *, char const *);
 
 static void add_param (char const *, char *, location);
 
 static symbol_class current_class = unknown_sym;
 static uniqstr current_type = 0;
-symbol *current_lhs;
-location current_lhs_location;
-assoc current_assoc;
+static symbol *current_lhs;
+static location current_lhs_location;
 static int current_prec = 0;
 
 static int current_prec = 0;
 
+#ifdef UINT_FAST8_MAX
+# define YYTYPE_UINT8 uint_fast8_t
+#endif
+#ifdef INT_FAST8_MAX
+# define YYTYPE_INT8 int_fast8_t
+#endif
+#ifdef UINT_FAST16_MAX
+# define YYTYPE_UINT16 uint_fast16_t
+#endif
+#ifdef INT_FAST16_MAX
+# define YYTYPE_INT16 int_fast16_t
+#endif
+
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -252,24 +265,26 @@ static int current_prec = 0;
 # define YYTOKEN_TABLE 0
 #endif
 
 # define YYTOKEN_TABLE 0
 #endif
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 82 "../../src/parse-gram.y"
-typedef union YYSTYPE {
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 95 "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 196 of yacc.c.  */
-#line 267 "../../src/parse-gram.c"
+}
+/* Line 198 of yacc.c.  */
+#line 281 "parse-gram.c"
+       YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
 
-#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED)
+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
 typedef struct YYLTYPE
 {
   int first_line;
 typedef struct YYLTYPE
 {
   int first_line;
@@ -286,28 +301,47 @@ typedef struct YYLTYPE
 /* Copy the second part of user declarations.  */
 
 
 /* Copy the second part of user declarations.  */
 
 
-/* Line 219 of yacc.c.  */
-#line 291 "../../src/parse-gram.c"
+/* Line 221 of yacc.c.  */
+#line 306 "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
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
 #endif
 
 #ifndef YYSIZE_T
 #endif
 
 #ifndef YYSIZE_T
-# if defined (__SIZE_TYPE__)
+# ifdef __SIZE_TYPE__
 #  define YYSIZE_T __SIZE_TYPE__
 #  define YYSIZE_T __SIZE_TYPE__
-# elif defined (size_t)
+# elif defined size_t
 #  define YYSIZE_T 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
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -330,9 +364,31 @@ typedef struct YYLTYPE
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
-#define YYUSE(e) do {;} while (/*CONSTCOND*/ 0 && (e))
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
 
 
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -340,16 +396,17 @@ typedef struct YYLTYPE
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
-#   elif defined (__BUILTIN_VA_ARG_INCR)
+#   elif defined __BUILTIN_VA_ARG_INCR
 #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
 #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-#   elif defined (_AIX)
+#   elif defined _AIX
 #    define YYSTACK_ALLOC __alloca
 #    define YYSTACK_ALLOC __alloca
-#   elif defined (_MSC_VER)
+#   elif defined _MSC_VER
 #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
 #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
 #    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
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #     ifndef _STDLIB_H
 #      define _STDLIB_H 1
@@ -360,14 +417,14 @@ typedef struct YYLTYPE
 # endif
 
 # ifdef YYSTACK_ALLOC
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* 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.  */
 #  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
@@ -380,13 +437,15 @@ extern "C" {
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
 #  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
 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
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -394,18 +453,18 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 }
 #  endif
 # endif
 }
 #  endif
 # endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
 
 
 
 
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-        || (defined (YYLTYPE_IS_TRIVIAL) && YYLTYPE_IS_TRIVIAL \
-             && defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+        || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
+            && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
+  yytype_int16 yyss;
   YYSTYPE yyvs;
     YYLTYPE yyls;
 };
   YYSTYPE yyvs;
     YYLTYPE yyls;
 };
@@ -416,13 +475,13 @@ union yyalloc
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
       + 2 * YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
       + 2 * YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -433,7 +492,7 @@ union yyalloc
          for (yyi = 0; yyi < (Count); yyi++)   \
            (To)[yyi] = (From)[yyi];            \
        }                                       \
          for (yyi = 0; yyi < (Count); yyi++)   \
            (To)[yyi] = (From)[yyi];            \
        }                                       \
-      while (/*CONSTCOND*/ 0)
+      while (YYID (0))
 #  endif
 # endif
 
 #  endif
 # endif
 
@@ -451,29 +510,23 @@ union yyalloc
        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
        yyptr += yynewbytes / sizeof (*yyptr);                          \
       }                                                                        \
        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
        yyptr += yynewbytes / sizeof (*yyptr);                          \
       }                                                                        \
-    while (/*CONSTCOND*/ 0)
-
-#endif
+    while (YYID (0))
 
 
-#if YYMODERN_C
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
 #endif
 
 #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. */
-#define YYNNTS  25
-/* YYNRULES -- Number of rules. */
-#define YYNRULES  81
-/* YYNRULES -- Number of states. */
-#define YYNSTATES  110
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  26
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  82
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  111
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -483,7 +536,7 @@ union yyalloc
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -521,7 +574,7 @@ static const unsigned char yytranslate[] =
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned char yyprhs[] =
+static const yytype_uint8 yyprhs[] =
 {
        0,     0,     3,     8,     9,    12,    14,    16,    18,    21,
       25,    27,    29,    32,    35,    39,    41,    43,    45,    47,
 {
        0,     0,     3,     8,     9,    12,    14,    16,    18,    21,
       25,    27,    29,    32,    35,    39,    41,    43,    45,    47,
@@ -530,54 +583,54 @@ static const unsigned char yyprhs[] =
       97,   101,   102,   106,   110,   114,   116,   118,   120,   121,
      123,   125,   128,   130,   132,   135,   138,   142,   144,   147,
      149,   152,   154,   157,   160,   161,   165,   167,   171,   174,
       97,   101,   102,   106,   110,   114,   116,   118,   120,   121,
      123,   125,   128,   130,   132,   135,   138,   142,   144,   147,
      149,   152,   154,   157,   160,   161,   165,   167,   171,   174,
-     175,   178,   181,   185,   189,   193,   195,   197,   199,   201,
-     203,   204
+     175,   178,   181,   185,   189,   193,   195,   197,   198,   201,
+     203,   205,   206
 };
 
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yysigned_char yyrhs[] =
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
 {
 {
-      53,     0,    -1,    54,    48,    66,    76,    -1,    -1,    54,
-      55,    -1,    56,    -1,    49,    -1,    17,    -1,    19,    75,
-      -1,    19,    75,    75,    -1,    20,    -1,    21,    -1,    22,
-       4,    -1,    23,     4,    -1,    24,    43,    75,    -1,    25,
-      -1,    26,    -1,    27,    -1,    28,    -1,    29,    43,    75,
-      -1,    31,    -1,    32,    -1,    33,    43,    75,    -1,    34,
-      -1,    35,    -1,    36,    75,    -1,    37,    75,    -1,    39,
+      53,     0,    -1,    54,    48,    66,    77,    -1,    -1,    54,
+      55,    -1,    56,    -1,    49,    -1,    17,    -1,    19,    76,
+      -1,    19,    76,    76,    -1,    20,    -1,    21,    -1,    22,
+       4,    -1,    23,     4,    -1,    24,    43,    76,    -1,    25,
+      -1,    26,    -1,    27,    -1,    28,    -1,    29,    43,    76,
+      -1,    31,    -1,    32,    -1,    33,    43,    76,    -1,    34,
+      -1,    35,    -1,    36,    76,    -1,    37,    76,    -1,    39,
       -1,    40,    -1,    41,    -1,    44,    -1,    60,    -1,    57,
       -1,    38,    72,    -1,    10,    -1,     8,    63,    -1,     9,
       63,    -1,    18,    -1,    30,    -1,    -1,     6,    58,    65,
       -1,    -1,     5,    59,    65,    -1,     7,    42,    63,    -1,
       61,    62,    63,    -1,    11,    -1,    12,    -1,    13,    -1,
       -1,    42,    -1,    72,    -1,    63,    72,    -1,    42,    -1,
       -1,    40,    -1,    41,    -1,    44,    -1,    60,    -1,    57,
       -1,    38,    72,    -1,    10,    -1,     8,    63,    -1,     9,
       63,    -1,    18,    -1,    30,    -1,    -1,     6,    58,    65,
       -1,    -1,     5,    59,    65,    -1,     7,    42,    63,    -1,
       61,    62,    63,    -1,    11,    -1,    12,    -1,    13,    -1,
       -1,    42,    -1,    72,    -1,    63,    72,    -1,    42,    -1,
-      46,    -1,    46,     4,    -1,    46,    74,    -1,    46,     4,
-      74,    -1,    64,    -1,    65,    64,    -1,    67,    -1,    66,
+      46,    -1,    46,     4,    -1,    46,    75,    -1,    46,     4,
+      75,    -1,    64,    -1,    65,    64,    -1,    67,    -1,    66,
       67,    -1,    68,    -1,    56,    44,    -1,     1,    44,    -1,
       -1,    47,    69,    70,    -1,    71,    -1,    70,    45,    71,
       -1,    70,    44,    -1,    -1,    71,    72,    -1,    71,    73,
       -1,    71,    14,    72,    -1,    71,    15,     4,    -1,    71,
       67,    -1,    68,    -1,    56,    44,    -1,     1,    44,    -1,
       -1,    47,    69,    70,    -1,    71,    -1,    70,    45,    71,
       -1,    70,    44,    -1,    -1,    71,    72,    -1,    71,    73,
       -1,    71,    14,    72,    -1,    71,    15,     4,    -1,    71,
-      16,    42,    -1,    46,    -1,    74,    -1,    51,    -1,     3,
-      -1,     3,    -1,    -1,    48,    50,    -1
+      16,    42,    -1,    46,    -1,    75,    -1,    -1,    74,    51,
+      -1,     3,    -1,     3,    -1,    -1,    48,    50,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
 {
-       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,   254,   261,   268,   272,   279,
-     279,   284,   284,   289,   299,   314,   315,   316,   320,   321,
-     327,   328,   333,   337,   342,   348,   354,   365,   366,   375,
-     376,   382,   383,   388,   395,   395,   399,   400,   401,   406,
-     407,   409,   411,   413,   415,   420,   421,   425,   431,   440,
-     445,   447
+       0,   203,   203,   211,   213,   217,   218,   219,   220,   225,
+     226,   227,   228,   229,   230,   231,   236,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   257,   258,   259,   263,   279,   286,   293,   297,   304,
+     304,   309,   309,   314,   324,   339,   340,   341,   345,   346,
+     352,   353,   358,   362,   367,   373,   379,   390,   391,   400,
+     401,   407,   408,   409,   416,   416,   420,   421,   422,   427,
+     428,   430,   431,   433,   435,   440,   441,   457,   457,   463,
+     472,   477,   479
 };
 #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\"",
@@ -597,7 +650,7 @@ static const char *const yytname[] =
   "symbol_declaration", "@1", "@2", "precedence_declaration",
   "precedence_declarator", "type.opt", "symbols.1", "symbol_def",
   "symbol_defs.1", "grammar", "rules_or_grammar_declaration", "rules",
   "symbol_declaration", "@1", "@2", "precedence_declaration",
   "precedence_declarator", "type.opt", "symbols.1", "symbol_def",
   "symbol_defs.1", "grammar", "rules_or_grammar_declaration", "rules",
-  "@3", "rhses.1", "rhs", "symbol", "action", "string_as_id",
+  "@3", "rhses.1", "rhs", "symbol", "action", "@4", "string_as_id",
   "string_content", "epilogue.opt", 0
 };
 #endif
   "string_content", "epilogue.opt", 0
 };
 #endif
@@ -605,7 +658,7 @@ static const char *const yytname[] =
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -617,7 +670,7 @@ static const unsigned short int yytoknum[] =
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const yytype_uint8 yyr1[] =
 {
        0,    52,    53,    54,    54,    55,    55,    55,    55,    55,
       55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
 {
        0,    52,    53,    54,    54,    55,    55,    55,    55,    55,
       55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
@@ -626,12 +679,12 @@ static const unsigned char yyr1[] =
       57,    59,    57,    57,    60,    61,    61,    61,    62,    62,
       63,    63,    64,    64,    64,    64,    64,    65,    65,    66,
       66,    67,    67,    67,    69,    68,    70,    70,    70,    71,
       57,    59,    57,    57,    60,    61,    61,    61,    62,    62,
       63,    63,    64,    64,    64,    64,    64,    65,    65,    66,
       66,    67,    67,    67,    69,    68,    70,    70,    70,    71,
-      71,    71,    71,    71,    71,    72,    72,    73,    74,    75,
-      76,    76
+      71,    71,    71,    71,    71,    72,    72,    74,    73,    75,
+      76,    77,    77
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     4,     0,     2,     1,     1,     1,     2,     3,
        1,     1,     2,     2,     3,     1,     1,     1,     1,     3,
 {
        0,     2,     4,     0,     2,     1,     1,     1,     2,     3,
        1,     1,     2,     2,     3,     1,     1,     1,     1,     3,
@@ -640,40 +693,41 @@ static const unsigned char yyr2[] =
        3,     0,     3,     3,     3,     1,     1,     1,     0,     1,
        1,     2,     1,     1,     2,     2,     3,     1,     2,     1,
        2,     1,     2,     2,     0,     3,     1,     3,     2,     0,
        3,     0,     3,     3,     3,     1,     1,     1,     0,     1,
        1,     2,     1,     1,     2,     2,     3,     1,     2,     1,
        2,     1,     2,     2,     0,     3,     1,     3,     2,     0,
-       2,     2,     3,     3,     3,     1,     1,     1,     1,     1,
-       0,     2
+       2,     2,     3,     3,     3,     1,     1,     0,     2,     1,
+       1,     0,     2
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned char yydefact[] =
+static const yytype_uint8 yydefact[] =
 {
        3,     0,     0,     1,    41,    39,     0,     0,     0,    34,
       45,    46,    47,     7,    37,     0,    10,    11,     0,     0,
        0,    15,    16,    17,    18,     0,    38,    20,    21,     0,
       23,    24,     0,     0,     0,    27,    28,    29,    30,     0,
 {
        3,     0,     0,     1,    41,    39,     0,     0,     0,    34,
       45,    46,    47,     7,    37,     0,    10,    11,     0,     0,
        0,    15,    16,    17,    18,     0,    38,    20,    21,     0,
       23,    24,     0,     0,     0,    27,    28,    29,    30,     0,
-       6,     4,     5,    32,    31,    48,     0,     0,     0,    78,
-      75,    35,    50,    76,    36,    79,     8,    12,    13,     0,
+       6,     4,     5,    32,    31,    48,     0,     0,     0,    79,
+      75,    35,    50,    76,    36,    80,     8,    12,    13,     0,
        0,     0,    25,    26,    33,     0,    64,     0,     0,    59,
       61,    49,     0,    52,    53,    57,    42,    40,    43,    51,
        9,    14,    19,    22,    63,    69,    62,     0,    60,     2,
        0,     0,    25,    26,    33,     0,    64,     0,     0,    59,
       61,    49,     0,    52,    53,    57,    42,    40,    43,    51,
        9,    14,    19,    22,    63,    69,    62,     0,    60,     2,
-      44,    54,    55,    58,    65,    66,    81,    56,    68,    69,
-       0,     0,     0,    77,    70,    71,    67,    72,    73,    74
+      44,    54,    55,    58,    65,    66,    82,    56,    68,    69,
+       0,     0,     0,    70,    71,     0,    67,    72,    73,    74,
+      78
 };
 
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yysigned_char yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
 {
       -1,     1,     2,    41,    67,    43,    47,    46,    44,    45,
       72,    51,    75,    76,    68,    69,    70,    85,    94,    95,
 {
       -1,     1,     2,    41,    67,    43,    47,    46,    44,    45,
       72,    51,    75,    76,    68,    69,    70,    85,    94,    95,
-      52,   105,    53,    56,    89
+      52,   104,   105,    53,    56,    89
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 #define YYPACT_NINF -69
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
 #define YYPACT_NINF -69
-static const yysigned_char yypact[] =
+static const yytype_int8 yypact[] =
 {
      -69,     5,   112,   -69,   -69,   -69,   -35,     0,     0,   -69,
      -69,   -69,   -69,   -69,   -69,    13,   -69,   -69,    20,    31,
 {
      -69,     5,   112,   -69,   -69,   -69,   -35,     0,     0,   -69,
      -69,   -69,   -69,   -69,   -69,    13,   -69,   -69,    20,    31,
@@ -685,32 +739,33 @@ static const yysigned_char yypact[] =
      -69,   -69,     0,   -69,     6,   -69,   -38,   -38,     0,   -69,
      -69,   -69,   -69,   -69,   -69,   -69,   -69,     2,   -69,   -69,
        0,    39,   -69,   -69,   -33,    -1,   -69,   -69,   -69,   -69,
      -69,   -69,     0,   -69,     6,   -69,   -38,   -38,     0,   -69,
      -69,   -69,   -69,   -69,   -69,   -69,   -69,     2,   -69,   -69,
        0,    39,   -69,   -69,   -33,    -1,   -69,   -69,   -69,   -69,
-       0,    44,     1,   -69,   -69,   -69,    -1,   -69,   -69,   -69
+       0,    44,     1,   -69,   -69,     4,    -1,   -69,   -69,   -69,
+     -69
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const yysigned_char yypgoto[] =
+static const yytype_int8 yypgoto[] =
 {
      -69,   -69,   -69,   -69,    47,   -69,   -69,   -69,   -69,   -69,
 {
      -69,   -69,   -69,   -69,    47,   -69,   -69,   -69,   -69,   -69,
-     -69,    -7,   -58,     7,   -69,   -15,   -69,   -69,   -69,   -44,
-     -34,   -69,   -68,    30,   -69
+     -69,    -7,   -58,     7,   -69,   -15,   -69,   -69,   -69,   -42,
+     -34,   -69,   -69,   -68,    30,   -69
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -81
-static const yysigned_char yytable[] =
+#define YYTABLE_NINF -82
+static const yytype_int8 yytable[] =
 {
       64,    54,    49,    49,    73,     3,    92,    48,    74,    49,
       91,    98,    99,   100,   101,   102,    55,    79,    93,    93,
 {
       64,    54,    49,    49,    73,     3,    92,    48,    74,    49,
       91,    98,    99,   100,   101,   102,    55,    79,    93,    93,
-      79,   -80,    65,    97,    57,    59,     4,     5,     6,     7,
+      79,   -81,    65,    97,    57,    59,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    58,    84,    60,    61,    14,
       71,    78,    49,   109,    79,    50,    50,    86,   108,    42,
        8,     9,    10,    11,    12,    58,    84,    60,    61,    14,
       71,    78,    49,   109,    79,    50,    50,    86,   108,    42,
-     103,    26,    96,    88,    77,   106,    79,     0,     0,    34,
-       0,   104,    62,    63,     0,    90,   107,     0,    66,    87,
-      65,     0,   104,     0,     4,     5,     6,     7,     8,     9,
+     -77,    26,    96,    88,    77,   110,    79,   106,     0,    34,
+       0,   103,    62,    63,     0,    90,   107,     0,    66,    87,
+      65,     0,   103,     0,     4,     5,     6,     7,     8,     9,
       10,    11,    12,     0,     0,     0,    80,    14,     0,    81,
       82,    83,     0,     0,     0,     0,     0,     0,     0,    26,
        0,     0,     0,     0,     0,     0,     0,    34,     0,     0,
       10,    11,    12,     0,     0,     0,    80,    14,     0,    81,
       82,    83,     0,     0,     0,     0,     0,     0,     0,    26,
        0,     0,     0,     0,     0,     0,     0,    34,     0,     0,
@@ -722,14 +777,14 @@ static const yysigned_char yytable[] =
       39,    40
 };
 
       39,    40
 };
 
-static const yysigned_char yycheck[] =
+static const yytype_int8 yycheck[] =
 {
       34,     8,     3,     3,    42,     0,    74,    42,    46,     3,
        4,    44,    45,    14,    15,    16,     3,    51,    76,    77,
       54,     0,     1,    91,     4,    43,     5,     6,     7,     8,
        9,    10,    11,    12,    13,     4,    44,    43,    43,    18,
       42,    48,     3,    42,    78,    46,    46,    44,     4,     2,
 {
       34,     8,     3,     3,    42,     0,    74,    42,    46,     3,
        4,    44,    45,    14,    15,    16,     3,    51,    76,    77,
       54,     0,     1,    91,     4,    43,     5,     6,     7,     8,
        9,    10,    11,    12,    13,     4,    44,    43,    43,    18,
       42,    48,     3,    42,    78,    46,    46,    44,     4,     2,
-      51,    30,    50,    68,    47,    99,    90,    -1,    -1,    38,
+      51,    30,    50,    68,    47,    51,    90,    99,    -1,    38,
       -1,    95,    32,    33,    -1,    72,   100,    -1,    47,    48,
        1,    -1,   106,    -1,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    -1,    -1,    -1,    56,    18,    -1,    59,
       -1,    95,    32,    33,    -1,    72,   100,    -1,    47,    48,
        1,    -1,   106,    -1,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    -1,    -1,    -1,    56,    18,    -1,    59,
@@ -745,19 +800,20 @@ static const yysigned_char yycheck[] =
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const yytype_uint8 yystos[] =
 {
        0,    53,    54,     0,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    44,    48,
       49,    55,    56,    57,    60,    61,    59,    58,    42,     3,
 {
        0,    53,    54,     0,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    44,    48,
       49,    55,    56,    57,    60,    61,    59,    58,    42,     3,
-      46,    63,    72,    74,    63,     3,    75,     4,     4,    43,
-      43,    43,    75,    75,    72,     1,    47,    56,    66,    67,
+      46,    63,    72,    75,    63,     3,    76,     4,     4,    43,
+      43,    43,    76,    76,    72,     1,    47,    56,    66,    67,
       68,    42,    62,    42,    46,    64,    65,    65,    63,    72,
       68,    42,    62,    42,    46,    64,    65,    65,    63,    72,
-      75,    75,    75,    75,    44,    69,    44,    48,    67,    76,
-      63,     4,    74,    64,    70,    71,    50,    74,    44,    45,
-      14,    15,    16,    51,    72,    73,    71,    72,     4,    42
+      76,    76,    76,    76,    44,    69,    44,    48,    67,    77,
+      63,     4,    75,    64,    70,    71,    50,    75,    44,    45,
+      14,    15,    16,    72,    73,    74,    71,    72,     4,    42,
+      51
 };
 
 #define yyerrok                (yyerrstatus = 0)
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -785,7 +841,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                                                         \
@@ -793,7 +849,7 @@ do                                                          \
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;                                                 \
     }                                                          \
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;                                                 \
     }                                                          \
-while (/*CONSTCOND*/ 0)
+while (YYID (0))
 
 
 #define YYTERROR       1
 
 
 #define YYTERROR       1
@@ -808,7 +864,7 @@ while (/*CONSTCOND*/ 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;      \
@@ -822,7 +878,7 @@ while (/*CONSTCOND*/ 0)
          (Current).first_column = (Current).last_column =              \
            YYRHSLOC (Rhs, 0).last_column;                              \
        }                                                               \
          (Current).first_column = (Current).last_column =              \
            YYRHSLOC (Rhs, 0).last_column;                              \
        }                                                               \
-    while (/*CONSTCOND*/ 0)
+    while (YYID (0))
 #endif
 
 
 #endif
 
 
@@ -834,8 +890,8 @@ while (/*CONSTCOND*/ 0)
 # if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)                 \
      fprintf (File, "%d.%d-%d.%d",                     \
 # if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)                 \
      fprintf (File, "%d.%d-%d.%d",                     \
-              (Loc).first_line, (Loc).first_column,    \
-              (Loc).last_line,  (Loc).last_column)
+             (Loc).first_line, (Loc).first_column,     \
+             (Loc).last_line,  (Loc).last_column)
 # else
 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 # endif
 # else
 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 # endif
@@ -862,36 +918,181 @@ while (/*CONSTCOND*/ 0)
 do {                                           \
   if (yydebug)                                 \
     YYFPRINTF Args;                            \
 do {                                           \
   if (yydebug)                                 \
     YYFPRINTF Args;                            \
-} while (/*CONSTCOND*/ 0)
+} while (YYID (0))
 
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
 do {                                                                     \
   if (yydebug)                                                           \
     {                                                                    \
       YYFPRINTF (stderr, "%s ", Title);                                          \
 
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
 do {                                                                     \
   if (yydebug)                                                           \
     {                                                                    \
       YYFPRINTF (stderr, "%s ", Title);                                          \
-      yysymprint (stderr,                                                \
-                  Type, Value, Location); \
+      yy_symbol_print (stderr,                                           \
+                 Type, Value, Location); \
       YYFPRINTF (stderr, "\n");                                                  \
     }                                                                    \
       YYFPRINTF (stderr, "\n");                                                  \
     }                                                                    \
-} while (/*CONSTCOND*/ 0)
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, const YYSTYPE * const yyvaluep, const YYLTYPE * const yylocationp)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
+    FILE *yyoutput;
+    int yytype;
+    const YYSTYPE * const yyvaluep;
+    const YYLTYPE * const yylocationp;
+#endif
+{
+  if (!yyvaluep)
+    return;
+  YYUSE (yylocationp);
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      case 3: /* "\"string\"" */
+#line 181 "parse-gram.y"
+       { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
+#line 968 "parse-gram.c"
+       break;
+      case 4: /* "\"integer\"" */
+#line 193 "parse-gram.y"
+       { fprintf (stderr, "%d", (yyvaluep->integer)); };
+#line 973 "parse-gram.c"
+       break;
+      case 8: /* "\"%destructor {...}\"" */
+#line 183 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 978 "parse-gram.c"
+       break;
+      case 9: /* "\"%printer {...}\"" */
+#line 187 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 983 "parse-gram.c"
+       break;
+      case 10: /* "\"%union {...}\"" */
+#line 188 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 988 "parse-gram.c"
+       break;
+      case 26: /* "\"%initial-action {...}\"" */
+#line 184 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 993 "parse-gram.c"
+       break;
+      case 27: /* "\"%lex-param {...}\"" */
+#line 185 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 998 "parse-gram.c"
+       break;
+      case 34: /* "\"%parse-param {...}\"" */
+#line 186 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 1003 "parse-gram.c"
+       break;
+      case 42: /* "\"type\"" */
+#line 191 "parse-gram.y"
+       { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
+#line 1008 "parse-gram.c"
+       break;
+      case 46: /* "\"identifier\"" */
+#line 195 "parse-gram.y"
+       { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
+#line 1013 "parse-gram.c"
+       break;
+      case 47: /* "\"identifier:\"" */
+#line 197 "parse-gram.y"
+       { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
+#line 1018 "parse-gram.c"
+       break;
+      case 49: /* "\"%{...%}\"" */
+#line 189 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 1023 "parse-gram.c"
+       break;
+      case 50: /* "\"epilogue\"" */
+#line 189 "parse-gram.y"
+       { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
+#line 1028 "parse-gram.c"
+       break;
+      case 72: /* "symbol" */
+#line 195 "parse-gram.y"
+       { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
+#line 1033 "parse-gram.c"
+       break;
+      case 75: /* "string_as_id" */
+#line 195 "parse-gram.y"
+       { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
+#line 1038 "parse-gram.c"
+       break;
+      case 76: /* "string_content" */
+#line 181 "parse-gram.y"
+       { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
+#line 1043 "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, ")");
+}
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 static void
-yy_stack_print (short int *bottom, short int *top)
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
 #else
 static void
 yy_stack_print (bottom, top)
 #else
 static void
 yy_stack_print (bottom, top)
-    short int *bottom;
-    short int *top;
+    yytype_int16 *bottom;
+    yytype_int16 *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");
 }
@@ -900,37 +1101,47 @@ yy_stack_print (bottom, top)
 do {                                                           \
   if (yydebug)                                                 \
     yy_stack_print ((Bottom), (Top));                          \
 do {                                                           \
   if (yydebug)                                                 \
     yy_stack_print ((Bottom), (Top));                          \
-} while (/*CONSTCOND*/ 0)
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
 
 
 /*------------------------------------------------.
 | 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
 static void
-yy_reduce_print (int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
 #else
 static void
 #else
 static void
-yy_reduce_print (yyrule)
+yy_reduce_print (yyvsp, yylsp, yyrule
+                  )
+    YYSTYPE *yyvsp;
+    YYLTYPE *yylsp;
     int yyrule;
 #endif
 {
     int yyrule;
 #endif
 {
+  int yynrhs = yyr2[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-             yyrule - 1, yylno);
-  /* Print the symbols being reduced, and their result.  */
-  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+            yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                      &(yyvsp[(yyi + 1) - (yynrhs)])
+                      , &(yylsp[(yyi + 1) - (yynrhs)])                );
+      fprintf (stderr, "\n");
+    }
 }
 
 # define YY_REDUCE_PRINT(Rule)         \
 do {                                   \
   if (yydebug)                         \
 }
 
 # define YY_REDUCE_PRINT(Rule)         \
 do {                                   \
   if (yydebug)                         \
-    yy_reduce_print (Rule);            \
-} while (/*CONSTCOND*/ 0)
+    yy_reduce_print (yyvsp, yylsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -964,42 +1175,44 @@ int yydebug;
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
-#  if defined (__GLIBC__) && defined (_STRING_H)
+#  if defined __GLIBC__ && defined _STRING_H
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
 static YYSIZE_T
-#   if YYMODERN_C
 yystrlen (const char *yystr)
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
 {
-  const char *yys = yystr;
-
-  while (*yys++ != '\0')
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
     continue;
     continue;
-
-  return yys - yystr - 1;
+  return yylen;
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
-#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
 #   define yystpcpy stpcpy
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
 #   define yystpcpy stpcpy
 #  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 *
 static char *
-#   if YYMODERN_C
 yystpcpy (char *yydest, const char *yysrc)
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1087,7 +1300,7 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
 
 # if 0
       /* This is so xgettext sees the translatable formats that are
 
 # if 0
       /* This is so xgettext sees the translatable formats that are
-         constructed on the fly.  */
+        constructed on the fly.  */
       YY_("syntax error, unexpected %s");
       YY_("syntax error, unexpected %s, expecting %s");
       YY_("syntax error, unexpected %s, expecting %s or %s");
       YY_("syntax error, unexpected %s");
       YY_("syntax error, unexpected %s, expecting %s");
       YY_("syntax error, unexpected %s, expecting %s or %s");
@@ -1100,13 +1313,13 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
       static char const yyexpecting[] = ", expecting %s";
       static char const yyor[] = " or %s";
       char yyformat[sizeof yyunexpected
       static char const yyexpecting[] = ", expecting %s";
       static char const yyor[] = " or %s";
       char yyformat[sizeof yyunexpected
-                    + sizeof yyexpecting - 1
-                    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-                       * (sizeof yyor - 1))];
+                   + sizeof yyexpecting - 1
+                   + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+                      * (sizeof yyor - 1))];
       char const *yyprefix = yyexpecting;
 
       /* Start YYX at -YYN if negative to avoid negative indexes in
       char const *yyprefix = yyexpecting;
 
       /* Start YYX at -YYN if negative to avoid negative indexes in
-         YYCHECK.  */
+        YYCHECK.  */
       int yyxbegin = yyn < 0 ? -yyn : 0;
 
       /* Stay within bounds of both yycheck and yytname.  */
       int yyxbegin = yyn < 0 ? -yyn : 0;
 
       /* Stay within bounds of both yycheck and yytname.  */
@@ -1118,26 +1331,26 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
       yyfmt = yystpcpy (yyformat, yyunexpected);
 
       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
       yyfmt = yystpcpy (yyformat, yyunexpected);
 
       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-        if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-          {
-            if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-              {
-                yycount = 1;
-                yysize = yysize0;
-                yyformat[sizeof yyunexpected - 1] = '\0';
-                break;
-              }
-            yyarg[yycount++] = yytname[yyx];
-            yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-            yysize_overflow |= yysize1 < yysize;
-            yysize = yysize1;
-            yyfmt = yystpcpy (yyfmt, yyprefix);
-            yyprefix = yyor;
-          }
+       if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+         {
+           if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+             {
+               yycount = 1;
+               yysize = yysize0;
+               yyformat[sizeof yyunexpected - 1] = '\0';
+               break;
+             }
+           yyarg[yycount++] = yytname[yyx];
+           yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+           yysize_overflow |= (yysize1 < yysize);
+           yysize = yysize1;
+           yyfmt = yystpcpy (yyfmt, yyprefix);
+           yyprefix = yyor;
+         }
 
       yyf = YY_(yyformat);
       yysize1 = yysize + yystrlen (yyf);
 
       yyf = YY_(yyformat);
       yysize1 = yysize + yystrlen (yyf);
-      yysize_overflow |= yysize1 < yysize;
+      yysize_overflow |= (yysize1 < yysize);
       yysize = yysize1;
 
       if (yysize_overflow)
       yysize = yysize1;
 
       if (yysize_overflow)
@@ -1145,166 +1358,38 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
 
       if (yyresult)
        {
 
       if (yyresult)
        {
-          /* Avoid sprintf, as that infringes on the user's name space.
-             Don't have undefined behavior even if the translation
-             produced a string with the wrong number of "%s"s.  */
-          char *yyp = yyresult;
-          int yyi = 0;
-          while ((*yyp = *yyf))
-            {
-              if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-                {
-                  yyp += yytnamerr (yyp, yyarg[yyi++]);
-                  yyf += 2;
-                }
-              else
-                {
-                  yyp++;
-                  yyf++;
-                }
-            }
-        }
+         /* Avoid sprintf, as that infringes on the user's name space.
+            Don't have undefined behavior even if the translation
+            produced a string with the wrong number of "%s"s.  */
+         char *yyp = yyresult;
+         int yyi = 0;
+         while ((*yyp = *yyf) != '\0')
+           {
+             if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+               {
+                 yyp += yytnamerr (yyp, yyarg[yyi++]);
+                 yyf += 2;
+               }
+             else
+               {
+                 yyp++;
+                 yyf++;
+               }
+           }
+       }
       return yysize;
     }
 }
 #endif /* YYERROR_VERBOSE */
 \f
 
       return yysize;
     }
 }
 #endif /* YYERROR_VERBOSE */
 \f
 
-#if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
-#else
-static void
-yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE *yyvaluep;
-    YYLTYPE *yylocationp;
-#endif
-{
-  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);
-# endif
-  switch (yytype)
-    {
-      case 3: /* "\"string\"" */
-#line 169 "../../src/parse-gram.y"
-        { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1211 "../../src/parse-gram.c"
-        break;
-      case 4: /* "\"integer\"" */
-#line 182 "../../src/parse-gram.y"
-        { fprintf (stderr, "%d", (yyvaluep->integer)); };
-#line 1216 "../../src/parse-gram.c"
-        break;
-      case 8: /* "\"%destructor {...}\"" */
-#line 171 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1221 "../../src/parse-gram.c"
-        break;
-      case 9: /* "\"%printer {...}\"" */
-#line 175 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1226 "../../src/parse-gram.c"
-        break;
-      case 10: /* "\"%union {...}\"" */
-#line 176 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1231 "../../src/parse-gram.c"
-        break;
-      case 26: /* "\"%initial-action {...}\"" */
-#line 172 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1236 "../../src/parse-gram.c"
-        break;
-      case 27: /* "\"%lex-param {...}\"" */
-#line 173 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1241 "../../src/parse-gram.c"
-        break;
-      case 34: /* "\"%parse-param {...}\"" */
-#line 174 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1246 "../../src/parse-gram.c"
-        break;
-      case 42: /* "\"type\"" */
-#line 180 "../../src/parse-gram.y"
-        { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
-#line 1251 "../../src/parse-gram.c"
-        break;
-      case 46: /* "\"identifier\"" */
-#line 184 "../../src/parse-gram.y"
-        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1256 "../../src/parse-gram.c"
-        break;
-      case 47: /* "\"identifier:\"" */
-#line 186 "../../src/parse-gram.y"
-        { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
-#line 1261 "../../src/parse-gram.c"
-        break;
-      case 49: /* "\"%{...%}\"" */
-#line 178 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1266 "../../src/parse-gram.c"
-        break;
-      case 50: /* "\"epilogue\"" */
-#line 178 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1271 "../../src/parse-gram.c"
-        break;
-      case 51: /* "\"{...}\"" */
-#line 177 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1276 "../../src/parse-gram.c"
-        break;
-      case 72: /* "symbol" */
-#line 184 "../../src/parse-gram.y"
-        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1281 "../../src/parse-gram.c"
-        break;
-      case 73: /* "action" */
-#line 177 "../../src/parse-gram.y"
-        { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1286 "../../src/parse-gram.c"
-        break;
-      case 74: /* "string_as_id" */
-#line 184 "../../src/parse-gram.y"
-        { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1291 "../../src/parse-gram.c"
-        break;
-      case 75: /* "string_content" */
-#line 169 "../../src/parse-gram.y"
-        { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1296 "../../src/parse-gram.c"
-        break;
-      default:
-        break;
-    }
-  YYFPRINTF (yyoutput, ")");
-}
-#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-#if defined (__STDC__) || defined (__C99__FUNC__) || defined (__cplusplus)
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
 #else
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
 #else
@@ -1327,7 +1412,7 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)
     {
 
       default:
     {
 
       default:
-        break;
+       break;
     }
 }
 \f
     }
 }
 \f
@@ -1335,13 +1420,13 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 /* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
-# if YYMODERN_C
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void);
 #else
 int yyparse ();
 int yyparse (void);
 #else
 int yyparse ();
@@ -1358,14 +1443,18 @@ int yyparse ();
 `----------*/
 
 #ifdef YYPARSE_PARAM
 `----------*/
 
 #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 */
 #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
 int
 yyparse (void)
 #else
@@ -1409,9 +1498,9 @@ YYLTYPE yylloc;
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
@@ -1422,10 +1511,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;
 
@@ -1434,9 +1523,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"));
 
@@ -1460,8 +1549,8 @@ YYLTYPE yylloc;
 #endif
 
 
 #endif
 
 
-  /* User initialization code. */
-#line 72 "../../src/parse-gram.y"
+  /* User initialization code.  */
+#line 85 "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. */
@@ -1469,8 +1558,8 @@ YYLTYPE yylloc;
   yylloc.start.line   = yylloc.end.line   = 1;
   yylloc.start.column = yylloc.end.column = 0;
 }
   yylloc.start.line   = yylloc.end.line   = 1;
   yylloc.start.column = yylloc.end.column = 0;
 }
-/* Line 1066 of yacc.c.  */
-#line 1474 "../../src/parse-gram.c"
+/* Line 1081 of yacc.c.  */
+#line 1563 "parse-gram.c"
   yylsp[0] = yylloc;
   goto yysetstate;
 
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -1479,8 +1568,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:
@@ -1493,11 +1581,11 @@ 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;
-       short int *yyss1 = yyss;
+       yytype_int16 *yyss1 = yyss;
        YYLTYPE *yyls1 = yyls;
 
        /* Each stack pointer address is followed by the size of the
        YYLTYPE *yyls1 = yyls;
 
        /* Each stack pointer address is followed by the size of the
@@ -1525,7 +1613,7 @@ YYLTYPE yylloc;
        yystacksize = YYMAXDEPTH;
 
       {
        yystacksize = YYMAXDEPTH;
 
       {
-       short int *yyss1 = yyss;
+       yytype_int16 *yyss1 = yyss;
        union yyalloc *yyptr =
          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
        if (! yyptr)
        union yyalloc *yyptr =
          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
        if (! yyptr)
@@ -1560,12 +1648,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;
@@ -1607,22 +1693,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;
 
 
@@ -1653,193 +1738,206 @@ 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. */
-  YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);
+  /* Default location.  */
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 6:
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 6:
-#line 207 "../../src/parse-gram.y"
-    { prologue_augment ((yyvsp[0].chars), (yylsp[0])); }
+#line 218 "parse-gram.y"
+    { prologue_augment ((yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 7:
     break;
 
   case 7:
-#line 208 "../../src/parse-gram.y"
+#line 219 "parse-gram.y"
     { debug_flag = true; }
     break;
 
   case 8:
     { debug_flag = true; }
     break;
 
   case 8:
-#line 209 "../../src/parse-gram.y"
-    { muscle_insert ((yyvsp[0].chars), "1"); }
+#line 221 "parse-gram.y"
+    {
+      static char one[] = "1";
+      muscle_insert ((yyvsp[(2) - (2)].chars), one);
+    }
     break;
 
   case 9:
     break;
 
   case 9:
-#line 210 "../../src/parse-gram.y"
-    { muscle_insert ((yyvsp[-1].chars), (yyvsp[0].chars)); }
+#line 225 "parse-gram.y"
+    { muscle_insert ((yyvsp[(2) - (3)].chars), (yyvsp[(3) - (3)].chars)); }
     break;
 
   case 10:
     break;
 
   case 10:
-#line 211 "../../src/parse-gram.y"
+#line 226 "parse-gram.y"
     { defines_flag = true; }
     break;
 
   case 11:
     { defines_flag = true; }
     break;
 
   case 11:
-#line 212 "../../src/parse-gram.y"
+#line 227 "parse-gram.y"
     { error_verbose = true; }
     break;
 
   case 12:
     { error_verbose = true; }
     break;
 
   case 12:
-#line 213 "../../src/parse-gram.y"
-    { expected_sr_conflicts = (yyvsp[0].integer); }
+#line 228 "parse-gram.y"
+    { expected_sr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 13:
     break;
 
   case 13:
-#line 214 "../../src/parse-gram.y"
-    { expected_rr_conflicts = (yyvsp[0].integer); }
+#line 229 "parse-gram.y"
+    { expected_rr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 14:
     break;
 
   case 14:
-#line 215 "../../src/parse-gram.y"
-    { spec_file_prefix = (yyvsp[0].chars); }
+#line 230 "parse-gram.y"
+    { spec_file_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 15:
     break;
 
   case 15:
-#line 217 "../../src/parse-gram.y"
+#line 232 "parse-gram.y"
     {
     {
-    nondeterministic_parser = true;
-    glr_parser = true;
-  }
+      nondeterministic_parser = true;
+      glr_parser = true;
+    }
     break;
 
   case 16:
     break;
 
   case 16:
-#line 222 "../../src/parse-gram.y"
+#line 237 "parse-gram.y"
     {
     {
-    muscle_code_grow ("initial_action", (yyvsp[0].chars), (yylsp[0]));
-  }
+      muscle_code_grow ("initial_action", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)]));
+    }
     break;
 
   case 17:
     break;
 
   case 17:
-#line 225 "../../src/parse-gram.y"
-    { add_param ("lex_param", (yyvsp[0].chars), (yylsp[0])); }
+#line 240 "parse-gram.y"
+    { add_param ("lex_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 18:
     break;
 
   case 18:
-#line 226 "../../src/parse-gram.y"
+#line 241 "parse-gram.y"
     { locations_flag = true; }
     break;
 
   case 19:
     { locations_flag = true; }
     break;
 
   case 19:
-#line 227 "../../src/parse-gram.y"
-    { spec_name_prefix = (yyvsp[0].chars); }
+#line 242 "parse-gram.y"
+    { spec_name_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 20:
     break;
 
   case 20:
-#line 228 "../../src/parse-gram.y"
+#line 243 "parse-gram.y"
     { no_lines_flag = true; }
     break;
 
   case 21:
     { no_lines_flag = true; }
     break;
 
   case 21:
-#line 229 "../../src/parse-gram.y"
+#line 244 "parse-gram.y"
     { nondeterministic_parser = true; }
     break;
 
   case 22:
     { nondeterministic_parser = true; }
     break;
 
   case 22:
-#line 230 "../../src/parse-gram.y"
-    { spec_outfile = (yyvsp[0].chars); }
+#line 245 "parse-gram.y"
+    { spec_outfile = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 23:
     break;
 
   case 23:
-#line 231 "../../src/parse-gram.y"
-    { add_param ("parse_param", (yyvsp[0].chars), (yylsp[0])); }
+#line 246 "parse-gram.y"
+    { add_param ("parse_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 24:
     break;
 
   case 24:
-#line 232 "../../src/parse-gram.y"
+#line 247 "parse-gram.y"
     { pure_parser = true; }
     break;
 
   case 25:
     { pure_parser = true; }
     break;
 
   case 25:
-#line 233 "../../src/parse-gram.y"
-    { version_check (&(yylsp[0]), (yyvsp[0].chars)); }
+#line 248 "parse-gram.y"
+    { version_check (&(yylsp[(2) - (2)]), (yyvsp[(2) - (2)].chars)); }
     break;
 
   case 26:
     break;
 
   case 26:
-#line 234 "../../src/parse-gram.y"
-    { skeleton = (yyvsp[0].chars); }
+#line 249 "parse-gram.y"
+    { skeleton = (yyvsp[(2) - (2)].chars); }
     break;
 
   case 27:
     break;
 
   case 27:
-#line 235 "../../src/parse-gram.y"
+#line 250 "parse-gram.y"
     { token_table_flag = true; }
     break;
 
   case 28:
     { token_table_flag = true; }
     break;
 
   case 28:
-#line 236 "../../src/parse-gram.y"
+#line 251 "parse-gram.y"
     { report_flag = report_states; }
     break;
 
   case 29:
     { report_flag = report_states; }
     break;
 
   case 29:
-#line 237 "../../src/parse-gram.y"
+#line 252 "parse-gram.y"
     { yacc_flag = true; }
     break;
 
   case 33:
     { yacc_flag = true; }
     break;
 
   case 33:
-#line 245 "../../src/parse-gram.y"
+#line 260 "parse-gram.y"
     {
     {
-      grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
+      grammar_start_symbol_set ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]));
     }
     break;
 
   case 34:
     }
     break;
 
   case 34:
-#line 249 "../../src/parse-gram.y"
+#line 264 "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[0]).start.line);
-      muscle_insert ("stype", (yyvsp[0].chars));
+      muscle_code_grow ("stype", body, (yylsp[(1) - (1)]));
     }
     break;
 
   case 35:
     }
     break;
 
   case 35:
-#line 255 "../../src/parse-gram.y"
+#line 280 "parse-gram.y"
     {
       symbol_list *list;
     {
       symbol_list *list;
-      for (list = (yyvsp[0].list); list; list = list->next)
-       symbol_destructor_set (list->sym, (yyvsp[-1].chars), (yylsp[-1]));
-      symbol_list_free ((yyvsp[0].list));
+      for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
+       symbol_destructor_set (list->sym, (yyvsp[(1) - (2)].chars), (yylsp[(1) - (2)]));
+      symbol_list_free ((yyvsp[(2) - (2)].list));
     }
     break;
 
   case 36:
     }
     break;
 
   case 36:
-#line 262 "../../src/parse-gram.y"
+#line 287 "parse-gram.y"
     {
       symbol_list *list;
     {
       symbol_list *list;
-      for (list = (yyvsp[0].list); list; list = list->next)
-       symbol_printer_set (list->sym, (yyvsp[-1].chars), list->location);
-      symbol_list_free ((yyvsp[0].list));
+      for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
+       symbol_printer_set (list->sym, (yyvsp[(1) - (2)].chars), (yylsp[(1) - (2)]));
+      symbol_list_free ((yyvsp[(2) - (2)].list));
     }
     break;
 
   case 37:
     }
     break;
 
   case 37:
-#line 269 "../../src/parse-gram.y"
+#line 294 "parse-gram.y"
     {
       default_prec = true;
     }
     break;
 
   case 38:
     {
       default_prec = true;
     }
     break;
 
   case 38:
-#line 273 "../../src/parse-gram.y"
+#line 298 "parse-gram.y"
     {
       default_prec = false;
     }
     break;
 
   case 39:
     {
       default_prec = false;
     }
     break;
 
   case 39:
-#line 279 "../../src/parse-gram.y"
+#line 304 "parse-gram.y"
     { current_class = nterm_sym; }
     break;
 
   case 40:
     { current_class = nterm_sym; }
     break;
 
   case 40:
-#line 280 "../../src/parse-gram.y"
+#line 305 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1847,12 +1945,12 @@ yyreduce:
     break;
 
   case 41:
     break;
 
   case 41:
-#line 284 "../../src/parse-gram.y"
+#line 309 "parse-gram.y"
     { current_class = token_sym; }
     break;
 
   case 42:
     { current_class = token_sym; }
     break;
 
   case 42:
-#line 285 "../../src/parse-gram.y"
+#line 310 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1860,215 +1958,200 @@ yyreduce:
     break;
 
   case 43:
     break;
 
   case 43:
-#line 290 "../../src/parse-gram.y"
+#line 315 "parse-gram.y"
     {
       symbol_list *list;
     {
       symbol_list *list;
-      for (list = (yyvsp[0].list); list; list = list->next)
-       symbol_type_set (list->sym, (yyvsp[-1].uniqstr), (yylsp[-1]));
-      symbol_list_free ((yyvsp[0].list));
+      for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
+       symbol_type_set (list->sym, (yyvsp[(2) - (3)].uniqstr), (yylsp[(2) - (3)]));
+      symbol_list_free ((yyvsp[(3) - (3)].list));
     }
     break;
 
   case 44:
     }
     break;
 
   case 44:
-#line 300 "../../src/parse-gram.y"
+#line 325 "parse-gram.y"
     {
       symbol_list *list;
       ++current_prec;
     {
       symbol_list *list;
       ++current_prec;
-      for (list = (yyvsp[0].list); list; list = list->next)
+      for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
        {
        {
-         symbol_type_set (list->sym, current_type, (yylsp[-1]));
-         symbol_precedence_set (list->sym, current_prec, (yyvsp[-2].assoc), (yylsp[-2]));
+         symbol_type_set (list->sym, current_type, (yylsp[(2) - (3)]));
+         symbol_precedence_set (list->sym, current_prec, (yyvsp[(1) - (3)].assoc), (yylsp[(1) - (3)]));
        }
        }
-      symbol_list_free ((yyvsp[0].list));
+      symbol_list_free ((yyvsp[(3) - (3)].list));
       current_type = NULL;
     }
     break;
 
   case 45:
       current_type = NULL;
     }
     break;
 
   case 45:
-#line 314 "../../src/parse-gram.y"
+#line 339 "parse-gram.y"
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
-#line 315 "../../src/parse-gram.y"
+#line 340 "parse-gram.y"
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
-#line 316 "../../src/parse-gram.y"
+#line 341 "parse-gram.y"
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
-#line 320 "../../src/parse-gram.y"
+#line 345 "parse-gram.y"
     { current_type = NULL; }
     break;
 
   case 49:
     { current_type = NULL; }
     break;
 
   case 49:
-#line 321 "../../src/parse-gram.y"
-    { current_type = (yyvsp[0].uniqstr); }
+#line 346 "parse-gram.y"
+    { current_type = (yyvsp[(1) - (1)].uniqstr); }
     break;
 
   case 50:
     break;
 
   case 50:
-#line 327 "../../src/parse-gram.y"
-    { (yyval.list) = symbol_list_new ((yyvsp[0].symbol), (yylsp[0])); }
+#line 352 "parse-gram.y"
+    { (yyval.list) = symbol_list_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
     break;
 
   case 51:
     break;
 
   case 51:
-#line 328 "../../src/parse-gram.y"
-    { (yyval.list) = symbol_list_prepend ((yyvsp[-1].list), (yyvsp[0].symbol), (yylsp[0])); }
+#line 353 "parse-gram.y"
+    { (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 52:
     break;
 
   case 52:
-#line 334 "../../src/parse-gram.y"
+#line 359 "parse-gram.y"
     {
     {
-       current_type = (yyvsp[0].uniqstr);
+       current_type = (yyvsp[(1) - (1)].uniqstr);
      }
     break;
 
   case 53:
      }
     break;
 
   case 53:
-#line 338 "../../src/parse-gram.y"
+#line 363 "parse-gram.y"
     {
     {
-       symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]));
-       symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0]));
+       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:
      }
     break;
 
   case 54:
-#line 343 "../../src/parse-gram.y"
+#line 368 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));
-      symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
-      symbol_user_token_number_set ((yyvsp[-1].symbol), (yyvsp[0].integer), (yylsp[0]));
+      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:
     }
     break;
 
   case 55:
-#line 349 "../../src/parse-gram.y"
+#line 374 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));
-      symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
-      symbol_make_alias ((yyvsp[-1].symbol), (yyvsp[0].symbol), (yyloc));
+      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:
     }
     break;
 
   case 56:
-#line 355 "../../src/parse-gram.y"
+#line 380 "parse-gram.y"
     {
     {
-      symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2]));
-      symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2]));
-      symbol_user_token_number_set ((yyvsp[-2].symbol), (yyvsp[-1].integer), (yylsp[-1]));
-      symbol_make_alias ((yyvsp[-2].symbol), (yyvsp[0].symbol), (yyloc));
-    }
-    break;
-
-  case 62:
-#line 384 "../../src/parse-gram.y"
-    {
-      if (yacc_flag)
-       complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));
+      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 63:
     }
     break;
 
   case 63:
-#line 389 "../../src/parse-gram.y"
+#line 410 "parse-gram.y"
     {
       yyerrok;
     }
     break;
 
   case 64:
     {
       yyerrok;
     }
     break;
 
   case 64:
-#line 395 "../../src/parse-gram.y"
-    { current_lhs = (yyvsp[0].symbol); current_lhs_location = (yylsp[0]); }
+#line 416 "parse-gram.y"
+    { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
     break;
 
   case 66:
     break;
 
   case 66:
-#line 399 "../../src/parse-gram.y"
-    { grammar_rule_end ((yylsp[0])); }
+#line 420 "parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(1) - (1)])); }
     break;
 
   case 67:
     break;
 
   case 67:
-#line 400 "../../src/parse-gram.y"
-    { grammar_rule_end ((yylsp[0])); }
+#line 421 "parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(3) - (3)])); }
     break;
 
   case 69:
     break;
 
   case 69:
-#line 406 "../../src/parse-gram.y"
-    { grammar_rule_begin (current_lhs, current_lhs_location); }
+#line 427 "parse-gram.y"
+    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
     break;
 
   case 70:
     break;
 
   case 70:
-#line 408 "../../src/parse-gram.y"
-    { grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); }
-    break;
-
-  case 71:
-#line 410 "../../src/parse-gram.y"
-    { grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); }
+#line 429 "parse-gram.y"
+    { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 72:
     break;
 
   case 72:
-#line 412 "../../src/parse-gram.y"
-    { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); }
+#line 432 "parse-gram.y"
+    { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
     break;
 
   case 73:
     break;
 
   case 73:
-#line 414 "../../src/parse-gram.y"
-    { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); }
+#line 434 "parse-gram.y"
+    { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
     break;
 
   case 74:
     break;
 
   case 74:
-#line 416 "../../src/parse-gram.y"
-    { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); }
+#line 436 "parse-gram.y"
+    { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
     break;
 
   case 75:
     break;
 
   case 75:
-#line 420 "../../src/parse-gram.y"
-    { (yyval.symbol) = (yyvsp[0].symbol); }
+#line 440 "parse-gram.y"
+    { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 76:
     break;
 
   case 76:
-#line 421 "../../src/parse-gram.y"
-    { (yyval.symbol) = (yyvsp[0].symbol); }
+#line 441 "parse-gram.y"
+    { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 77:
     break;
 
   case 77:
-#line 426 "../../src/parse-gram.y"
-    { (yyval.chars) = (yyvsp[0].chars); }
+#line 457 "parse-gram.y"
+    { grammar_current_rule_action_append (last_string, last_braced_code_loc); }
     break;
 
     break;
 
-  case 78:
-#line 432 "../../src/parse-gram.y"
+  case 79:
+#line 464 "parse-gram.y"
     {
     {
-      (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].chars)), (yylsp[0]));
-      symbol_class_set ((yyval.symbol), token_sym, (yylsp[0]));
+      (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)]), false);
     }
     break;
 
     }
     break;
 
-  case 79:
-#line 441 "../../src/parse-gram.y"
-    { (yyval.chars) = (yyvsp[0].chars); }
+  case 80:
+#line 473 "parse-gram.y"
+    { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
     break;
 
-  case 81:
-#line 448 "../../src/parse-gram.y"
+  case 82:
+#line 480 "parse-gram.y"
     {
     {
-      muscle_code_grow ("epilogue", (yyvsp[0].chars), (yylsp[0]));
+      muscle_code_grow ("epilogue", (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
       scanner_last_string_free ();
     }
     break;
 
 
       scanner_last_string_free ();
     }
     break;
 
 
+/* Line 1270 of yacc.c.  */
+#line 2149 "parse-gram.c"
       default: break;
     }
       default: break;
     }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
 
-/* Line 1262 of yacc.c.  */
-#line 2067 "../../src/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;
@@ -2142,15 +2225,15 @@ yyerrlab:
         error, discard it.  */
 
       if (yychar <= YYEOF)
         error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
+       {
          /* Return failure if at end of input.  */
          if (yychar == YYEOF)
            YYABORT;
          /* Return failure if at end of input.  */
          if (yychar == YYEOF)
            YYABORT;
-        }
+       }
       else
        {
          yydestruct ("Error: discarding",
       else
        {
          yydestruct ("Error: discarding",
-                      yytoken, &yylval, &yylloc);
+                     yytoken, &yylval, &yylloc);
          yychar = YYEMPTY;
        }
     }
          yychar = YYEMPTY;
        }
     }
@@ -2172,9 +2255,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;
 
@@ -2205,8 +2290,8 @@ yyerrlab1:
 
       yyerror_range[0] = *yylsp;
       yydestruct ("Error: popping",
 
       yyerror_range[0] = *yylsp;
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp, yylsp);
-      YYPOPSTACK;
+                 yystos[yystate], yyvsp, yylsp);
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
@@ -2218,11 +2303,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. */
-  YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2);
+     the look-ahead.  YYLOC is available though.  */
+  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
   *++yylsp = yyloc;
 
   *++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;
@@ -2257,11 +2342,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)
@@ -2275,7 +2364,7 @@ yyreturn:
 }
 
 
 }
 
 
-#line 454 "../../src/parse-gram.y"
+#line 486 "parse-gram.y"