# define YYERROR_VERBOSE ]b4_error_verbose[
#endif
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE ]b4_token_table[
+#endif
+
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
]m4_ifdef([b4_stype],
[b4_syncline([b4_stype_line], [b4_filename])
};
#endif
-#if (YYDEBUG) || YYERROR_VERBOSE
-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+#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[] =
{
# 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 size_t
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ size_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 strlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
#endif /* !YYERROR_VERBOSE */
/** State numbers, as in LALR(1) machine */
yyGLRStateSet yytops;
};
-static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[);
+static void yyexpandGLRStack (yyGLRStack* yystack);
static void
yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
static void
yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate,
- yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[)
+ yyGLRState* rhs, yyRuleNum yyrule)
{
yySemanticOption* yynewItem;
yynewItem = &yystack->yynextFree->yyoption;
yynewItem->yynext = yystate->yysemantics.yyfirstVal;
yystate->yysemantics.yyfirstVal = yynewItem;
if (yystack->yyspaceLeft < YYHEADROOM)
- yyexpandGLRStack (yystack]b4_pure_args[);
+ yyexpandGLRStack (yystack);
}
/* GLRStacks */
yystack->yyerrState = 0;
yynerrs = 0;
yystack->yyspaceLeft = yysize;
- yystack->yynextFree = yystack->yyitems =
+ yystack->yyitems =
(yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]);
+ if (!yystack->yyitems)
+ return yyfalse;
+ yystack->yynextFree = yystack->yyitems;
yystack->yysplitPoint = NULL;
yystack->yylastDeleted = NULL;
- return yyinitStateSet (&yystack->yytops) && yystack->yyitems;
+ return yyinitStateSet (&yystack->yytops);
}
#define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
allocation, so that we can avoid having external pointers exist
across an allocation. */
static void
-yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[)
+yyexpandGLRStack (yyGLRStack* yystack)
{
#if YYSTACKEXPANDABLE
yyGLRStackItem* yynewItems;
yystack->yyspaceLeft = yynewSize - yysize;
#else
-
yyMemoryExhausted (yystack);
#endif
}
static inline void
yyglrShift (yyGLRStack* yystack, size_t yyk, yyStateNum yylrState,
size_t yyposn,
- YYSTYPE yysval, YYLTYPE* yylocp]b4_user_formals[)
+ YYSTYPE yysval, YYLTYPE* yylocp)
{
yyGLRStackItem* yynewItem;
yynewItem->yystate.yysemantics.yysval = yysval;
yynewItem->yystate.yyloc = *yylocp;
if (yystack->yyspaceLeft < YYHEADROOM)
- yyexpandGLRStack (yystack]b4_pure_args[);
+ yyexpandGLRStack (yystack);
}
/** Shift stack #K of YYSTACK, to a new state corresponding to LR
* semantic value of YYRHS under the action for YYRULE. */
static inline void
yyglrShiftDefer (yyGLRStack* yystack, size_t yyk, yyStateNum yylrState,
- size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[)
+ size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
{
yyGLRStackItem* yynewItem;
yystack->yytops.yystates[yyk] = &yynewItem->yystate;
yystack->yynextFree += 1;
yystack->yyspaceLeft -= 1;
- yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule]b4_pure_args[);
+ yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule);
}
/** Pop the symbols consumed by reduction #RULE from the top of stack
*/
static inline YYRESULTTAG
yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule,
- yybool yyforceEval]b4_pure_formals[)
+ yybool yyforceEval]b4_user_formals[)
{
size_t yyposn = yystack->yytops.yystates[yyk]->yyposn;
yyglrShift (yystack, yyk,
yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState,
yylhsNonterm (yyrule)),
- yyposn, yysval, &yyloc]b4_user_args[);
+ yyposn, yysval, &yyloc);
}
else
{
{
if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
{
- yyaddDeferredAction (yystack, yyp, yys0, yyrule]b4_pure_args[);
+ yyaddDeferredAction (yystack, yyp, yys0, yyrule);
yymarkStackDeleted (yystack, yyk);
YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
(unsigned long int) yyk,
}
}
yystack->yytops.yystates[yyk] = yys;
- yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule]b4_pure_args[);
+ yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule);
}
return yyok;
}
static size_t
-yysplitStack (yyGLRStack* yystack, size_t yyk]b4_pure_formals[)
+yysplitStack (yyGLRStack* yystack, size_t yyk)
{
if (yystack->yysplitPoint == NULL)
{
yymarkStackDeleted (yystack, yyk);
return yyok;
}
- YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse]b4_lpure_args[));
+ YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse]b4_user_args[));
}
else
{
while (*yyconflicts != 0)
{
- size_t yynewStack = yysplitStack (yystack, yyk]b4_pure_args[);
+ size_t yynewStack = yysplitStack (yystack, yyk);
YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
(unsigned long int) yynewStack,
(unsigned long int) yyk));
YYCHK (yyglrReduce (yystack, yynewStack,
- *yyconflicts, yyfalse]b4_lpure_args[));
+ *yyconflicts, yyfalse]b4_user_args[));
YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn,
yylvalp, yyllocp]b4_pure_args[));
yyconflicts += 1;
YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yyk));
YY_SYMBOL_PRINT ("shifting", *yytokenp, yylvalp, yyllocp);
yyglrShift (yystack, yyk, yyaction, yyposn+1,
- *yylvalp, yyllocp]b4_user_args[);
+ *yylvalp, yyllocp);
YYDPRINTF ((stderr, ", now in state #%d\n",
yystack->yytops.yystates[yyk]->yylrState));
break;
break;
}
else
- YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse]b4_lpure_args[));
+ YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse]b4_user_args[));
}
}
return yyok;
yyn = yypact[yystack->yytops.yystates[0]->yylrState];
if (YYPACT_NINF < yyn && yyn < YYLAST)
{
- size_t yysize0 = strlen (yytokenName (*yytokenp));
+ size_t yysize0 = yytnamerr (NULL, yytokenName (*yytokenp));
size_t yysize = yysize0;
size_t yysize1;
yybool yysize_overflow = yyfalse;
break;
}
yyarg[yycount++] = yytokenName (yyx);
- yysize1 = yysize + strlen (yytokenName (yyx));
+ yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
yysize_overflow |= yysize1 < yysize;
yysize = yysize1;
yyfmt = yystpcpy (yyfmt, yyprefix);
{
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
{
- yyp = yystpcpy (yyp, yyarg[yyi++]);
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
yyf += 2;
}
else
yylvalp, &yyerrloc);
YYDPRINTF ((stderr, "\n"));
yyglrShift (yystack, 0, yytable[yyj],
- yys->yyposn, *yylvalp, &yyerrloc]b4_user_args[);
+ yys->yyposn, *yylvalp, &yyerrloc);
yys = yystack->yytops.yystates[0];
break;
}
case 2: goto yyexhaustedlab;
}
yystack.yytokenp = &yytoken;
- yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc]b4_user_args[);
+ yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc);
yyposn = 0;
while (yytrue)
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
}
- YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_lpure_args[));
+ YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[));
}
else
{
if (yytoken != YYEOF)
yytoken = YYEMPTY;
yyposn += 1;
- yyglrShift (&yystack, 0, yyaction, yyposn,
- yylval, yyllocp]b4_user_args[);
+ yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp);
if (0 < yystack.yyerrState)
yystack.yyerrState -= 1;
}
goto yyuser_error;
}
else
- YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_lpure_args[));
+ YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[));
}
}
yydestruct ("Error: discarding lookahead",
yytoken, yylvalp]b4_location_if([, yyllocp])[);
- /* Now pop stack until empty, destroying its entries as we go. */
- while (yystack.yytops.yystates[0] != NULL)
+ /* If the stack is well-formed, pop the stack until it is empty,
+ destroying its entries as we go. But free the stack regardless
+ of whether it is well-formed. */
+ if (yystack.yyitems)
{
- yyGLRState *yys = yystack.yytops.yystates[0];
-]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
- yydestruct ("Error: popping",
- yystos[yys->yylrState],
- &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
- yystack.yytops.yystates[0] = yys->yypred;
- yystack.yynextFree -= 1;
- yystack.yyspaceLeft += 1;
+ yyGLRState** yystates = yystack.yytops.yystates;
+ if (yystates)
+ while (yystates[0])
+ {
+ yyGLRState *yys = yystates[0];
+]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
+)[ yydestruct ("Error: popping",
+ yystos[yys->yylrState],
+ &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+ yystates[0] = yys->yypred;
+ yystack.yynextFree -= 1;
+ yystack.yyspaceLeft += 1;
+ }
+ yyfreeGLRStack (&yystack);
}
- yyfreeGLRStack (&yystack);
return yyresult;
}