/* A Bison parser, made by GNU Bison 2.5.  */

/* Bison implementation for Yacc-like parsers in C
   
      Copyright (C) 1984, 1989-1990, 2000-2011 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
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* As a special exception, you may create a larger work that contains
   part or all of the Bison parser skeleton and distribute that work
   under terms of your choice, so long as that work isn't itself a
   parser generator using the skeleton or a modified version thereof
   as a parser skeleton.  Alternatively, if you modify or redistribute
   the parser skeleton itself, you may (at your option) remove this
   special exception, which will cause the skeleton and the resulting
   Bison output files to be licensed under the GNU General Public
   License without this special exception.
   
   This special exception was added by the Free Software Foundation in
   version 2.2 of Bison.  */

/* 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
   variables, as they might otherwise be expanded by user macros.
   There are some unavoidable exceptions within include files to
   define necessary library symbols; they are noted "INFRINGES ON
   USER NAME SPACE" below.  */

/* Identify Bison output.  */
#define YYBISON 1

/* Bison version.  */
#define YYBISON_VERSION "2.5"

/* Skeleton name.  */
#define YYSKELETON_NAME "yacc.c"

/* Pure parsers.  */
#define YYPURE 0

/* Push parsers.  */
#define YYPUSH 0

/* Pull parsers.  */
#define YYPULL 1

/* Using locations.  */
#define YYLSP_NEEDED 0



/* Copy the first part of user declarations.  */

/* Line 268 of yacc.c  */
#line 1 "src/sdc_parse.y"


#include <stdio.h>
#include "assert.h"

#include "sdc_common.h"


int yyerror(const char *msg);
extern int yylex(void);



/* Line 268 of yacc.c  */
#line 85 "src/sdc_parse.tab.c"

/* Enabling traces.  */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif

/* Enabling verbose error messages.  */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE 1
#endif

/* Enabling the token table.  */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE 0
#endif


/* Tokens.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
   /* Put the tokens into the symbol table, so that GDB and other debuggers
      know about them.  */
   enum yytokentype {
     CMD_CREATE_CLOCK = 258,
     CMD_SET_CLOCK_GROUPS = 259,
     CMD_SET_FALSE_PATH = 260,
     CMD_SET_MAX_DELAY = 261,
     CMD_SET_MULTICYCLE_PATH = 262,
     CMD_SET_INPUT_DELAY = 263,
     CMD_SET_OUTPUT_DELAY = 264,
     CMD_GET_PORTS = 265,
     CMD_GET_CLOCKS = 266,
     ARG_PERIOD = 267,
     ARG_WAVEFORM = 268,
     ARG_NAME = 269,
     ARG_EXCLUSIVE = 270,
     ARG_GROUP = 271,
     ARG_FROM = 272,
     ARG_TO = 273,
     ARG_SETUP = 274,
     ARG_CLOCK = 275,
     ARG_MAX = 276,
     EOL = 277,
     STRING = 278,
     ESCAPED_STRING = 279,
     CHAR = 280,
     FLOAT_NUMBER = 281,
     INT_NUMBER = 282
   };
#endif



#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{

/* Line 293 of yacc.c  */
#line 14 "src/sdc_parse.y"

    char* strVal;
    double floatVal;
    int intVal;

    t_sdc_commands* sdc_commands;

    t_sdc_create_clock* create_clock;
    t_sdc_set_io_delay* set_io_delay;
    t_sdc_set_clock_groups* set_clock_groups;
    t_sdc_set_false_path* set_false_path;
    t_sdc_set_max_delay* set_max_delay;
    t_sdc_set_multicycle_path* set_multicycle_path;

    t_sdc_string_group* string_group;




/* Line 293 of yacc.c  */
#line 168 "src/sdc_parse.tab.c"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif


/* Copy the second part of user declarations.  */


/* Line 343 of yacc.c  */
#line 180 "src/sdc_parse.tab.c"

#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
# ifdef __SIZE_TYPE__
#  define YYSIZE_T __SIZE_TYPE__
# elif defined size_t
#  define YYSIZE_T size_t
# 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
#  define YYSIZE_T unsigned int
# endif
#endif

#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)

#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
#  if ENABLE_NLS
#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
#   define YY_(msgid) dgettext ("bison-runtime", msgid)
#  endif
# endif
# ifndef YY_
#  define YY_(msgid) msgid
# endif
#endif

/* Suppress unused-variable warnings by "using" E.  */
#if ! defined lint || defined __GNUC__
# define YYUSE(e) ((void) (e))
#else
# define YYUSE(e) /* empty */
#endif

/* 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 yyi)
#else
static int
YYID (yyi)
    int yyi;
#endif
{
  return yyi;
}
#endif

#if ! defined yyoverflow || YYERROR_VERBOSE

/* The parser invokes alloca or malloc; define the necessary symbols.  */

# ifdef YYSTACK_USE_ALLOCA
#  if YYSTACK_USE_ALLOCA
#   ifdef __GNUC__
#    define YYSTACK_ALLOC __builtin_alloca
#   elif defined __BUILTIN_VA_ARG_INCR
#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
#   elif defined _AIX
#    define YYSTACK_ALLOC __alloca
#   elif defined _MSC_VER
#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
#    define alloca _alloca
#   else
#    define YYSTACK_ALLOC alloca
#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
#     ifndef EXIT_SUCCESS
#      define EXIT_SUCCESS 0
#     endif
#    endif
#   endif
#  endif
# endif

# ifdef YYSTACK_ALLOC
   /* Pacify GCC's `empty if-body' warning.  */
#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
#  ifndef YYSTACK_ALLOC_MAXIMUM
    /* The OS might guarantee only one guard page at the bottom of the stack,
       and a page size can be as small as 4096 bytes.  So we cannot safely
       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
       to allow for a few compiler-allocated temporary stack slots.  */
#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
#  endif
# else
#  define YYSTACK_ALLOC YYMALLOC
#  define YYSTACK_FREE YYFREE
#  ifndef YYSTACK_ALLOC_MAXIMUM
#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
#  endif
#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
       && ! ((defined YYMALLOC || defined malloc) \
	     && (defined YYFREE || defined free)))
#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
#   ifndef EXIT_SUCCESS
#    define EXIT_SUCCESS 0
#   endif
#  endif
#  ifndef YYMALLOC
#   define YYMALLOC malloc
#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
#  ifndef YYFREE
#   define YYFREE free
#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
void free (void *); /* INFRINGES ON USER NAME SPACE */
#   endif
#  endif
# endif
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */


#if (! defined yyoverflow \
     && (! defined __cplusplus \
	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))

/* A type that is properly aligned for any stack member.  */
union yyalloc
{
  yytype_int16 yyss_alloc;
  YYSTYPE yyvs_alloc;
};

/* The size of the maximum gap between one aligned stack and the next.  */
# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)

/* The size of an array large to enough to hold all stacks, each with
   N elements.  */
# define YYSTACK_BYTES(N) \
     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
      + YYSTACK_GAP_MAXIMUM)

# define YYCOPY_NEEDED 1

/* Relocate STACK from its old location to the new one.  The
   local variables YYSIZE and YYSTACKSIZE give the old and new number of
   elements in the stack, and YYPTR gives the new location of the
   stack.  Advance YYPTR to a properly aligned location for the next
   stack.  */
# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
    do									\
      {									\
	YYSIZE_T yynewbytes;						\
	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
	Stack = &yyptr->Stack_alloc;					\
	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
	yyptr += yynewbytes / sizeof (*yyptr);				\
      }									\
    while (YYID (0))

#endif

#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
/* Copy COUNT objects from FROM to TO.  The source and destination do
   not overlap.  */
# ifndef YYCOPY
#  if defined __GNUC__ && 1 < __GNUC__
#   define YYCOPY(To, From, Count) \
      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
#  else
#   define YYCOPY(To, From, Count)		\
      do					\
	{					\
	  YYSIZE_T yyi;				\
	  for (yyi = 0; yyi < (Count); yyi++)	\
	    (To)[yyi] = (From)[yyi];		\
	}					\
      while (YYID (0))
#  endif
# endif
#endif /* !YYCOPY_NEEDED */

/* YYFINAL -- State number of the termination state.  */
#define YYFINAL  2
/* YYLAST -- Last index in YYTABLE.  */
#define YYLAST   221

/* YYNTOKENS -- Number of terminals.  */
#define YYNTOKENS  32
/* YYNNTS -- Number of nonterminals.  */
#define YYNNTS  16
/* YYNRULES -- Number of rules.  */
#define YYNRULES  67
/* YYNRULES -- Number of states.  */
#define YYNSTATES  129

/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
#define YYUNDEFTOK  2
#define YYMAXUTOK   282

#define YYTRANSLATE(YYX)						\
  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)

/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
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,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,    30,     2,    31,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,    28,     2,    29,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
      25,    26,    27
};

#if YYDEBUG
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
   YYRHS.  */
static const yytype_uint16 yyprhs[] =
{
       0,     0,     3,     4,     8,    12,    16,    20,    24,    28,
      32,    35,    37,    41,    45,    52,    57,    60,    62,    66,
      70,    75,    77,    81,    85,    90,    92,    95,   101,   107,
     111,   113,   119,   125,   131,   137,   141,   145,   147,   150,
     156,   162,   168,   174,   178,   182,   184,   187,   190,   196,
     202,   208,   214,   218,   222,   224,   229,   232,   234,   239,
     242,   243,   246,   248,   250,   252,   254,   256
};

/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
static const yytype_int8 yyrhs[] =
{
      33,     0,    -1,    -1,    33,    34,    22,    -1,    33,    35,
      22,    -1,    33,    36,    22,    -1,    33,    37,    22,    -1,
      33,    38,    22,    -1,    33,    39,    22,    -1,    33,    40,
      22,    -1,    33,    22,    -1,     3,    -1,    34,    12,    45,
      -1,    34,    14,    44,    -1,    34,    13,    28,    45,    45,
      29,    -1,    34,    28,    43,    29,    -1,    34,    44,    -1,
       8,    -1,    35,    20,    44,    -1,    35,    21,    45,    -1,
      35,    30,    41,    31,    -1,     9,    -1,    36,    20,    44,
      -1,    36,    21,    45,    -1,    36,    30,    41,    31,    -1,
       4,    -1,    37,    15,    -1,    37,    16,    30,    42,    31,
      -1,    37,    16,    28,    43,    29,    -1,    37,    16,    44,
      -1,     5,    -1,    38,    17,    30,    42,    31,    -1,    38,
      18,    30,    42,    31,    -1,    38,    17,    28,    43,    29,
      -1,    38,    18,    28,    43,    29,    -1,    38,    17,    44,
      -1,    38,    18,    44,    -1,     6,    -1,    39,    45,    -1,
      39,    17,    30,    42,    31,    -1,    39,    18,    30,    42,
      31,    -1,    39,    17,    28,    43,    29,    -1,    39,    18,
      28,    43,    29,    -1,    39,    17,    44,    -1,    39,    18,
      44,    -1,     7,    -1,    40,    47,    -1,    40,    19,    -1,
      40,    17,    30,    42,    31,    -1,    40,    18,    30,    42,
      31,    -1,    40,    17,    28,    43,    29,    -1,    40,    18,
      28,    43,    29,    -1,    40,    17,    44,    -1,    40,    18,
      44,    -1,    10,    -1,    41,    28,    43,    29,    -1,    41,
      44,    -1,    11,    -1,    42,    28,    43,    29,    -1,    42,
      44,    -1,    -1,    43,    44,    -1,    23,    -1,    24,    -1,
      46,    -1,    47,    -1,    26,    -1,    27,    -1
};

/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
static const yytype_uint8 yyrline[] =
{
       0,    87,    87,    88,    89,    90,    91,    92,    93,    94,
      95,    98,    99,   100,   101,   102,   103,   106,   107,   108,
     109,   112,   113,   114,   115,   118,   119,   120,   121,   122,
     125,   126,   127,   128,   129,   130,   131,   134,   135,   136,
     137,   138,   139,   140,   141,   144,   145,   146,   147,   148,
     149,   150,   151,   152,   155,   156,   157,   160,   161,   162,
     165,   166,   168,   169,   172,   173,   176,   179
};
#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.  */
static const char *const yytname[] =
{
  "$end", "error", "$undefined", "CMD_CREATE_CLOCK",
  "CMD_SET_CLOCK_GROUPS", "CMD_SET_FALSE_PATH", "CMD_SET_MAX_DELAY",
  "CMD_SET_MULTICYCLE_PATH", "CMD_SET_INPUT_DELAY", "CMD_SET_OUTPUT_DELAY",
  "CMD_GET_PORTS", "CMD_GET_CLOCKS", "ARG_PERIOD", "ARG_WAVEFORM",
  "ARG_NAME", "ARG_EXCLUSIVE", "ARG_GROUP", "ARG_FROM", "ARG_TO",
  "ARG_SETUP", "ARG_CLOCK", "ARG_MAX", "EOL", "STRING", "ESCAPED_STRING",
  "CHAR", "FLOAT_NUMBER", "INT_NUMBER", "'{'", "'}'", "'['", "']'",
  "$accept", "sdc_commands", "cmd_create_clock", "cmd_set_input_delay",
  "cmd_set_output_delay", "cmd_set_clock_groups", "cmd_set_false_path",
  "cmd_set_max_delay", "cmd_set_multicycle_path", "cmd_get_ports",
  "cmd_get_clocks", "stringGroup", "string", "number", "float_number",
  "int_number", 0
};
#endif

# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
   token YYLEX-NUM.  */
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,
     275,   276,   277,   278,   279,   280,   281,   282,   123,   125,
      91,    93
};
# endif

/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
static const yytype_uint8 yyr1[] =
{
       0,    32,    33,    33,    33,    33,    33,    33,    33,    33,
      33,    34,    34,    34,    34,    34,    34,    35,    35,    35,
      35,    36,    36,    36,    36,    37,    37,    37,    37,    37,
      38,    38,    38,    38,    38,    38,    38,    39,    39,    39,
      39,    39,    39,    39,    39,    40,    40,    40,    40,    40,
      40,    40,    40,    40,    41,    41,    41,    42,    42,    42,
      43,    43,    44,    44,    45,    45,    46,    47
};

/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
static const yytype_uint8 yyr2[] =
{
       0,     2,     0,     3,     3,     3,     3,     3,     3,     3,
       2,     1,     3,     3,     6,     4,     2,     1,     3,     3,
       4,     1,     3,     3,     4,     1,     2,     5,     5,     3,
       1,     5,     5,     5,     5,     3,     3,     1,     2,     5,
       5,     5,     5,     3,     3,     1,     2,     2,     5,     5,
       5,     5,     3,     3,     1,     4,     2,     1,     4,     2,
       0,     2,     1,     1,     1,     1,     1,     1
};

/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
   Performed when YYTABLE doesn't specify something else to do.  Zero
   means the default is an error.  */
static const yytype_uint8 yydefact[] =
{
       2,     0,     1,    11,    25,    30,    37,    45,    17,    21,
      10,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       0,     3,    62,    63,    60,    16,     0,     0,     4,     0,
       0,     0,     5,     0,    26,     0,     6,     0,     0,     7,
       0,     0,     8,    66,    67,    38,    64,    65,     0,     0,
      47,     9,    46,    12,     0,    13,     0,    18,    19,    54,
       0,    22,    23,     0,    60,     0,    29,    60,     0,    35,
      60,     0,    36,    60,     0,    43,    60,     0,    44,    60,
       0,    52,    60,     0,    53,     0,    15,    61,    60,    20,
      56,    24,     0,    57,     0,     0,     0,     0,     0,     0,
       0,     0,     0,     0,     0,     0,     0,     0,     0,    28,
      60,    27,    59,    33,    31,    34,    32,    41,    39,    42,
      40,    50,    48,    51,    49,    14,    55,     0,    58
};

/* YYDEFGOTO[NTERM-NUM].  */
static const yytype_int8 yydefgoto[] =
{
      -1,     1,    11,    12,    13,    14,    15,    16,    17,    60,
      94,    56,    87,    45,    46,    47
};

/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   STATE-NUM.  */
#define YYPACT_NINF -67
static const yytype_int16 yypact[] =
{
     -67,    68,   -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,
     -67,    84,    13,    93,    -9,   199,    14,    82,    -4,   -27,
      23,   -67,   -67,   -67,   -67,   -67,    23,    -4,   -67,    -6,
      23,    -4,   -67,    -6,   -67,    35,   -67,    56,   138,   -67,
     141,   149,   -67,   -67,   -67,   -67,   -67,   -67,   152,   160,
     -67,   -67,   -67,   -67,    -4,   -67,    32,   -67,   -67,   -67,
      -3,   -67,   -67,    94,   -67,    -1,   -67,   -67,    -1,   -67,
     -67,    -1,   -67,   -67,    -1,   -67,   -67,    -1,   -67,   -67,
      -1,   -67,   -67,    -1,   -67,    -4,   -67,   -67,   -67,   -67,
     -67,   -67,    87,   -67,    96,   162,   105,   169,   107,   171,
     116,   173,   118,   180,   127,   182,   129,    15,   184,   -67,
     -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,
     -67,   -67,   -67,   -67,   -67,   -67,   -67,   191,   -67
};

/* YYPGOTO[NTERM-NUM].  */
static const yytype_int8 yypgoto[] =
{
     -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,   -67,    17,
     -66,   -22,   -11,   -15,   -67,     1
};

/* 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 YYTABLE_NINF, syntax error.  */
#define YYTABLE_NINF -1
static const yytype_uint8 yytable[] =
{
      25,    54,    96,    53,    59,    98,    34,    35,   100,    55,
      93,   102,    58,    36,   104,    57,    62,   106,    52,    61,
      22,    23,    43,    44,    66,    88,    69,    72,    89,    75,
      78,    40,    41,    26,    27,    28,    42,    81,    84,    85,
      43,    44,    92,    29,   125,    95,    22,    23,    97,    90,
      63,    99,    90,     0,   101,    22,    23,   103,    22,    23,
     105,    86,     0,    64,     0,    65,   108,     0,     2,     0,
     107,     3,     4,     5,     6,     7,     8,     9,     0,    22,
      23,     0,     0,   112,    67,   112,    68,   112,   127,   112,
      10,   112,     0,   112,     0,   112,    18,    19,    20,    48,
      49,    50,     0,     0,    51,     0,    21,    22,    23,    44,
      22,    23,    24,    30,    31,    32,   109,    22,    23,    22,
      23,     0,    88,    33,   110,    91,     0,   111,    22,    23,
      22,    23,     0,   110,     0,   110,   114,     0,   116,    22,
      23,    22,    23,     0,   110,     0,   110,   118,     0,   120,
      22,    23,    22,    23,     0,   110,     0,   110,   122,     0,
     124,    22,    23,     0,    22,    23,    70,     0,    71,    73,
       0,    74,    22,    23,     0,    22,    23,    76,     0,    77,
      79,     0,    80,    22,    23,    22,    23,     0,    82,     0,
      83,   113,    22,    23,    22,    23,    22,    23,   115,     0,
     117,     0,   119,    22,    23,    22,    23,    22,    23,   121,
       0,   123,     0,   126,    22,    23,    37,    38,     0,     0,
     128,    39
};

#define yypact_value_is_default(yystate) \
  ((yystate) == (-67))

#define yytable_value_is_error(yytable_value) \
  YYID (0)

static const yytype_int8 yycheck[] =
{
      11,    28,    68,    18,    10,    71,    15,    16,    74,    20,
      11,    77,    27,    22,    80,    26,    31,    83,    17,    30,
      23,    24,    26,    27,    35,    28,    37,    38,    31,    40,
      41,    17,    18,    20,    21,    22,    22,    48,    49,    54,
      26,    27,    64,    30,    29,    67,    23,    24,    70,    60,
      33,    73,    63,    -1,    76,    23,    24,    79,    23,    24,
      82,    29,    -1,    28,    -1,    30,    88,    -1,     0,    -1,
      85,     3,     4,     5,     6,     7,     8,     9,    -1,    23,
      24,    -1,    -1,    94,    28,    96,    30,    98,   110,   100,
      22,   102,    -1,   104,    -1,   106,    12,    13,    14,    17,
      18,    19,    -1,    -1,    22,    -1,    22,    23,    24,    27,
      23,    24,    28,    20,    21,    22,    29,    23,    24,    23,
      24,    -1,    28,    30,    28,    31,    -1,    31,    23,    24,
      23,    24,    -1,    28,    -1,    28,    31,    -1,    31,    23,
      24,    23,    24,    -1,    28,    -1,    28,    31,    -1,    31,
      23,    24,    23,    24,    -1,    28,    -1,    28,    31,    -1,
      31,    23,    24,    -1,    23,    24,    28,    -1,    30,    28,
      -1,    30,    23,    24,    -1,    23,    24,    28,    -1,    30,
      28,    -1,    30,    23,    24,    23,    24,    -1,    28,    -1,
      30,    29,    23,    24,    23,    24,    23,    24,    29,    -1,
      29,    -1,    29,    23,    24,    23,    24,    23,    24,    29,
      -1,    29,    -1,    29,    23,    24,    17,    18,    -1,    -1,
      29,    22
};

/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
   symbol of state STATE-NUM.  */
static const yytype_uint8 yystos[] =
{
       0,    33,     0,     3,     4,     5,     6,     7,     8,     9,
      22,    34,    35,    36,    37,    38,    39,    40,    12,    13,
      14,    22,    23,    24,    28,    44,    20,    21,    22,    30,
      20,    21,    22,    30,    15,    16,    22,    17,    18,    22,
      17,    18,    22,    26,    27,    45,    46,    47,    17,    18,
      19,    22,    47,    45,    28,    44,    43,    44,    45,    10,
      41,    44,    45,    41,    28,    30,    44,    28,    30,    44,
      28,    30,    44,    28,    30,    44,    28,    30,    44,    28,
      30,    44,    28,    30,    44,    45,    29,    44,    28,    31,
      44,    31,    43,    11,    42,    43,    42,    43,    42,    43,
      42,    43,    42,    43,    42,    43,    42,    45,    43,    29,
      28,    31,    44,    29,    31,    29,    31,    29,    31,    29,
      31,    29,    31,    29,    31,    29,    29,    43,    29
};

#define yyerrok		(yyerrstatus = 0)
#define yyclearin	(yychar = YYEMPTY)
#define YYEMPTY		(-2)
#define YYEOF		0

#define YYACCEPT	goto yyacceptlab
#define YYABORT		goto yyabortlab
#define YYERROR		goto yyerrorlab


/* Like YYERROR except do call yyerror.  This remains here temporarily
   to ease the transition to the new meaning of YYERROR, for GCC.
   Once GCC version 2 has supplanted version 1, this can go.  However,
   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
   discussed.  */

#define YYFAIL		goto yyerrlab
#if defined YYFAIL
  /* This is here to suppress warnings from the GCC cpp's
     -Wunused-macros.  Normally we don't worry about that warning, but
     some users do, and we want to make it easy for users to remove
     YYFAIL uses, which will produce warnings from Bison 2.5.  */
#endif

#define YYRECOVERING()  (!!yyerrstatus)

#define YYBACKUP(Token, Value)					\
do								\
  if (yychar == YYEMPTY && yylen == 1)				\
    {								\
      yychar = (Token);						\
      yylval = (Value);						\
      YYPOPSTACK (1);						\
      goto yybackup;						\
    }								\
  else								\
    {								\
      yyerror (YY_("syntax error: cannot back up")); \
      YYERROR;							\
    }								\
while (YYID (0))


#define YYTERROR	1
#define YYERRCODE	256


/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
   If N is 0, then set CURRENT to the empty location which ends
   the previous symbol: RHS[0] (always defined).  */

#define YYRHSLOC(Rhs, K) ((Rhs)[K])
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N)				\
    do									\
      if (YYID (N))                                                    \
	{								\
	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
	}								\
      else								\
	{								\
	  (Current).first_line   = (Current).last_line   =		\
	    YYRHSLOC (Rhs, 0).last_line;				\
	  (Current).first_column = (Current).last_column =		\
	    YYRHSLOC (Rhs, 0).last_column;				\
	}								\
    while (YYID (0))
#endif


/* This macro is provided for backward compatibility. */

#ifndef YY_LOCATION_PRINT
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
#endif


/* YYLEX -- calling `yylex' with the right arguments.  */

#ifdef YYLEX_PARAM
# define YYLEX yylex (YYLEX_PARAM)
#else
# define YYLEX yylex ()
#endif

/* Enable debugging if requested.  */
#if YYDEBUG

# ifndef YYFPRINTF
#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
#  define YYFPRINTF fprintf
# endif

# define YYDPRINTF(Args)			\
do {						\
  if (yydebug)					\
    YYFPRINTF Args;				\
} while (YYID (0))

# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
do {									  \
  if (yydebug)								  \
    {									  \
      YYFPRINTF (stderr, "%s ", Title);					  \
      yy_symbol_print (stderr,						  \
		  Type, Value); \
      YYFPRINTF (stderr, "\n");						  \
    }									  \
} 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, YYSTYPE const * const yyvaluep)
#else
static void
yy_symbol_value_print (yyoutput, yytype, yyvaluep)
    FILE *yyoutput;
    int yytype;
    YYSTYPE const * const yyvaluep;
#endif
{
  if (!yyvaluep)
    return;
# ifdef YYPRINT
  if (yytype < YYNTOKENS)
    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
# else
  YYUSE (yyoutput);
# endif
  switch (yytype)
    {
      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, YYSTYPE const * const yyvaluep)
#else
static void
yy_symbol_print (yyoutput, yytype, yyvaluep)
    FILE *yyoutput;
    int yytype;
    YYSTYPE const * const yyvaluep;
#endif
{
  if (yytype < YYNTOKENS)
    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
  else
    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);

  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
  YYFPRINTF (yyoutput, ")");
}

/*------------------------------------------------------------------.
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
| TOP (included).                                                   |
`------------------------------------------------------------------*/

#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
#else
static void
yy_stack_print (yybottom, yytop)
    yytype_int16 *yybottom;
    yytype_int16 *yytop;
#endif
{
  YYFPRINTF (stderr, "Stack now");
  for (; yybottom <= yytop; yybottom++)
    {
      int yybot = *yybottom;
      YYFPRINTF (stderr, " %d", yybot);
    }
  YYFPRINTF (stderr, "\n");
}

# define YY_STACK_PRINT(Bottom, Top)				\
do {								\
  if (yydebug)							\
    yy_stack_print ((Bottom), (Top));				\
} while (YYID (0))


/*------------------------------------------------.
| Report that the YYRULE is going to be reduced.  |
`------------------------------------------------*/

#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
#else
static void
yy_reduce_print (yyvsp, yyrule)
    YYSTYPE *yyvsp;
    int yyrule;
#endif
{
  int yynrhs = yyr2[yyrule];
  int yyi;
  unsigned long int yylno = yyrline[yyrule];
  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
	     yyrule - 1, yylno);
  /* The symbols being reduced.  */
  for (yyi = 0; yyi < yynrhs; yyi++)
    {
      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
		       &(yyvsp[(yyi + 1) - (yynrhs)])
		       		       );
      YYFPRINTF (stderr, "\n");
    }
}

# define YY_REDUCE_PRINT(Rule)		\
do {					\
  if (yydebug)				\
    yy_reduce_print (yyvsp, Rule); \
} while (YYID (0))

/* Nonzero means print parse trace.  It is left uninitialized so that
   multiple parsers can coexist.  */
int yydebug;
#else /* !YYDEBUG */
# define YYDPRINTF(Args)
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
# define YY_STACK_PRINT(Bottom, Top)
# define YY_REDUCE_PRINT(Rule)
#endif /* !YYDEBUG */


/* YYINITDEPTH -- initial size of the parser's stacks.  */
#ifndef	YYINITDEPTH
# define YYINITDEPTH 200
#endif

/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
   if the built-in stack extension method is used).

   Do not make this value too large; the results are undefined if
   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
   evaluated with infinite-precision integer arithmetic.  */

#ifndef YYMAXDEPTH
# define YYMAXDEPTH 10000
#endif


#if YYERROR_VERBOSE

# ifndef yystrlen
#  if defined __GLIBC__ && defined _STRING_H
#   define yystrlen strlen
#  else
/* Return the length of YYSTR.  */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static YYSIZE_T
yystrlen (const char *yystr)
#else
static YYSIZE_T
yystrlen (yystr)
    const char *yystr;
#endif
{
  YYSIZE_T yylen;
  for (yylen = 0; yystr[yylen]; yylen++)
    continue;
  return yylen;
}
#  endif
# endif

# ifndef yystpcpy
#  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.  */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static char *
yystpcpy (char *yydest, const char *yysrc)
#else
static char *
yystpcpy (yydest, yysrc)
    char *yydest;
    const char *yysrc;
#endif
{
  char *yyd = yydest;
  const char *yys = yysrc;

  while ((*yyd++ = *yys++) != '\0')
    continue;

  return yyd - 1;
}
#  endif
# endif

# ifndef yytnamerr
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
   quotes and backslashes, so that it's suitable for yyerror.  The
   heuristic is that double-quoting is unnecessary unless the string
   contains an apostrophe, a comma, or backslash (other than
   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
   null, do not copy; instead, return the length of what the result
   would have been.  */
static YYSIZE_T
yytnamerr (char *yyres, const char *yystr)
{
  if (*yystr == '"')
    {
      YYSIZE_T yyn = 0;
      char const *yyp = yystr;

      for (;;)
	switch (*++yyp)
	  {
	  case '\'':
	  case ',':
	    goto do_not_strip_quotes;

	  case '\\':
	    if (*++yyp != '\\')
	      goto do_not_strip_quotes;
	    /* Fall through.  */
	  default:
	    if (yyres)
	      yyres[yyn] = *yyp;
	    yyn++;
	    break;

	  case '"':
	    if (yyres)
	      yyres[yyn] = '\0';
	    return yyn;
	  }
    do_not_strip_quotes: ;
    }

  if (! yyres)
    return yystrlen (yystr);

  return yystpcpy (yyres, yystr) - yyres;
}
# endif

/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
   about the unexpected token YYTOKEN for the state stack whose top is
   YYSSP.

   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
   not large enough to hold the message.  In that case, also set
   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
   required number of bytes is too large to store.  */
static int
yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                yytype_int16 *yyssp, int yytoken)
{
  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
  YYSIZE_T yysize = yysize0;
  YYSIZE_T yysize1;
  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
  /* Internationalized format string. */
  const char *yyformat = 0;
  /* Arguments of yyformat. */
  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
  /* Number of reported tokens (one for the "unexpected", one per
     "expected"). */
  int yycount = 0;

  /* There are many possibilities here to consider:
     - Assume YYFAIL is not used.  It's too flawed to consider.  See
       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
       for details.  YYERROR is fine as it does not invoke this
       function.
     - If this state is a consistent state with a default action, then
       the only way this function was invoked is if the default action
       is an error action.  In that case, don't check for expected
       tokens because there are none.
     - The only way there can be no lookahead present (in yychar) is if
       this state is a consistent state with a default action.  Thus,
       detecting the absence of a lookahead is sufficient to determine
       that there is no unexpected or expected token to report.  In that
       case, just report a simple "syntax error".
     - Don't assume there isn't a lookahead just because this state is a
       consistent state with a default action.  There might have been a
       previous inconsistent state, consistent state with a non-default
       action, or user semantic action that manipulated yychar.
     - Of course, the expected token list depends on states to have
       correct lookahead information, and it depends on the parser not
       to perform extra reductions after fetching a lookahead from the
       scanner and before detecting a syntax error.  Thus, state merging
       (from LALR or IELR) and default reductions corrupt the expected
       token list.  However, the list is correct for canonical LR with
       one exception: it will still contain any token that will not be
       accepted due to an error action in a later state.
  */
  if (yytoken != YYEMPTY)
    {
      int yyn = yypact[*yyssp];
      yyarg[yycount++] = yytname[yytoken];
      if (!yypact_value_is_default (yyn))
        {
          /* Start YYX at -YYN if negative to avoid negative indexes in
             YYCHECK.  In other words, skip the first -YYN actions for
             this state because they are default actions.  */
          int yyxbegin = yyn < 0 ? -yyn : 0;
          /* Stay within bounds of both yycheck and yytname.  */
          int yychecklim = YYLAST - yyn + 1;
          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
          int yyx;

          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
                && !yytable_value_is_error (yytable[yyx + yyn]))
              {
                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
                  {
                    yycount = 1;
                    yysize = yysize0;
                    break;
                  }
                yyarg[yycount++] = yytname[yyx];
                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
                if (! (yysize <= yysize1
                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
                  return 2;
                yysize = yysize1;
              }
        }
    }

  switch (yycount)
    {
# define YYCASE_(N, S)                      \
      case N:                               \
        yyformat = S;                       \
      break
      YYCASE_(0, YY_("syntax error"));
      YYCASE_(1, YY_("syntax error, unexpected %s"));
      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
# undef YYCASE_
    }

  yysize1 = yysize + yystrlen (yyformat);
  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
    return 2;
  yysize = yysize1;

  if (*yymsg_alloc < yysize)
    {
      *yymsg_alloc = 2 * yysize;
      if (! (yysize <= *yymsg_alloc
             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
      return 1;
    }

  /* 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 = *yymsg;
    int yyi = 0;
    while ((*yyp = *yyformat) != '\0')
      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
        {
          yyp += yytnamerr (yyp, yyarg[yyi++]);
          yyformat += 2;
        }
      else
        {
          yyp++;
          yyformat++;
        }
  }
  return 0;
}
#endif /* YYERROR_VERBOSE */

/*-----------------------------------------------.
| Release the memory associated to this symbol.  |
`-----------------------------------------------*/

/*ARGSUSED*/
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
static void
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
#else
static void
yydestruct (yymsg, yytype, yyvaluep)
    const char *yymsg;
    int yytype;
    YYSTYPE *yyvaluep;
#endif
{
  YYUSE (yyvaluep);

  if (!yymsg)
    yymsg = "Deleting";
  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);

  switch (yytype)
    {

      default:
	break;
    }
}


/* Prevent warnings from -Wmissing-prototypes.  */
#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (void);
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */


/* The lookahead symbol.  */
int yychar;

/* The semantic value of the lookahead symbol.  */
YYSTYPE yylval;

/* Number of syntax errors so far.  */
int yynerrs;


/*----------.
| yyparse.  |
`----------*/

#ifdef YYPARSE_PARAM
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
int
yyparse (void *YYPARSE_PARAM)
#else
int
yyparse (YYPARSE_PARAM)
    void *YYPARSE_PARAM;
#endif
#else /* ! YYPARSE_PARAM */
#if (defined __STDC__ || defined __C99__FUNC__ \
     || defined __cplusplus || defined _MSC_VER)
int
yyparse (void)
#else
int
yyparse ()

#endif
#endif
{
    int yystate;
    /* Number of tokens to shift before error messages enabled.  */
    int yyerrstatus;

    /* The stacks and their tools:
       `yyss': related to states.
       `yyvs': related to semantic values.

       Refer to the stacks thru separate pointers, to allow yyoverflow
       to reallocate them elsewhere.  */

    /* The state stack.  */
    yytype_int16 yyssa[YYINITDEPTH];
    yytype_int16 *yyss;
    yytype_int16 *yyssp;

    /* The semantic value stack.  */
    YYSTYPE yyvsa[YYINITDEPTH];
    YYSTYPE *yyvs;
    YYSTYPE *yyvsp;

    YYSIZE_T yystacksize;

  int yyn;
  int yyresult;
  /* Lookahead token as an internal (translated) token number.  */
  int yytoken;
  /* The variables used to return semantic value and location from the
     action routines.  */
  YYSTYPE yyval;

#if YYERROR_VERBOSE
  /* Buffer for error messages, and its allocated size.  */
  char yymsgbuf[128];
  char *yymsg = yymsgbuf;
  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
#endif

#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))

  /* The number of symbols on the RHS of the reduced rule.
     Keep to zero when no symbol should be popped.  */
  int yylen = 0;

  yytoken = 0;
  yyss = yyssa;
  yyvs = yyvsa;
  yystacksize = YYINITDEPTH;

  YYDPRINTF ((stderr, "Starting parse\n"));

  yystate = 0;
  yyerrstatus = 0;
  yynerrs = 0;
  yychar = YYEMPTY; /* Cause a token to be read.  */

  /* Initialize stack pointers.
     Waste one element of value and location stack
     so that they stay on the same level as the state stack.
     The wasted elements are never initialized.  */
  yyssp = yyss;
  yyvsp = yyvs;

  goto yysetstate;

/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate.  |
`------------------------------------------------------------*/
 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.  */
  yyssp++;

 yysetstate:
  *yyssp = yystate;

  if (yyss + yystacksize - 1 <= yyssp)
    {
      /* Get the current used size of the three stacks, in elements.  */
      YYSIZE_T yysize = yyssp - yyss + 1;

#ifdef yyoverflow
      {
	/* 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;
	yytype_int16 *yyss1 = yyss;

	/* Each stack pointer address is followed by the size of the
	   data in use in that stack, in bytes.  This used to be a
	   conditional around just the two extra args, but that might
	   be undefined if yyoverflow is a macro.  */
	yyoverflow (YY_("memory exhausted"),
		    &yyss1, yysize * sizeof (*yyssp),
		    &yyvs1, yysize * sizeof (*yyvsp),
		    &yystacksize);

	yyss = yyss1;
	yyvs = yyvs1;
      }
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
      goto yyexhaustedlab;
# else
      /* Extend the stack our own way.  */
      if (YYMAXDEPTH <= yystacksize)
	goto yyexhaustedlab;
      yystacksize *= 2;
      if (YYMAXDEPTH < yystacksize)
	yystacksize = YYMAXDEPTH;

      {
	yytype_int16 *yyss1 = yyss;
	union yyalloc *yyptr =
	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
	if (! yyptr)
	  goto yyexhaustedlab;
	YYSTACK_RELOCATE (yyss_alloc, yyss);
	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
#  undef YYSTACK_RELOCATE
	if (yyss1 != yyssa)
	  YYSTACK_FREE (yyss1);
      }
# endif
#endif /* no yyoverflow */

      yyssp = yyss + yysize - 1;
      yyvsp = yyvs + yysize - 1;

      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
		  (unsigned long int) yystacksize));

      if (yyss + yystacksize - 1 <= yyssp)
	YYABORT;
    }

  YYDPRINTF ((stderr, "Entering state %d\n", yystate));

  if (yystate == YYFINAL)
    YYACCEPT;

  goto yybackup;

/*-----------.
| yybackup.  |
`-----------*/
yybackup:

  /* Do appropriate processing given the current state.  Read a
     lookahead token if we need one and don't already have one.  */

  /* First try to decide what to do without reference to lookahead token.  */
  yyn = yypact[yystate];
  if (yypact_value_is_default (yyn))
    goto yydefault;

  /* Not known => get a lookahead token if don't already have one.  */

  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
  if (yychar == YYEMPTY)
    {
      YYDPRINTF ((stderr, "Reading a token: "));
      yychar = YYLEX;
    }

  if (yychar <= YYEOF)
    {
      yychar = yytoken = YYEOF;
      YYDPRINTF ((stderr, "Now at end of input.\n"));
    }
  else
    {
      yytoken = YYTRANSLATE (yychar);
      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
    }

  /* If the proper action on seeing token YYTOKEN is to reduce or to
     detect an error, take that action.  */
  yyn += yytoken;
  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
    goto yydefault;
  yyn = yytable[yyn];
  if (yyn <= 0)
    {
      if (yytable_value_is_error (yyn))
        goto yyerrlab;
      yyn = -yyn;
      goto yyreduce;
    }

  /* Count tokens shifted since error; after three, turn off error
     status.  */
  if (yyerrstatus)
    yyerrstatus--;

  /* Shift the lookahead token.  */
  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);

  /* Discard the shifted token.  */
  yychar = YYEMPTY;

  yystate = yyn;
  *++yyvsp = yylval;

  goto yynewstate;


/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state.  |
`-----------------------------------------------------------*/
yydefault:
  yyn = yydefact[yystate];
  if (yyn == 0)
    goto yyerrlab;
  goto yyreduce;


/*-----------------------------.
| yyreduce -- Do a reduction.  |
`-----------------------------*/
yyreduce:
  /* yyn is the number of a rule to reduce with.  */
  yylen = yyr2[yyn];

  /* If YYLEN is nonzero, implement the default value of the action:
     `$$ = $1'.

     Otherwise, the following line sets YYVAL to garbage.
     This behavior is undocumented and Bison
     users should not rely upon it.  Assigning to YYVAL
     unconditionally makes the parser a bit smaller, and it avoids a
     GCC warning that YYVAL may be used uninitialized.  */
  yyval = yyvsp[1-yylen];


  YY_REDUCE_PRINT (yyn);
  switch (yyn)
    {
        case 2:

/* Line 1806 of yacc.c  */
#line 87 "src/sdc_parse.y"
    { g_sdc_commands = alloc_sdc_commands(); (yyval.sdc_commands) = g_sdc_commands; }
    break;

  case 3:

/* Line 1806 of yacc.c  */
#line 88 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_create_clock((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].create_clock)); }
    break;

  case 4:

/* Line 1806 of yacc.c  */
#line 89 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_io_delay((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_io_delay)); }
    break;

  case 5:

/* Line 1806 of yacc.c  */
#line 90 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_io_delay((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_io_delay)); }
    break;

  case 6:

/* Line 1806 of yacc.c  */
#line 91 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_clock_groups((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_clock_groups)); }
    break;

  case 7:

/* Line 1806 of yacc.c  */
#line 92 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_false_path((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_false_path)); }
    break;

  case 8:

/* Line 1806 of yacc.c  */
#line 93 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_max_delay((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_max_delay)); }
    break;

  case 9:

/* Line 1806 of yacc.c  */
#line 94 "src/sdc_parse.y"
    { (yyval.sdc_commands) = add_sdc_set_multicycle_path((yyvsp[(1) - (3)].sdc_commands), (yyvsp[(2) - (3)].set_multicycle_path)); }
    break;

  case 10:

/* Line 1806 of yacc.c  */
#line 95 "src/sdc_parse.y"
    { /* Eat stray EOL symbols */ (yyval.sdc_commands) = (yyvsp[(1) - (2)].sdc_commands); }
    break;

  case 11:

/* Line 1806 of yacc.c  */
#line 98 "src/sdc_parse.y"
    { (yyval.create_clock) = alloc_sdc_create_clock(); }
    break;

  case 12:

/* Line 1806 of yacc.c  */
#line 99 "src/sdc_parse.y"
    { (yyval.create_clock) = sdc_create_clock_set_period((yyvsp[(1) - (3)].create_clock), (yyvsp[(3) - (3)].floatVal)); }
    break;

  case 13:

/* Line 1806 of yacc.c  */
#line 100 "src/sdc_parse.y"
    { (yyval.create_clock) = sdc_create_clock_set_name((yyvsp[(1) - (3)].create_clock), (yyvsp[(3) - (3)].strVal)); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 14:

/* Line 1806 of yacc.c  */
#line 101 "src/sdc_parse.y"
    { (yyval.create_clock) = sdc_create_clock_set_waveform((yyvsp[(1) - (6)].create_clock), (yyvsp[(4) - (6)].floatVal), (yyvsp[(5) - (6)].floatVal)); }
    break;

  case 15:

/* Line 1806 of yacc.c  */
#line 102 "src/sdc_parse.y"
    { (yyval.create_clock) = sdc_create_clock_add_targets((yyvsp[(1) - (4)].create_clock), (yyvsp[(3) - (4)].string_group)); free_sdc_string_group((yyvsp[(3) - (4)].string_group)); }
    break;

  case 16:

/* Line 1806 of yacc.c  */
#line 103 "src/sdc_parse.y"
    { (yyval.create_clock) = sdc_create_clock_add_targets((yyvsp[(1) - (2)].create_clock), make_sdc_string_group(SDC_STRING, (yyvsp[(2) - (2)].strVal))); free((yyvsp[(2) - (2)].strVal)); }
    break;

  case 17:

/* Line 1806 of yacc.c  */
#line 106 "src/sdc_parse.y"
    { (yyval.set_io_delay) = alloc_sdc_set_io_delay(SDC_INPUT_DELAY); }
    break;

  case 18:

/* Line 1806 of yacc.c  */
#line 107 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_clock((yyvsp[(1) - (3)].set_io_delay), (yyvsp[(3) - (3)].strVal)); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 19:

/* Line 1806 of yacc.c  */
#line 108 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_max_value((yyvsp[(1) - (3)].set_io_delay), (yyvsp[(3) - (3)].floatVal)); }
    break;

  case 20:

/* Line 1806 of yacc.c  */
#line 109 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_ports((yyvsp[(1) - (4)].set_io_delay), (yyvsp[(3) - (4)].string_group)); free_sdc_string_group((yyvsp[(3) - (4)].string_group)); }
    break;

  case 21:

/* Line 1806 of yacc.c  */
#line 112 "src/sdc_parse.y"
    { (yyval.set_io_delay) = alloc_sdc_set_io_delay(SDC_OUTPUT_DELAY); }
    break;

  case 22:

/* Line 1806 of yacc.c  */
#line 113 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_clock((yyvsp[(1) - (3)].set_io_delay), (yyvsp[(3) - (3)].strVal)); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 23:

/* Line 1806 of yacc.c  */
#line 114 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_max_value((yyvsp[(1) - (3)].set_io_delay), (yyvsp[(3) - (3)].floatVal)); }
    break;

  case 24:

/* Line 1806 of yacc.c  */
#line 115 "src/sdc_parse.y"
    { (yyval.set_io_delay) = sdc_set_io_delay_set_ports((yyvsp[(1) - (4)].set_io_delay), (yyvsp[(3) - (4)].string_group)); free_sdc_string_group((yyvsp[(3) - (4)].string_group)); }
    break;

  case 25:

/* Line 1806 of yacc.c  */
#line 118 "src/sdc_parse.y"
    { (yyval.set_clock_groups) = alloc_sdc_set_clock_groups(); }
    break;

  case 26:

/* Line 1806 of yacc.c  */
#line 119 "src/sdc_parse.y"
    { (yyval.set_clock_groups) = sdc_set_clock_groups_set_type((yyvsp[(1) - (2)].set_clock_groups), SDC_CG_EXCLUSIVE); }
    break;

  case 27:

/* Line 1806 of yacc.c  */
#line 120 "src/sdc_parse.y"
    { (yyval.set_clock_groups) = sdc_set_clock_groups_add_group((yyvsp[(1) - (5)].set_clock_groups), (yyvsp[(4) - (5)].string_group)); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 28:

/* Line 1806 of yacc.c  */
#line 121 "src/sdc_parse.y"
    { (yyval.set_clock_groups) = sdc_set_clock_groups_add_group((yyvsp[(1) - (5)].set_clock_groups), (yyvsp[(4) - (5)].string_group)); free_sdc_string_group((yyvsp[(4) - (5)].string_group));}
    break;

  case 29:

/* Line 1806 of yacc.c  */
#line 122 "src/sdc_parse.y"
    { (yyval.set_clock_groups) = sdc_set_clock_groups_add_group((yyvsp[(1) - (3)].set_clock_groups), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal))); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 30:

/* Line 1806 of yacc.c  */
#line 125 "src/sdc_parse.y"
    { (yyval.set_false_path) = alloc_sdc_set_false_path(); }
    break;

  case 31:

/* Line 1806 of yacc.c  */
#line 126 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (5)].set_false_path), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 32:

/* Line 1806 of yacc.c  */
#line 127 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (5)].set_false_path), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 33:

/* Line 1806 of yacc.c  */
#line 128 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (5)].set_false_path), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 34:

/* Line 1806 of yacc.c  */
#line 129 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (5)].set_false_path), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 35:

/* Line 1806 of yacc.c  */
#line 130 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (3)].set_false_path), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_FROM); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 36:

/* Line 1806 of yacc.c  */
#line 131 "src/sdc_parse.y"
    { (yyval.set_false_path) = sdc_set_false_path_add_to_from_group((yyvsp[(1) - (3)].set_false_path), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_TO  ); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 37:

/* Line 1806 of yacc.c  */
#line 134 "src/sdc_parse.y"
    { (yyval.set_max_delay) = alloc_sdc_set_max_delay(); }
    break;

  case 38:

/* Line 1806 of yacc.c  */
#line 135 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_set_max_delay_value((yyvsp[(1) - (2)].set_max_delay), (yyvsp[(2) - (2)].floatVal)); }
    break;

  case 39:

/* Line 1806 of yacc.c  */
#line 136 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (5)].set_max_delay), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 40:

/* Line 1806 of yacc.c  */
#line 137 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (5)].set_max_delay), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 41:

/* Line 1806 of yacc.c  */
#line 138 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (5)].set_max_delay), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 42:

/* Line 1806 of yacc.c  */
#line 139 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (5)].set_max_delay), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 43:

/* Line 1806 of yacc.c  */
#line 140 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (3)].set_max_delay), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_FROM); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 44:

/* Line 1806 of yacc.c  */
#line 141 "src/sdc_parse.y"
    { (yyval.set_max_delay) = sdc_set_max_delay_add_to_from_group((yyvsp[(1) - (3)].set_max_delay), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_TO  ); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 45:

/* Line 1806 of yacc.c  */
#line 144 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = alloc_sdc_set_multicycle_path(); }
    break;

  case 46:

/* Line 1806 of yacc.c  */
#line 145 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_set_mcp_value((yyvsp[(1) - (2)].set_multicycle_path), (yyvsp[(2) - (2)].intVal)); }
    break;

  case 47:

/* Line 1806 of yacc.c  */
#line 146 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_set_type((yyvsp[(1) - (2)].set_multicycle_path), SDC_MCP_SETUP); }
    break;

  case 48:

/* Line 1806 of yacc.c  */
#line 147 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (5)].set_multicycle_path), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 49:

/* Line 1806 of yacc.c  */
#line 148 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (5)].set_multicycle_path), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 50:

/* Line 1806 of yacc.c  */
#line 149 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (5)].set_multicycle_path), (yyvsp[(4) - (5)].string_group), SDC_FROM); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 51:

/* Line 1806 of yacc.c  */
#line 150 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (5)].set_multicycle_path), (yyvsp[(4) - (5)].string_group), SDC_TO  ); free_sdc_string_group((yyvsp[(4) - (5)].string_group)); }
    break;

  case 52:

/* Line 1806 of yacc.c  */
#line 151 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (3)].set_multicycle_path), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_FROM); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 53:

/* Line 1806 of yacc.c  */
#line 152 "src/sdc_parse.y"
    { (yyval.set_multicycle_path) = sdc_set_multicycle_path_add_to_from_group((yyvsp[(1) - (3)].set_multicycle_path), make_sdc_string_group(SDC_STRING, (yyvsp[(3) - (3)].strVal)), SDC_TO  ); free((yyvsp[(3) - (3)].strVal)); }
    break;

  case 54:

/* Line 1806 of yacc.c  */
#line 155 "src/sdc_parse.y"
    { (yyval.string_group) = alloc_sdc_string_group(SDC_PORT); }
    break;

  case 55:

/* Line 1806 of yacc.c  */
#line 156 "src/sdc_parse.y"
    { (yyval.string_group) = sdc_string_group_add_strings((yyvsp[(1) - (4)].string_group), (yyvsp[(3) - (4)].string_group)); free_sdc_string_group((yyvsp[(3) - (4)].string_group)); }
    break;

  case 56:

/* Line 1806 of yacc.c  */
#line 157 "src/sdc_parse.y"
    { (yyval.string_group) = sdc_string_group_add_string((yyvsp[(1) - (2)].string_group), (yyvsp[(2) - (2)].strVal)); free((yyvsp[(2) - (2)].strVal)); }
    break;

  case 57:

/* Line 1806 of yacc.c  */
#line 160 "src/sdc_parse.y"
    { (yyval.string_group) = alloc_sdc_string_group(SDC_CLOCK); }
    break;

  case 58:

/* Line 1806 of yacc.c  */
#line 161 "src/sdc_parse.y"
    { (yyval.string_group) = sdc_string_group_add_strings((yyvsp[(1) - (4)].string_group), (yyvsp[(3) - (4)].string_group)); free_sdc_string_group((yyvsp[(3) - (4)].string_group)); }
    break;

  case 59:

/* Line 1806 of yacc.c  */
#line 162 "src/sdc_parse.y"
    { (yyval.string_group) = sdc_string_group_add_string((yyvsp[(1) - (2)].string_group), (yyvsp[(2) - (2)].strVal)); free((yyvsp[(2) - (2)].strVal)); }
    break;

  case 60:

/* Line 1806 of yacc.c  */
#line 165 "src/sdc_parse.y"
    { (yyval.string_group) = alloc_sdc_string_group(SDC_STRING); }
    break;

  case 61:

/* Line 1806 of yacc.c  */
#line 166 "src/sdc_parse.y"
    { (yyval.string_group) = sdc_string_group_add_string((yyvsp[(1) - (2)].string_group), (yyvsp[(2) - (2)].strVal)); free((yyvsp[(2) - (2)].strVal)); }
    break;

  case 62:

/* Line 1806 of yacc.c  */
#line 168 "src/sdc_parse.y"
    { (yyval.strVal) = (yyvsp[(1) - (1)].strVal); }
    break;

  case 63:

/* Line 1806 of yacc.c  */
#line 169 "src/sdc_parse.y"
    { (yyval.strVal) = (yyvsp[(1) - (1)].strVal); }
    break;

  case 64:

/* Line 1806 of yacc.c  */
#line 172 "src/sdc_parse.y"
    { (yyval.floatVal) = (yyvsp[(1) - (1)].floatVal); }
    break;

  case 65:

/* Line 1806 of yacc.c  */
#line 173 "src/sdc_parse.y"
    { (yyval.floatVal) = (yyvsp[(1) - (1)].intVal); }
    break;

  case 66:

/* Line 1806 of yacc.c  */
#line 176 "src/sdc_parse.y"
    { (yyval.floatVal) = (yyvsp[(1) - (1)].floatVal); }
    break;

  case 67:

/* Line 1806 of yacc.c  */
#line 179 "src/sdc_parse.y"
    { (yyval.intVal) = (yyvsp[(1) - (1)].intVal); }
    break;



/* Line 1806 of yacc.c  */
#line 1998 "src/sdc_parse.tab.c"
      default: break;
    }
  /* User semantic actions sometimes alter yychar, and that requires
     that yytoken be updated with the new translation.  We take the
     approach of translating immediately before every use of yytoken.
     One alternative is translating here after every semantic action,
     but that translation would be missed if the semantic action invokes
     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
     incorrect destructor might then be invoked immediately.  In the
     case of YYERROR or YYBACKUP, subsequent parser actions might lead
     to an incorrect destructor call or verbose syntax error message
     before the lookahead is translated.  */
  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);

  YYPOPSTACK (yylen);
  yylen = 0;
  YY_STACK_PRINT (yyss, yyssp);

  *++yyvsp = yyval;

  /* Now `shift' the result of the reduction.  Determine what state
     that goes to, based on the state we popped back to and the rule
     number reduced by.  */

  yyn = yyr1[yyn];

  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - YYNTOKENS];

  goto yynewstate;


/*------------------------------------.
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
  /* Make sure we have latest lookahead translation.  See comments at
     user semantic actions for why this is necessary.  */
  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);

  /* If not already recovering from an error, report this error.  */
  if (!yyerrstatus)
    {
      ++yynerrs;
#if ! YYERROR_VERBOSE
      yyerror (YY_("syntax error"));
#else
# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
                                        yyssp, yytoken)
      {
        char const *yymsgp = YY_("syntax error");
        int yysyntax_error_status;
        yysyntax_error_status = YYSYNTAX_ERROR;
        if (yysyntax_error_status == 0)
          yymsgp = yymsg;
        else if (yysyntax_error_status == 1)
          {
            if (yymsg != yymsgbuf)
              YYSTACK_FREE (yymsg);
            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
            if (!yymsg)
              {
                yymsg = yymsgbuf;
                yymsg_alloc = sizeof yymsgbuf;
                yysyntax_error_status = 2;
              }
            else
              {
                yysyntax_error_status = YYSYNTAX_ERROR;
                yymsgp = yymsg;
              }
          }
        yyerror (yymsgp);
        if (yysyntax_error_status == 2)
          goto yyexhaustedlab;
      }
# undef YYSYNTAX_ERROR
#endif
    }



  if (yyerrstatus == 3)
    {
      /* If just tried and failed to reuse lookahead token after an
	 error, discard it.  */

      if (yychar <= YYEOF)
	{
	  /* Return failure if at end of input.  */
	  if (yychar == YYEOF)
	    YYABORT;
	}
      else
	{
	  yydestruct ("Error: discarding",
		      yytoken, &yylval);
	  yychar = YYEMPTY;
	}
    }

  /* Else will try to reuse lookahead token after shifting the error
     token.  */
  goto yyerrlab1;


/*---------------------------------------------------.
| yyerrorlab -- error raised explicitly by YYERROR.  |
`---------------------------------------------------*/
yyerrorlab:

  /* Pacify compilers like GCC when the user code never invokes
     YYERROR and the label yyerrorlab therefore never appears in user
     code.  */
  if (/*CONSTCOND*/ 0)
     goto yyerrorlab;

  /* 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;


/*-------------------------------------------------------------.
| yyerrlab1 -- common code for both syntax error and YYERROR.  |
`-------------------------------------------------------------*/
yyerrlab1:
  yyerrstatus = 3;	/* Each real token shifted decrements this.  */

  for (;;)
    {
      yyn = yypact[yystate];
      if (!yypact_value_is_default (yyn))
	{
	  yyn += YYTERROR;
	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
	    {
	      yyn = yytable[yyn];
	      if (0 < yyn)
		break;
	    }
	}

      /* Pop the current state because it cannot handle the error token.  */
      if (yyssp == yyss)
	YYABORT;


      yydestruct ("Error: popping",
		  yystos[yystate], yyvsp);
      YYPOPSTACK (1);
      yystate = *yyssp;
      YY_STACK_PRINT (yyss, yyssp);
    }

  *++yyvsp = yylval;


  /* Shift the error token.  */
  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);

  yystate = yyn;
  goto yynewstate;


/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here.  |
`-------------------------------------*/
yyacceptlab:
  yyresult = 0;
  goto yyreturn;

/*-----------------------------------.
| yyabortlab -- YYABORT comes here.  |
`-----------------------------------*/
yyabortlab:
  yyresult = 1;
  goto yyreturn;

#if !defined(yyoverflow) || YYERROR_VERBOSE
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here.  |
`-------------------------------------------------*/
yyexhaustedlab:
  yyerror (YY_("memory exhausted"));
  yyresult = 2;
  /* Fall through.  */
#endif

yyreturn:
  if (yychar != YYEMPTY)
    {
      /* Make sure we have latest lookahead translation.  See comments at
         user semantic actions for why this is necessary.  */
      yytoken = YYTRANSLATE (yychar);
      yydestruct ("Cleanup: discarding lookahead",
                  yytoken, &yylval);
    }
  /* 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);
      YYPOPSTACK (1);
    }
#ifndef yyoverflow
  if (yyss != yyssa)
    YYSTACK_FREE (yyss);
#endif
#if YYERROR_VERBOSE
  if (yymsg != yymsgbuf)
    YYSTACK_FREE (yymsg);
#endif
  /* Make sure YYID is used.  */
  return YYID (yyresult);
}



/* Line 2067 of yacc.c  */
#line 182 "src/sdc_parse.y"



int yyerror(const char *msg) {
    sdc_error(yylineno, yytext, "%s\n", msg);
    return 1;
}

