summaryrefslogtreecommitdiffstats
path: root/funtools/filter/idx.tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/filter/idx.tab.c')
-rw-r--r--funtools/filter/idx.tab.c2177
1 files changed, 2177 insertions, 0 deletions
diff --git a/funtools/filter/idx.tab.c b/funtools/filter/idx.tab.c
new file mode 100644
index 0000000..d38c8af
--- /dev/null
+++ b/funtools/filter/idx.tab.c
@@ -0,0 +1,2177 @@
+/* A Bison parser, made by GNU Bison 2.0. */
+
+/* Skeleton parser for GLR parsing with Bison,
+ Copyright (C) 2002, 2003, 2004 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 2, 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* This is the parser code for GLR (Generalized LR) parser. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <setjmp.h>
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "glr.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names. */
+#define yyparse idxparse
+#define yylex idxlex
+#define yyerror idxerror
+#define yylval idxlval
+#define yychar idxchar
+#define yydebug idxdebug
+#define yynerrs idxnerrs
+#define yylloc idxlloc
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ NUM = 258,
+ COL = 259,
+ FUNC = 260,
+ REG = 261,
+ INDEF = 262,
+ OR = 263,
+ AND = 264,
+ NE = 265,
+ EQ = 266,
+ GE = 267,
+ LE = 268,
+ UMINUS = 269
+ };
+#endif
+#define NUM 258
+#define COL 259
+#define FUNC 260
+#define REG 261
+#define INDEF 262
+#define OR 263
+#define AND 264
+#define NE 265
+#define EQ 266
+#define GE 267
+#define LE 268
+#define UMINUS 269
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 1 "idx.y"
+
+#include <idx.h>
+#include <idx.tab.h>
+
+
+/* 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 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 6 "idx.y"
+typedef union YYSTYPE {
+ idxrowrec *row;
+ idxvalrec *val;
+} YYSTYPE;
+/* Line 186 of glr.c. */
+#line 115 "idx.tab.c"
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED)
+typedef struct YYLTYPE
+{
+
+ char yydummy;
+
+} YYLTYPE;
+# define YYLTYPE_IS_DECLARED 1
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Default (constant) value used for initialization for null
+ right-hand sides. Unlike the standard yacc.c template,
+ here we set the default value of $$ to a zeroed-out value.
+ Since the default value is undefined, this behavior is
+ technically correct. */
+static YYSTYPE yyval_default;
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 217 of glr.c. */
+#line 142 "idx.tab.c"
+
+#ifndef YYFREE
+# define YYFREE free
+#endif
+#ifndef YYMALLOC
+# define YYMALLOC malloc
+#endif
+#ifndef YYREALLOC
+# define YYREALLOC realloc
+#endif
+
+#ifdef __cplusplus
+ typedef bool yybool;
+#else
+ typedef unsigned char yybool;
+#endif
+#define yytrue 1
+#define yyfalse 0
+
+/*-----------------.
+| GCC extensions. |
+`-----------------*/
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later. */
+# if !defined (__GNUC__) || __GNUC__ < 2 || \
+(__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+# define __attribute__(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YYASSERT
+# define YYASSERT(condition) ((void) ((condition) || (abort (), 0)))
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 21
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 143
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 29
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 5
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 30
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 57
+/* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */
+#define YYMAXRHS 3
+/* YYMAXLEFT -- Maximum number of symbols to the left of a handle
+ accessed by $0, $-1, etc., in any rule. */
+#define YYMAXLEFT 0
+
+/* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 269
+
+#define YYTRANSLATE(YYX) \
+ ((YYX <= 0) ? YYEOF : \
+ (unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char 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, 24, 2, 2, 2, 23, 12, 2,
+ 27, 28, 21, 19, 2, 20, 2, 22, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 15, 2, 16, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 11, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 10, 2, 25, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 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, 13, 14, 17, 18, 26
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned char yyprhs[] =
+{
+ 0, 0, 3, 5, 7, 11, 15, 19, 21, 23,
+ 27, 31, 35, 39, 43, 47, 49, 51, 53, 55,
+ 59, 63, 67, 71, 75, 79, 83, 87, 90, 93,
+ 96
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const signed char yyrhs[] =
+{
+ 30, 0, -1, 31, -1, 32, -1, 31, 8, 31,
+ -1, 31, 9, 31, -1, 27, 31, 28, -1, 6,
+ -1, 5, -1, 33, 14, 33, -1, 33, 13, 33,
+ -1, 33, 15, 33, -1, 33, 18, 33, -1, 33,
+ 16, 33, -1, 33, 17, 33, -1, 3, -1, 4,
+ -1, 7, -1, 5, -1, 33, 19, 33, -1, 33,
+ 20, 33, -1, 33, 21, 33, -1, 33, 22, 33,
+ -1, 33, 23, 33, -1, 33, 12, 33, -1, 33,
+ 10, 33, -1, 33, 11, 33, -1, 24, 33, -1,
+ 25, 33, -1, 20, 33, -1, 27, 33, 28, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned char yyrline[] =
+{
+ 0, 39, 39, 42, 43, 44, 45, 49, 50, 51,
+ 52, 53, 54, 55, 56, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+ 74
+};
+#endif
+
+#if (YYDEBUG) || YYERROR_VERBOSE
+/* YYTNME[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", "NUM", "COL", "FUNC", "REG", "INDEF",
+ "OR", "AND", "'|'", "'^'", "'&'", "NE", "EQ", "'<'", "'>'", "GE", "LE",
+ "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "'~'", "UMINUS", "'('", "')'",
+ "$accept", "idx", "expr", "rowlist", "value", 0
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 29, 30, 31, 31, 31, 31, 32, 32, 32,
+ 32, 32, 32, 32, 32, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 1, 1, 3, 3, 3, 1, 1, 3,
+ 3, 3, 3, 3, 3, 1, 1, 1, 1, 3,
+ 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
+ 3
+};
+
+/* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */
+static const unsigned char yydprec[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+};
+
+/* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */
+static const unsigned char yymerger[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+ doesn't specify something else to do. Zero means the default is an
+ error. */
+static const unsigned char yydefact[] =
+{
+ 0, 15, 16, 18, 7, 17, 0, 0, 0, 0,
+ 0, 2, 3, 0, 18, 0, 29, 27, 28, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
+ 30, 4, 5, 25, 26, 24, 10, 9, 11, 13,
+ 14, 12, 19, 20, 21, 22, 23
+};
+
+/* YYPDEFGOTO[NTERM-NUM]. */
+static const signed char yydefgoto[] =
+{
+ -1, 10, 11, 12, 13
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -17
+static const signed char yypact[] =
+{
+ 30, -17, -17, 4, -17, -17, 36, 36, 36, 30,
+ 8, 2, -17, 89, -17, 36, -17, -17, -17, 37,
+ 56, -17, 30, 30, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 70, -17,
+ -17, 5, -17, 108, 120, 114, 103, 103, 103, 103,
+ 103, 103, -16, -16, -17, -17, -17
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const signed char yypgoto[] =
+{
+ -17, -17, 29, -17, -6
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -9
+static const signed char yytable[] =
+{
+ 16, 17, 18, 20, -8, 35, 36, 37, 21, 38,
+ 22, 23, -8, -8, 23, 0, 0, 0, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -8, 1, 2, 3, 4, 5, 19, 1,
+ 2, 14, 0, 5, 0, 22, 23, 0, 0, 0,
+ 6, 41, 42, 0, 7, 8, 6, 9, 0, 0,
+ 7, 8, 0, 15, 0, 39, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+ 24, 25, 26, 0, 40, 0, 0, 0, 0, 33,
+ 34, 35, 36, 37, 0, 0, 0, 0, 40, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 24, 25, 26, 0, 0, 0, 25,
+ 26, 0, 33, 34, 35, 36, 37, 33, 34, 35,
+ 36, 37, 26, 33, 34, 35, 36, 37, 0, 33,
+ 34, 35, 36, 37
+};
+
+/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
+ list of conflicting reductions corresponding to action entry for
+ state STATE-NUM in yytable. 0 means no conflicts. The list in
+ yyconfl is terminated by a rule number of 0. */
+static const unsigned char yyconflp[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0
+};
+
+/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by
+ 0, pointed into by YYCONFLP. */
+static const short int yyconfl[] =
+{
+ 0, 18, 0
+};
+
+static const signed char yycheck[] =
+{
+ 6, 7, 8, 9, 0, 21, 22, 23, 0, 15,
+ 8, 9, 8, 9, 9, -1, -1, -1, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 28, 3, 4, 5, 6, 7, 9, 3,
+ 4, 5, -1, 7, -1, 8, 9, -1, -1, -1,
+ 20, 22, 23, -1, 24, 25, 20, 27, -1, -1,
+ 24, 25, -1, 27, -1, 28, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 10, 11, 12, -1, 28, -1, -1, -1, -1, 19,
+ 20, 21, 22, 23, -1, -1, -1, -1, 28, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 10, 11, 12, -1, -1, -1, 11,
+ 12, -1, 19, 20, 21, 22, 23, 19, 20, 21,
+ 22, 23, 12, 19, 20, 21, 22, 23, -1, 19,
+ 20, 21, 22, 23
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 3, 4, 5, 6, 7, 20, 24, 25, 27,
+ 30, 31, 32, 33, 5, 27, 33, 33, 33, 31,
+ 33, 0, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 33, 28,
+ 28, 31, 31, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33
+};
+
+
+/* Prevent warning if -Wmissing-prototypes. */
+int yyparse (void);
+
+/* Error token number */
+#define YYTERROR 1
+
+/* 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). */
+
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0)
+#endif
+
+
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+#define YYLEX yylex ()
+
+YYSTYPE yylval;
+
+YYLTYPE yylloc;
+
+int yynerrs;
+int yychar;
+
+static const int YYEOF = 0;
+static const int YYEMPTY = -2;
+
+typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
+
+#define YYCHK(YYE) \
+ do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \
+ while (0)
+
+#if YYDEBUG
+
+#if ! defined (YYFPRINTF)
+# define YYFPRINTF fprintf
+#endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
+}
+
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Type, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (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)
+
+#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
+ SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+/* Minimum number of free items on the stack allowed after an
+ allocation. This is to allow allocation and initialization
+ to be completed by functions that call expandGLRStack before the
+ stack is expanded, thus insuring that all necessary pointers get
+ properly redirected to new data. */
+#define YYHEADROOM 2
+
+#if (! defined (YYSTACKEXPANDABLE) \
+ && (! defined (__cplusplus) \
+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#define YYSTACKEXPANDABLE 1
+#else
+#define YYSTACKEXPANDABLE 0
+#endif
+
+/** State numbers, as in LALR(1) machine */
+typedef int yyStateNum;
+
+/** Rule numbers, as in LALR(1) machine */
+typedef int yyRuleNum;
+
+/** Grammar symbol */
+typedef short int yySymbol;
+
+/** Item references, as in LALR(1) machine */
+typedef short int yyItemNum;
+
+typedef struct yyGLRState yyGLRState;
+typedef struct yySemanticOption yySemanticOption;
+typedef union yyGLRStackItem yyGLRStackItem;
+typedef struct yyGLRStack yyGLRStack;
+typedef struct yyGLRStateSet yyGLRStateSet;
+
+struct yyGLRState {
+ yybool yyisState;
+ yybool yyresolved;
+ yyStateNum yylrState;
+ yyGLRState* yypred;
+ size_t yyposn;
+ union {
+ yySemanticOption* yyfirstVal;
+ YYSTYPE yysval;
+ } yysemantics;
+ YYLTYPE yyloc;
+};
+
+struct yyGLRStateSet {
+ yyGLRState** yystates;
+ size_t yysize, yycapacity;
+};
+
+struct yySemanticOption {
+ yybool yyisState;
+ yyRuleNum yyrule;
+ yyGLRState* yystate;
+ yySemanticOption* yynext;
+};
+
+union yyGLRStackItem {
+ yyGLRState yystate;
+ yySemanticOption yyoption;
+};
+
+struct yyGLRStack {
+ int yyerrflag;
+ int yyerrState;
+
+
+ yySymbol* yytokenp;
+ jmp_buf yyexception_buffer;
+ yyGLRStackItem* yyitems;
+ yyGLRStackItem* yynextFree;
+ int yyspaceLeft;
+ yyGLRState* yysplitPoint;
+ yyGLRState* yylastDeleted;
+ yyGLRStateSet yytops;
+};
+
+static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize);
+static void yyexpandGLRStack (yyGLRStack* yystack);
+static void yyfreeGLRStack (yyGLRStack* yystack);
+
+static void
+yyFail (yyGLRStack* yystack, const char* yyformat, ...)
+{
+ yystack->yyerrflag = 1;
+ if (yyformat != NULL)
+ {
+ char yymsg[256];
+ va_list yyap;
+ va_start (yyap, yyformat);
+ vsprintf (yymsg, yyformat, yyap);
+ yyerror (yymsg);
+ }
+ longjmp (yystack->yyexception_buffer, 1);
+}
+
+#if YYDEBUG || YYERROR_VERBOSE
+/** A printable representation of TOKEN. Valid until next call to
+ * tokenName. */
+static inline const char*
+yytokenName (yySymbol yytoken)
+{
+ if (yytoken == YYEMPTY)
+ return "";
+
+ return yytname[yytoken];
+}
+#endif
+
+/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
+ * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred
+ * containing the pointer to the next state in the chain. Assumes
+ * YYLOW1 < YYLOW0. */
+static void yyfillin (yyGLRStackItem *, int, int) ATTRIBUTE_UNUSED;
+static void
+yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
+{
+ yyGLRState* s;
+ int i;
+ s = yyvsp[yylow0].yystate.yypred;
+ for (i = yylow0-1; i >= yylow1; i -= 1)
+ {
+ YYASSERT (s->yyresolved);
+ yyvsp[i].yystate.yyresolved = yytrue;
+ yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
+ yyvsp[i].yystate.yyloc = s->yyloc;
+ s = yyvsp[i].yystate.yypred = s->yypred;
+ }
+}
+
+/* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1. Otherwise, fill in
+ YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1.
+ For convenience, always return YYLOW1. */
+static inline int yyfill (yyGLRStackItem *, int *, int, yybool)
+ ATTRIBUTE_UNUSED;
+static inline int
+yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal)
+{
+ if (!yynormal && yylow1 < *yylow)
+ {
+ yyfillin (yyvsp, *yylow, yylow1);
+ *yylow = yylow1;
+ }
+ return yylow1;
+}
+
+/** Perform user action for rule number YYN, with RHS length YYRHSLEN,
+ * and top stack item YYVSP. YYLVALP points to place to put semantic
+ * value ($$), and yylocp points to place for location information
+ * (@$). Returns yyok for normal return, yyaccept for YYACCEPT,
+ * yyerr for YYERROR, yyabort for YYABORT. */
+static YYRESULTTAG
+yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
+ YYSTYPE* yyvalp,
+ YYLTYPE* yylocp ATTRIBUTE_UNUSED,
+ yyGLRStack* yystack
+ )
+{
+ yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL);
+ int yylow;
+
+# undef yyerrok
+# define yyerrok (yystack->yyerrState = 0)
+# undef YYACCEPT
+# define YYACCEPT return yyaccept
+# undef YYABORT
+# define YYABORT return yyabort
+# undef YYERROR
+# define YYERROR return yyerrok, yyerr
+# undef YYRECOVERING
+# define YYRECOVERING (yystack->yyerrState != 0)
+# undef yyclearin
+# define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY)
+# undef YYFILL
+# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal)
+# undef YYBACKUP
+# define YYBACKUP(Token, Value) \
+ return yyerror ("syntax error: cannot back up"), \
+ yyerrok, yyerr
+
+ yylow = 1;
+ if (yyrhslen == 0)
+ *yyvalp = yyval_default;
+ else
+ *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
+ YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
+
+ switch (yyn)
+ {
+ case 2:
+#line 39 "idx.y"
+ { idxall((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;}
+ break;
+
+ case 4:
+#line 43 "idx.y"
+ { ((*yyvalp).row) = idxor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.row),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;}
+ break;
+
+ case 5:
+#line 44 "idx.y"
+ { ((*yyvalp).row) = idxand((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.row),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.row)); ;}
+ break;
+
+ case 6:
+#line 45 "idx.y"
+ { ((*yyvalp).row) = (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.row); ;}
+ break;
+
+ case 7:
+#line 49 "idx.y"
+ { ((*yyvalp).row) = idxrowreg((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 8:
+#line 50 "idx.y"
+ { ((*yyvalp).row) = idxrowfun((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 9:
+#line 51 "idx.y"
+ { ((*yyvalp).row) = idxroweq((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 10:
+#line 52 "idx.y"
+ { ((*yyvalp).row) = idxrowne((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 11:
+#line 53 "idx.y"
+ { ((*yyvalp).row) = idxrowlt((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 12:
+#line 54 "idx.y"
+ { ((*yyvalp).row) = idxrowle((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 13:
+#line 55 "idx.y"
+ { ((*yyvalp).row) = idxrowgt((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 14:
+#line 56 "idx.y"
+ { ((*yyvalp).row) = idxrowge((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 19:
+#line 63 "idx.y"
+ { ((*yyvalp).val) = idxvaladd((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 20:
+#line 64 "idx.y"
+ { ((*yyvalp).val) = idxvalsub((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 21:
+#line 65 "idx.y"
+ { ((*yyvalp).val) = idxvalmul((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 22:
+#line 66 "idx.y"
+ { ((*yyvalp).val) = idxvaldiv((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 23:
+#line 67 "idx.y"
+ { ((*yyvalp).val) = idxvalmod((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 24:
+#line 68 "idx.y"
+ { ((*yyvalp).val) = idxvaland((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 25:
+#line 69 "idx.y"
+ { ((*yyvalp).val) = idxvalor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 26:
+#line 70 "idx.y"
+ { ((*yyvalp).val) = idxvalxor((((yyGLRStackItem const *)yyvsp)[YYFILL (-2)].yystate.yysemantics.yysval.val),(((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 27:
+#line 71 "idx.y"
+ { ((*yyvalp).val) = idxvalnot((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 28:
+#line 72 "idx.y"
+ { ((*yyvalp).val) = idxvalcom((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 29:
+#line 73 "idx.y"
+ { ((*yyvalp).val) = idxvalmin((((yyGLRStackItem const *)yyvsp)[YYFILL (0)].yystate.yysemantics.yysval.val)); ;}
+ break;
+
+ case 30:
+#line 74 "idx.y"
+ { ((*yyvalp).val) = (((yyGLRStackItem const *)yyvsp)[YYFILL (-1)].yystate.yysemantics.yysval.val); ;}
+ break;
+
+
+ }
+
+ return yyok;
+# undef yyerrok
+# undef YYABORT
+# undef YYACCEPT
+# undef YYERROR
+# undef YYBACKUP
+# undef yyclearin
+# undef YYRECOVERING
+/* Line 750 of glr.c. */
+#line 890 "idx.tab.c"
+}
+
+
+static void
+yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
+{
+ /* `Use' the arguments. */
+ (void) yy0;
+ (void) yy1;
+
+ switch (yyn)
+ {
+
+ }
+}
+
+ /* Bison grammar-table manipulation. */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+/** Number of symbols composing the right hand side of rule #RULE. */
+static inline int
+yyrhsLength (yyRuleNum yyrule)
+{
+ return yyr2[yyrule];
+}
+
+/** Left-hand-side symbol for rule #RULE. */
+static inline yySymbol
+yylhsNonterm (yyRuleNum yyrule)
+{
+ return yyr1[yyrule];
+}
+
+#define yyis_pact_ninf(yystate) \
+ ((yystate) == YYPACT_NINF)
+
+/** True iff LR state STATE has only a default reduction (regardless
+ * of token). */
+static inline yybool
+yyisDefaultedState (yyStateNum yystate)
+{
+ return yyis_pact_ninf (yypact[yystate]);
+}
+
+/** The default reduction for STATE, assuming it has one. */
+static inline yyRuleNum
+yydefaultAction (yyStateNum yystate)
+{
+ return yydefact[yystate];
+}
+
+#define yyis_table_ninf(yytable_value) \
+ 0
+
+/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
+ * Result R means
+ * R < 0: Reduce on rule -R.
+ * R = 0: Error.
+ * R > 0: Shift to state R.
+ * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of
+ * conflicting reductions.
+ */
+static inline void
+yygetLRActions (yyStateNum yystate, int yytoken,
+ int* yyaction, const short int** yyconflicts)
+{
+ int yyindex = yypact[yystate] + yytoken;
+ if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
+ {
+ *yyaction = -yydefact[yystate];
+ *yyconflicts = yyconfl;
+ }
+ else if (! yyis_table_ninf (yytable[yyindex]))
+ {
+ *yyaction = yytable[yyindex];
+ *yyconflicts = yyconfl + yyconflp[yyindex];
+ }
+ else
+ {
+ *yyaction = 0;
+ *yyconflicts = yyconfl + yyconflp[yyindex];
+ }
+}
+
+static inline yyStateNum
+yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
+{
+ int yyr;
+ yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
+ if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
+ return yytable[yyr];
+ else
+ return yydefgoto[yylhs - YYNTOKENS];
+}
+
+static inline yybool
+yyisShiftAction (int yyaction)
+{
+ return 0 < yyaction;
+}
+
+static inline yybool
+yyisErrorAction (int yyaction)
+{
+ return yyaction == 0;
+}
+
+ /* GLRStates */
+
+static void
+yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate,
+ yyGLRState* rhs, yyRuleNum yyrule)
+{
+ yySemanticOption* yynewItem;
+ yynewItem = &yystack->yynextFree->yyoption;
+ yystack->yyspaceLeft -= 1;
+ yystack->yynextFree += 1;
+ yynewItem->yyisState = yyfalse;
+ yynewItem->yystate = rhs;
+ yynewItem->yyrule = yyrule;
+ yynewItem->yynext = yystate->yysemantics.yyfirstVal;
+ yystate->yysemantics.yyfirstVal = yynewItem;
+ if (yystack->yyspaceLeft < YYHEADROOM)
+ yyexpandGLRStack (yystack);
+}
+
+ /* GLRStacks */
+
+/** Initialize SET to a singleton set containing an empty stack. */
+static void
+yyinitStateSet (yyGLRStateSet* yyset)
+{
+ yyset->yysize = 1;
+ yyset->yycapacity = 16;
+ yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]);
+ yyset->yystates[0] = NULL;
+}
+
+static void yyfreeStateSet (yyGLRStateSet* yyset)
+{
+ YYFREE (yyset->yystates);
+}
+
+/** Initialize STACK to a single empty stack, with total maximum
+ * capacity for all stacks of SIZE. */
+static void
+yyinitGLRStack (yyGLRStack* yystack, size_t yysize)
+{
+ yystack->yyerrflag = 0;
+ yystack->yyerrState = 0;
+ yynerrs = 0;
+ yystack->yyspaceLeft = yysize;
+ yystack->yynextFree = yystack->yyitems =
+ (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]);
+ yystack->yysplitPoint = NULL;
+ yystack->yylastDeleted = NULL;
+ yyinitStateSet (&yystack->yytops);
+}
+
+#define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
+ &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE
+
+/** If STACK is expandable, extend it. WARNING: Pointers into the
+ stack from outside should be considered invalid after this call.
+ We always expand when there are 1 or fewer items left AFTER an
+ allocation, so that we can avoid having external pointers exist
+ across an allocation. */
+static void
+yyexpandGLRStack (yyGLRStack* yystack)
+{
+#if YYSTACKEXPANDABLE
+ yyGLRStack yynewStack;
+ yyGLRStackItem* yyp0, *yyp1;
+ size_t yysize, yynewSize;
+ size_t yyn;
+ yysize = yystack->yynextFree - yystack->yyitems;
+ if (YYMAXDEPTH <= yysize)
+ yyFail (yystack, "parser stack overflow");
+ yynewSize = 2*yysize;
+ if (YYMAXDEPTH < yynewSize)
+ yynewSize = YYMAXDEPTH;
+ yyinitGLRStack (&yynewStack, yynewSize);
+ for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize;
+ 0 < yyn;
+ yyn -= 1, yyp0 += 1, yyp1 += 1)
+ {
+ *yyp1 = *yyp0;
+ if (*(yybool *) yyp0)
+ {
+ yyGLRState* yys0 = &yyp0->yystate;
+ yyGLRState* yys1 = &yyp1->yystate;
+ if (yys0->yypred != NULL)
+ yys1->yypred =
+ YYRELOC (yyp0, yyp1, yys0->yypred, yystate);
+ if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != NULL)
+ yys1->yysemantics.yyfirstVal =
+ YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption);
+ }
+ else
+ {
+ yySemanticOption* yyv0 = &yyp0->yyoption;
+ yySemanticOption* yyv1 = &yyp1->yyoption;
+ if (yyv0->yystate != NULL)
+ yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate);
+ if (yyv0->yynext != NULL)
+ yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption);
+ }
+ }
+ if (yystack->yysplitPoint != NULL)
+ yystack->yysplitPoint = YYRELOC (yystack->yyitems, yynewStack.yyitems,
+ yystack->yysplitPoint, yystate);
+
+ for (yyn = 0; yyn < yystack->yytops.yysize; yyn += 1)
+ if (yystack->yytops.yystates[yyn] != NULL)
+ yystack->yytops.yystates[yyn] =
+ YYRELOC (yystack->yyitems, yynewStack.yyitems,
+ yystack->yytops.yystates[yyn], yystate);
+ YYFREE (yystack->yyitems);
+ yystack->yyitems = yynewStack.yyitems;
+ yystack->yynextFree = yynewStack.yynextFree + yysize;
+ yystack->yyspaceLeft = yynewStack.yyspaceLeft - yysize;
+
+#else
+
+ yyFail (yystack, "parser stack overflow");
+#endif
+}
+
+static void
+yyfreeGLRStack (yyGLRStack* yystack)
+{
+ YYFREE (yystack->yyitems);
+ yyfreeStateSet (&yystack->yytops);
+}
+
+/** Assuming that S is a GLRState somewhere on STACK, update the
+ * splitpoint of STACK, if needed, so that it is at least as deep as
+ * S. */
+static inline void
+yyupdateSplit (yyGLRStack* yystack, yyGLRState* yys)
+{
+ if (yystack->yysplitPoint != NULL && yystack->yysplitPoint > yys)
+ yystack->yysplitPoint = yys;
+}
+
+/** Invalidate stack #K in STACK. */
+static inline void
+yymarkStackDeleted (yyGLRStack* yystack, int yyk)
+{
+ if (yystack->yytops.yystates[yyk] != NULL)
+ yystack->yylastDeleted = yystack->yytops.yystates[yyk];
+ yystack->yytops.yystates[yyk] = NULL;
+}
+
+/** Undelete the last stack that was marked as deleted. Can only be
+ done once after a deletion, and only when all other stacks have
+ been deleted. */
+static void
+yyundeleteLastStack (yyGLRStack* yystack)
+{
+ if (yystack->yylastDeleted == NULL || yystack->yytops.yysize != 0)
+ return;
+ yystack->yytops.yystates[0] = yystack->yylastDeleted;
+ yystack->yytops.yysize = 1;
+ YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
+ yystack->yylastDeleted = NULL;
+}
+
+static inline void
+yyremoveDeletes (yyGLRStack* yystack)
+{
+ size_t yyi, yyj;
+ yyi = yyj = 0;
+ while (yyj < yystack->yytops.yysize)
+ {
+ if (yystack->yytops.yystates[yyi] == NULL)
+ {
+ if (yyi == yyj)
+ {
+ YYDPRINTF ((stderr, "Removing dead stacks.\n"));
+ }
+ yystack->yytops.yysize -= 1;
+ }
+ else
+ {
+ yystack->yytops.yystates[yyj] = yystack->yytops.yystates[yyi];
+ if (yyj != yyi)
+ {
+ YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n",
+ (unsigned long int) yyi, (unsigned long int) yyj));
+ }
+ yyj += 1;
+ }
+ yyi += 1;
+ }
+}
+
+/** Shift to a new state on stack #K of STACK, corresponding to LR state
+ * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */
+static inline void
+yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn,
+ YYSTYPE yysval, YYLTYPE* yylocp)
+{
+ yyGLRStackItem* yynewItem;
+
+ yynewItem = yystack->yynextFree;
+ yystack->yynextFree += 1;
+ yystack->yyspaceLeft -= 1;
+ yynewItem->yystate.yyisState = yytrue;
+ yynewItem->yystate.yylrState = yylrState;
+ yynewItem->yystate.yyposn = yyposn;
+ yynewItem->yystate.yyresolved = yytrue;
+ yynewItem->yystate.yypred = yystack->yytops.yystates[yyk];
+ yystack->yytops.yystates[yyk] = &yynewItem->yystate;
+ yynewItem->yystate.yysemantics.yysval = yysval;
+ yynewItem->yystate.yyloc = *yylocp;
+ if (yystack->yyspaceLeft < YYHEADROOM)
+ yyexpandGLRStack (yystack);
+}
+
+/** Shift stack #K of YYSTACK, to a new state corresponding to LR
+ * state YYLRSTATE, at input position YYPOSN, with the (unresolved)
+ * semantic value of YYRHS under the action for YYRULE. */
+static inline void
+yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
+ size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
+{
+ yyGLRStackItem* yynewItem;
+
+ yynewItem = yystack->yynextFree;
+ yynewItem->yystate.yyisState = yytrue;
+ yynewItem->yystate.yylrState = yylrState;
+ yynewItem->yystate.yyposn = yyposn;
+ yynewItem->yystate.yyresolved = yyfalse;
+ yynewItem->yystate.yypred = yystack->yytops.yystates[yyk];
+ yynewItem->yystate.yysemantics.yyfirstVal = NULL;
+ yystack->yytops.yystates[yyk] = &yynewItem->yystate;
+ yystack->yynextFree += 1;
+ yystack->yyspaceLeft -= 1;
+ yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule);
+}
+
+/** Pop the symbols consumed by reduction #RULE from the top of stack
+ * #K of STACK, and perform the appropriate semantic action on their
+ * semantic values. Assumes that all ambiguities in semantic values
+ * have been previously resolved. Set *VALP to the resulting value,
+ * and *LOCP to the computed location (if any). Return value is as
+ * for userAction. */
+static inline YYRESULTTAG
+yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule,
+ YYSTYPE* yyvalp, YYLTYPE* yylocp)
+{
+ int yynrhs = yyrhsLength (yyrule);
+
+ if (yystack->yysplitPoint == NULL)
+ {
+ /* Standard special case: single stack. */
+ yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk];
+ YYASSERT (yyk == 0);
+ yystack->yynextFree -= yynrhs;
+ yystack->yyspaceLeft += yynrhs;
+ yystack->yytops.yystates[0] = & yystack->yynextFree[-1].yystate;
+ return yyuserAction (yyrule, yynrhs, rhs,
+ yyvalp, yylocp, yystack);
+ }
+ else
+ {
+ int yyi;
+ yyGLRState* yys;
+ yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
+ yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred
+ = yystack->yytops.yystates[yyk];
+ for (yyi = 0; yyi < yynrhs; yyi += 1)
+ {
+ yys = yys->yypred;
+ YYASSERT (yys);
+ }
+ yyupdateSplit (yystack, yys);
+ yystack->yytops.yystates[yyk] = yys;
+ return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
+ yyvalp, yylocp, yystack);
+ }
+}
+
+#if !YYDEBUG
+# define YY_REDUCE_PRINT(K, Rule)
+#else
+# define YY_REDUCE_PRINT(K, Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (K, Rule); \
+} while (0)
+
+/*----------------------------------------------------------.
+| Report that the RULE is going to be reduced on stack #K. |
+`----------------------------------------------------------*/
+
+static inline void
+yy_reduce_print (size_t yyk, yyRuleNum yyrule)
+{
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu), ",
+ (unsigned long int) yyk, yyrule - 1,
+ (unsigned long int) yyrline[yyrule]);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi]));
+ YYFPRINTF (stderr, "-> %s\n", yytokenName (yyr1[yyrule]));
+}
+#endif
+
+/** Pop items off stack #K of STACK according to grammar rule RULE,
+ * and push back on the resulting nonterminal symbol. Perform the
+ * semantic action associated with RULE and store its value with the
+ * newly pushed state, if FORCEEVAL or if STACK is currently
+ * unambiguous. Otherwise, store the deferred semantic action with
+ * the new state. If the new state would have an identical input
+ * position, LR state, and predecessor to an existing state on the stack,
+ * it is identified with that existing state, eliminating stack #K from
+ * the STACK. In this case, the (necessarily deferred) semantic value is
+ * added to the options for the existing state's semantic value.
+ */
+static inline YYRESULTTAG
+yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule,
+ yybool yyforceEval)
+{
+ size_t yyposn = yystack->yytops.yystates[yyk]->yyposn;
+
+ if (yyforceEval || yystack->yysplitPoint == NULL)
+ {
+ YYSTYPE yysval;
+ YYLTYPE yyloc;
+
+ YY_REDUCE_PRINT (yyk, yyrule);
+ YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc));
+ yyglrShift (yystack, yyk,
+ yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState,
+ yylhsNonterm (yyrule)),
+ yyposn, yysval, &yyloc);
+ }
+ else
+ {
+ size_t yyi;
+ int yyn;
+ yyGLRState* yys, *yys0 = yystack->yytops.yystates[yyk];
+ yyStateNum yynewLRState;
+
+ for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
+ 0 < yyn; yyn -= 1)
+ {
+ yys = yys->yypred;
+ YYASSERT (yys);
+ }
+ yyupdateSplit (yystack, yys);
+ yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
+ YYDPRINTF ((stderr,
+ "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n",
+ (unsigned long int) yyk, yyrule - 1, yynewLRState));
+ for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
+ if (yyi != yyk && yystack->yytops.yystates[yyi] != NULL)
+ {
+ yyGLRState* yyp, *yysplit = yystack->yysplitPoint;
+ yyp = yystack->yytops.yystates[yyi];
+ while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn)
+ {
+ if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
+ {
+ yyaddDeferredAction (yystack, yyp, yys0, yyrule);
+ yymarkStackDeleted (yystack, yyk);
+ YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
+ (unsigned long int) yyk,
+ (unsigned long int) yyi));
+ return yyok;
+ }
+ yyp = yyp->yypred;
+ }
+ }
+ yystack->yytops.yystates[yyk] = yys;
+ yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule);
+ }
+ return yyok;
+}
+
+static int
+yysplitStack (yyGLRStack* yystack, int yyk)
+{
+ if (yystack->yysplitPoint == NULL)
+ {
+ YYASSERT (yyk == 0);
+ yystack->yysplitPoint = yystack->yytops.yystates[yyk];
+ }
+ if (yystack->yytops.yysize >= yystack->yytops.yycapacity)
+ {
+ yystack->yytops.yycapacity *= 2;
+ yystack->yytops.yystates =
+ (yyGLRState**) YYREALLOC (yystack->yytops.yystates,
+ (yystack->yytops.yycapacity
+ * sizeof yystack->yytops.yystates[0]));
+ }
+ yystack->yytops.yystates[yystack->yytops.yysize]
+ = yystack->yytops.yystates[yyk];
+ yystack->yytops.yysize += 1;
+ return yystack->yytops.yysize-1;
+}
+
+/** True iff Y0 and Y1 represent identical options at the top level.
+ * That is, they represent the same rule applied to RHS symbols
+ * that produce the same terminal symbols. */
+static yybool
+yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1)
+{
+ if (yyy0->yyrule == yyy1->yyrule)
+ {
+ yyGLRState *yys0, *yys1;
+ int yyn;
+ for (yys0 = yyy0->yystate, yys1 = yyy1->yystate,
+ yyn = yyrhsLength (yyy0->yyrule);
+ yyn > 0;
+ yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
+ if (yys0->yyposn != yys1->yyposn)
+ return yyfalse;
+ return yytrue;
+ }
+ else
+ return yyfalse;
+}
+
+/** Assuming identicalOptions (Y0,Y1), (destructively) merge the
+ * alternative semantic values for the RHS-symbols of Y1 into the
+ * corresponding semantic value sets of the symbols of Y0. */
+static void
+yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
+{
+ yyGLRState *yys0, *yys1;
+ int yyn;
+ for (yys0 = yyy0->yystate, yys1 = yyy1->yystate,
+ yyn = yyrhsLength (yyy0->yyrule);
+ yyn > 0;
+ yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
+ if (yys0 == yys1)
+ break;
+ else if (! yys0->yyresolved && ! yys1->yyresolved)
+ {
+ yySemanticOption* yyz;
+ for (yyz = yys0->yysemantics.yyfirstVal; yyz->yynext != NULL;
+ yyz = yyz->yynext)
+ continue;
+ yyz->yynext = yys1->yysemantics.yyfirstVal;
+ }
+}
+
+/** Y0 and Y1 represent two possible actions to take in a given
+ * parsing state; return 0 if no combination is possible,
+ * 1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred. */
+static int
+yypreference (yySemanticOption* y0, yySemanticOption* y1)
+{
+ yyRuleNum r0 = y0->yyrule, r1 = y1->yyrule;
+ int p0 = yydprec[r0], p1 = yydprec[r1];
+
+ if (p0 == p1)
+ {
+ if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1])
+ return 0;
+ else
+ return 1;
+ }
+ if (p0 == 0 || p1 == 0)
+ return 0;
+ if (p0 < p1)
+ return 3;
+ if (p1 < p0)
+ return 2;
+ return 0;
+}
+
+static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList,
+ yyGLRStack* yystack, YYSTYPE* yyvalp,
+ YYLTYPE* yylocp);
+
+static YYRESULTTAG
+yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack)
+{
+ YYRESULTTAG yyflag;
+ if (0 < yyn)
+ {
+ YYASSERT (yys->yypred);
+ yyflag = yyresolveStates (yys->yypred, yyn-1, yystack);
+ if (yyflag != yyok)
+ return yyflag;
+ if (! yys->yyresolved)
+ {
+ yyflag = yyresolveValue (yys->yysemantics.yyfirstVal, yystack,
+ &yys->yysemantics.yysval, &yys->yyloc
+ );
+ if (yyflag != yyok)
+ return yyflag;
+ yys->yyresolved = yytrue;
+ }
+ }
+ return yyok;
+}
+
+static YYRESULTTAG
+yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack,
+ YYSTYPE* yyvalp, YYLTYPE* yylocp)
+{
+ yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
+ int yynrhs;
+
+ yynrhs = yyrhsLength (yyopt->yyrule);
+ YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack));
+ yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate;
+ return yyuserAction (yyopt->yyrule, yynrhs,
+ yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
+ yyvalp, yylocp, yystack);
+}
+
+#if YYDEBUG
+static void
+yyreportTree (yySemanticOption* yyx, int yyindent)
+{
+ int yynrhs = yyrhsLength (yyx->yyrule);
+ int yyi;
+ yyGLRState* yys;
+ yyGLRState* yystates[YYMAXRHS];
+ yyGLRState yyleftmost_state;
+
+ for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred)
+ yystates[yyi] = yys;
+ if (yys == NULL)
+ {
+ yyleftmost_state.yyposn = 0;
+ yystates[0] = &yyleftmost_state;
+ }
+ else
+ yystates[0] = yys;
+
+ if (yyx->yystate->yyposn < yys->yyposn + 1)
+ YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n",
+ yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
+ yyx->yyrule);
+ else
+ YYFPRINTF (stderr, "%*s%s -> <Rule %d, tokens %lu .. %lu>\n",
+ yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
+ yyx->yyrule, (unsigned long int) (yys->yyposn + 1),
+ (unsigned long int) yyx->yystate->yyposn);
+ for (yyi = 1; yyi <= yynrhs; yyi += 1)
+ {
+ if (yystates[yyi]->yyresolved)
+ {
+ if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
+ YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
+ yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
+ else
+ YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
+ yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
+ (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
+ (unsigned long int) yystates[yyi]->yyposn);
+ }
+ else
+ yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2);
+ }
+}
+#endif
+
+static void
+yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1,
+ yyGLRStack* yystack)
+{
+ /* `Unused' warnings. */
+ (void) yyx0;
+ (void) yyx1;
+
+#if YYDEBUG
+ YYFPRINTF (stderr, "Ambiguity detected.\n");
+ YYFPRINTF (stderr, "Option 1,\n");
+ yyreportTree (yyx0, 2);
+ YYFPRINTF (stderr, "\nOption 2,\n");
+ yyreportTree (yyx1, 2);
+ YYFPRINTF (stderr, "\n");
+#endif
+ yyFail (yystack, "ambiguity detected");
+}
+
+
+/** Resolve the ambiguity represented by OPTIONLIST, perform the indicated
+ * actions, and return the result. */
+static YYRESULTTAG
+yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack,
+ YYSTYPE* yyvalp, YYLTYPE* yylocp)
+{
+ yySemanticOption* yybest;
+ yySemanticOption* yyp;
+ int yymerge;
+
+ yybest = yyoptionList;
+ yymerge = 0;
+ for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext)
+ {
+ if (yyidenticalOptions (yybest, yyp))
+ yymergeOptionSets (yybest, yyp);
+ else
+ switch (yypreference (yybest, yyp))
+ {
+ case 0:
+ yyreportAmbiguity (yybest, yyp, yystack);
+ break;
+ case 1:
+ yymerge = 1;
+ break;
+ case 2:
+ break;
+ case 3:
+ yybest = yyp;
+ yymerge = 0;
+ break;
+ }
+ }
+
+ if (yymerge)
+ {
+ int yyprec = yydprec[yybest->yyrule];
+ YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp));
+ for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext)
+ {
+ if (yyprec == yydprec[yyp->yyrule])
+ {
+ YYSTYPE yyval1;
+ YYLTYPE yydummy;
+ YYCHK (yyresolveAction (yyp, yystack, &yyval1, &yydummy));
+ yyuserMerge (yymerger[yyp->yyrule], yyvalp, &yyval1);
+ }
+ }
+ return yyok;
+ }
+ else
+ return yyresolveAction (yybest, yystack, yyvalp, yylocp);
+}
+
+static YYRESULTTAG
+yyresolveStack (yyGLRStack* yystack)
+{
+ if (yystack->yysplitPoint != NULL)
+ {
+ yyGLRState* yys;
+ int yyn;
+
+ for (yyn = 0, yys = yystack->yytops.yystates[0];
+ yys != yystack->yysplitPoint;
+ yys = yys->yypred, yyn += 1)
+ continue;
+ YYCHK (yyresolveStates (yystack->yytops.yystates[0], yyn, yystack
+ ));
+ }
+ return yyok;
+}
+
+static void
+yycompressStack (yyGLRStack* yystack)
+{
+ yyGLRState* yyp, *yyq, *yyr;
+
+ if (yystack->yytops.yysize != 1 || yystack->yysplitPoint == NULL)
+ return;
+
+ for (yyp = yystack->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL;
+ yyp != yystack->yysplitPoint;
+ yyr = yyp, yyp = yyq, yyq = yyp->yypred)
+ yyp->yypred = yyr;
+
+ yystack->yyspaceLeft += yystack->yynextFree - yystack->yyitems;
+ yystack->yynextFree = ((yyGLRStackItem*) yystack->yysplitPoint) + 1;
+ yystack->yyspaceLeft -= yystack->yynextFree - yystack->yyitems;
+ yystack->yysplitPoint = NULL;
+ yystack->yylastDeleted = NULL;
+
+ while (yyr != NULL)
+ {
+ yystack->yynextFree->yystate = *yyr;
+ yyr = yyr->yypred;
+ yystack->yynextFree->yystate.yypred = & yystack->yynextFree[-1].yystate;
+ yystack->yytops.yystates[0] = &yystack->yynextFree->yystate;
+ yystack->yynextFree += 1;
+ yystack->yyspaceLeft -= 1;
+ }
+}
+
+static YYRESULTTAG
+yyprocessOneStack (yyGLRStack* yystack, int yyk,
+ size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp
+ )
+{
+ int yyaction;
+ const short int* yyconflicts;
+ yyRuleNum yyrule;
+ yySymbol* const yytokenp = yystack->yytokenp;
+
+ while (yystack->yytops.yystates[yyk] != NULL)
+ {
+ yyStateNum yystate = yystack->yytops.yystates[yyk]->yylrState;
+ YYDPRINTF ((stderr, "Stack %d Entering state %d\n", yyk, yystate));
+
+ YYASSERT (yystate != YYFINAL);
+
+ if (yyisDefaultedState (yystate))
+ {
+ yyrule = yydefaultAction (yystate);
+ if (yyrule == 0)
+ {
+ YYDPRINTF ((stderr, "Stack %d dies.\n", yyk));
+ yymarkStackDeleted (yystack, yyk);
+ return yyok;
+ }
+ YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse));
+ }
+ else
+ {
+ if (*yytokenp == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ *yytokenp = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
+ }
+ yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts);
+
+ while (*yyconflicts != 0)
+ {
+ int yynewStack = yysplitStack (yystack, yyk);
+ YYDPRINTF ((stderr, "Splitting off stack %d from %d.\n",
+ yynewStack, yyk));
+ YYCHK (yyglrReduce (yystack, yynewStack,
+ *yyconflicts, yyfalse));
+ YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn,
+ yylvalp, yyllocp));
+ yyconflicts += 1;
+ }
+
+ if (yyisShiftAction (yyaction))
+ {
+ YYDPRINTF ((stderr, "On stack %d, ", yyk));
+ YY_SYMBOL_PRINT ("shifting", *yytokenp, yylvalp, yyllocp);
+ yyglrShift (yystack, yyk, yyaction, yyposn+1,
+ *yylvalp, yyllocp);
+ YYDPRINTF ((stderr, ", now in state #%d\n",
+ yystack->yytops.yystates[yyk]->yylrState));
+ break;
+ }
+ else if (yyisErrorAction (yyaction))
+ {
+ YYDPRINTF ((stderr, "Stack %d dies.\n", yyk));
+ yymarkStackDeleted (yystack, yyk);
+ break;
+ }
+ else
+ YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse));
+ }
+ }
+ return yyok;
+}
+
+static void
+yyreportSyntaxError (yyGLRStack* yystack,
+ YYSTYPE* yylvalp, YYLTYPE* yyllocp)
+{
+ /* `Unused' warnings. */
+ (void) yylvalp;
+ (void) yyllocp;
+
+ if (yystack->yyerrState == 0)
+ {
+#if YYERROR_VERBOSE
+ yySymbol* const yytokenp = yystack->yytokenp;
+ int yyn;
+ yyn = yypact[yystack->yytops.yystates[0]->yylrState];
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
+ {
+ size_t yysize = 0;
+ const char* yyprefix;
+ char* yymsg;
+ int yyx;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 0;
+
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yysize += strlen (yyprefix) + strlen (yytokenName (yyx));
+ yycount += 1;
+ if (yycount == 5)
+ {
+ yysize = 0;
+ break;
+ }
+ yyprefix = " or ";
+ }
+ yysize += (sizeof ("syntax error, unexpected ")
+ + strlen (yytokenName (*yytokenp)));
+ yymsg = (char*) YYMALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char* yyp = yymsg;
+ sprintf (yyp, "syntax error%s%s",
+ (*yytokenp == YYEMPTY ? "" : ", unexpected "),
+ yytokenName (*yytokenp));
+ yyp += strlen (yyp);
+ if (yycount < 5)
+ {
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
+ yyp += strlen (yyp);
+ yyprefix = " or ";
+ }
+ }
+ yyerror (yymsg);
+ YYFREE (yymsg);
+ }
+ else
+ yyerror ("syntax error; also virtual memory exhausted");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror ("syntax error");
+ yynerrs += 1;
+ }
+}
+
+/* Recover from a syntax error on YYSTACK, assuming that YYTOKENP,
+ YYLVALP, and YYLLOCP point to the syntactic category, semantic
+ value, and location of the look-ahead. */
+static void
+yyrecoverSyntaxError (yyGLRStack* yystack,
+ YYSTYPE* yylvalp,
+ YYLTYPE* yyllocp ATTRIBUTE_UNUSED
+ )
+{
+ yySymbol* const yytokenp = yystack->yytokenp;
+ size_t yyk;
+ int yyj;
+
+ if (yystack->yyerrState == 3)
+ /* We just shifted the error token and (perhaps) took some
+ reductions. Skip tokens until we can proceed. */
+ while (yytrue)
+ {
+ if (*yytokenp == YYEOF)
+ {
+ /* Now pop stack until empty and fail. */
+ while (yystack->yytops.yystates[0] != NULL)
+ {
+ yyGLRState *yys = yystack->yytops.yystates[0];
+
+ yydestruct ("Error: popping",
+ yystos[yys->yylrState],
+ &yys->yysemantics.yysval);
+ yystack->yytops.yystates[0] = yys->yypred;
+ yystack->yynextFree -= 1;
+ yystack->yyspaceLeft += 1;
+ }
+ yyFail (yystack, NULL);
+ }
+ if (*yytokenp != YYEMPTY)
+ {
+ yydestruct ("Error: discarding",
+ *yytokenp, yylvalp);
+ }
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ *yytokenp = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
+ yyj = yypact[yystack->yytops.yystates[0]->yylrState];
+ if (yyis_pact_ninf (yyj))
+ return;
+ yyj += *yytokenp;
+ if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != *yytokenp)
+ {
+ if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0)
+ return;
+ }
+ else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj]))
+ return;
+ }
+
+ /* Reduce to one stack. */
+ for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1)
+ if (yystack->yytops.yystates[yyk] != NULL)
+ break;
+ if (yyk >= yystack->yytops.yysize)
+ yyFail (yystack, NULL);
+ for (yyk += 1; yyk < yystack->yytops.yysize; yyk += 1)
+ yymarkStackDeleted (yystack, yyk);
+ yyremoveDeletes (yystack);
+ yycompressStack (yystack);
+
+ /* Now pop stack until we find a state that shifts the error token. */
+ yystack->yyerrState = 3;
+ while (yystack->yytops.yystates[0] != NULL)
+ {
+ yyGLRState *yys = yystack->yytops.yystates[0];
+ yyj = yypact[yys->yylrState];
+ if (! yyis_pact_ninf (yyj))
+ {
+ yyj += YYTERROR;
+ if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
+ && yyisShiftAction (yytable[yyj]))
+ {
+ /* Shift the error token having adjusted its location. */
+ YYLTYPE yyerrloc;
+ YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
+ yylvalp, &yyerrloc);
+ yyglrShift (yystack, 0, yytable[yyj],
+ yys->yyposn, *yylvalp, &yyerrloc);
+ yys = yystack->yytops.yystates[0];
+ break;
+ }
+ }
+
+ yydestruct ("Error: popping",
+ yystos[yys->yylrState],
+ &yys->yysemantics.yysval);
+ yystack->yytops.yystates[0] = yys->yypred;
+ yystack->yynextFree -= 1;
+ yystack->yyspaceLeft += 1;
+ }
+ if (yystack->yytops.yystates[0] == NULL)
+ yyFail (yystack, NULL);
+}
+
+#define YYCHK1(YYE) \
+ do { \
+ switch (YYE) { \
+ default: \
+ break; \
+ case yyabort: \
+ yystack.yyerrflag = 1; \
+ goto yyDone; \
+ case yyaccept: \
+ yystack.yyerrflag = 0; \
+ goto yyDone; \
+ case yyerr: \
+ goto yyuser_error; \
+ } \
+ } while (0)
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yySymbol yytoken;
+ yyGLRStack yystack;
+ size_t yyposn;
+
+
+ YYSTYPE* const yylvalp = &yylval;
+ YYLTYPE* const yyllocp = &yylloc;
+
+ yyinitGLRStack (&yystack, YYINITDEPTH);
+ yystack.yytokenp = &yytoken;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ if (setjmp (yystack.yyexception_buffer) != 0)
+ goto yyDone;
+
+ yylval = yyval_default;
+
+
+ yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc);
+ yytoken = YYEMPTY;
+ yyposn = 0;
+
+ while (yytrue)
+ {
+ /* For efficiency, we have two loops, the first of which is
+ specialized to deterministic operation (single stack, no
+ potential ambiguity). */
+ /* Standard mode */
+ while (yytrue)
+ {
+ yyRuleNum yyrule;
+ int yyaction;
+ const short int* yyconflicts;
+
+ yyStateNum yystate = yystack.yytops.yystates[0]->yylrState;
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ if (yystate == YYFINAL)
+ goto yyDone;
+ if (yyisDefaultedState (yystate))
+ {
+ yyrule = yydefaultAction (yystate);
+ if (yyrule == 0)
+ {
+
+ yyreportSyntaxError (&yystack, yylvalp, yyllocp);
+ goto yyuser_error;
+ }
+ YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue));
+ }
+ else
+ {
+ if (yytoken == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, yylvalp, yyllocp);
+ }
+ yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
+ if (*yyconflicts != 0)
+ break;
+ if (yyisShiftAction (yyaction))
+ {
+ YY_SYMBOL_PRINT ("Shifting", yytoken, yylvalp, yyllocp);
+ if (yytoken != YYEOF)
+ yytoken = YYEMPTY;
+ yyposn += 1;
+ yyglrShift (&yystack, 0, yyaction, yyposn,
+ yylval, yyllocp);
+ if (0 < yystack.yyerrState)
+ yystack.yyerrState -= 1;
+ }
+ else if (yyisErrorAction (yyaction))
+ {
+
+ yyreportSyntaxError (&yystack, yylvalp, yyllocp);
+ goto yyuser_error;
+ }
+ else
+ YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue));
+ }
+ }
+
+ while (yytrue)
+ {
+ int yys;
+ int yyn = yystack.yytops.yysize;
+ for (yys = 0; yys < yyn; yys += 1)
+ YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn,
+ yylvalp, yyllocp));
+ yytoken = YYEMPTY;
+ yyposn += 1;
+ yyremoveDeletes (&yystack);
+ if (yystack.yytops.yysize == 0)
+ {
+ yyundeleteLastStack (&yystack);
+ if (yystack.yytops.yysize == 0)
+ yyFail (&yystack, "syntax error");
+ YYCHK1 (yyresolveStack (&yystack));
+ YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+
+ yyreportSyntaxError (&yystack, yylvalp, yyllocp);
+ goto yyuser_error;
+ }
+ else if (yystack.yytops.yysize == 1)
+ {
+ YYCHK1 (yyresolveStack (&yystack));
+ YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+ yycompressStack (&yystack);
+ break;
+ }
+ }
+ continue;
+ yyuser_error:
+ yyrecoverSyntaxError (&yystack, yylvalp, yyllocp);
+ yyposn = yystack.yytops.yystates[0]->yyposn;
+ }
+ yyDone:
+ /* On YYABORT, free the lookahead. */
+ if (yystack.yyerrflag == 1 && yytoken != YYEMPTY)
+ yydestruct ("Error: discarding lookahead",
+ yytoken, yylvalp);
+
+ yyfreeGLRStack (&yystack);
+ return yystack.yyerrflag;
+}
+
+/* DEBUGGING ONLY */
+#ifdef YYDEBUG
+static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED;
+static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED;
+
+static void
+yy_yypstack (yyGLRState* yys)
+{
+ if (yys->yypred)
+ {
+ yy_yypstack (yys->yypred);
+ fprintf (stderr, " -> ");
+ }
+ fprintf (stderr, "%d@%lu", yys->yylrState, (unsigned long int) yys->yyposn);
+}
+
+static void
+yypstates (yyGLRState* yyst)
+{
+ if (yyst == NULL)
+ fprintf (stderr, "<null>");
+ else
+ yy_yypstack (yyst);
+ fprintf (stderr, "\n");
+}
+
+static void
+yypstack (yyGLRStack* yystack, int yyk)
+{
+ yypstates (yystack->yytops.yystates[yyk]);
+}
+
+#define YYINDEX(YYX) \
+ ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystack->yyitems)
+
+
+static void
+yypdumpstack (yyGLRStack* yystack)
+{
+ yyGLRStackItem* yyp;
+ size_t yyi;
+ for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1)
+ {
+ fprintf (stderr, "%3lu. ", (unsigned long int) (yyp - yystack->yyitems));
+ if (*(yybool *) yyp)
+ {
+ fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
+ yyp->yystate.yyresolved, yyp->yystate.yylrState,
+ (unsigned long int) yyp->yystate.yyposn,
+ (long int) YYINDEX (yyp->yystate.yypred));
+ if (! yyp->yystate.yyresolved)
+ fprintf (stderr, ", firstVal: %ld",
+ (long int) YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
+ }
+ else
+ {
+ fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld",
+ yyp->yyoption.yyrule,
+ (long int) YYINDEX (yyp->yyoption.yystate),
+ (long int) YYINDEX (yyp->yyoption.yynext));
+ }
+ fprintf (stderr, "\n");
+ }
+ fprintf (stderr, "Tops:");
+ for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
+ fprintf (stderr, "%lu: %ld; ", (unsigned long int) yyi,
+ (long int) YYINDEX (yystack->yytops.yystates[yyi]));
+ fprintf (stderr, "\n");
+}
+#endif
+
+
+#line 77 "idx.y"
+
+