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

