# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS.
m4_define([b4_rhs_value],
-[yyvsp@{m4_eval([$2 - $1])@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])])
+[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])])
# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
# on RHS.
m4_define([b4_rhs_location],
-[yyvsp@{m4_eval([$2 - $1])@}.yystate.yyloc])
-
+[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
{
]b4_tname[
};
-
-#define yytname_size ((int) (sizeof (yytname) / sizeof (yytname[0])))
#endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
}
#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. For convenience, returns YYLOW1. */
+static int
+yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1)
+{
+ yyGLRState* s;
+ int i;
+ s = yyvsp[yylow0].yystate.yypred;
+ for (i = yylow0-1; i >= yylow1; i -= 1)
+ {
+ if (! s->yyresolved)
+ abort ();
+ 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;
+ }
+ 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
YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack
]b4_user_formals[)
{
- /* Avoid `unused' warnings in there are no $n. */
- (void) yystack;
+ int yynormal = (yystack->yysplitPoint == NULL);
+ int yylow;
if (yyrhslen == 0)
{
# define YYRECOVERING (yystack->yyerrState != 0)
# undef yyclearin
# define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY)
+# undef YYFILL
+# define YYFILL(N) \
+ ((yynormal || yylow <= (N)) ? (N) : (yylow = yyfill (yyvsp, yylow, N)))
# undef YYBACKUP
# define YYBACKUP(Token, Value) \
do { \
} while (0)
]
+ yylow = 1;
switch (yyn)
{
b4_actions
#else
- yyFail (yystack][]b4_lpure_args[, "parser stack overflow");
+ yyFail (yystack][]b4_pure_args[, "parser stack overflow");
#endif
}
yyexpandGLRStack (yystack]b4_pure_args[);
}
-/** Shift to a new state on stack #K of STACK, to a new state
- * corresponding to LR state LRSTATE, at input position POSN, with
- * the (unresolved) semantic value of RHS under the action for RULE. */
+/** 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]b4_pure_formals[)
{
int yyi;
yyGLRState* yys;
- yyGLRStackItem yyrhsVals[YYMAXRHS];
- for (yyi = yynrhs-1, yys = yystack->yytops.yystates[yyk]; 0 <= yyi;
- yyi -= 1, yys = yys->yypred)
+ yyGLRStackItem yyrhsVals[YYMAXRHS+1];
+ yys = yyrhsVals[YYMAXRHS].yystate.yypred = yystack->yytops.yystates[yyk];
+ for (yyi = 0; yyi < yynrhs; yyi += 1)
{
- if (! yys->yypred)
+ yys = yys->yypred;
+ if (yys == NULL)
abort ();
- yyrhsVals[yyi].yystate.yyresolved = yytrue;
- yyrhsVals[yyi].yystate.yysemantics.yysval = yys->yysemantics.yysval;
- yyrhsVals[yyi].yystate.yyloc = yys->yyloc;
}
yyupdateSplit (yystack, yys);
yystack->yytops.yystates[yyk] = yys;
}
else
{
- *yyvalp = yyrhsVals[0].yystate.yysemantics.yysval;
- *yylocp = yyrhsVals[0].yystate.yyloc;
+ *yyvalp = yyrhsVals[1].yystate.yysemantics.yysval;
+ *yylocp = yyrhsVals[1].yystate.yyloc;
}
- return yyuserAction (yyrule, yynrhs, yyrhsVals + (yynrhs-1),
+ return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS - 1,
yyvalp, yylocp, yystack]b4_user_args[);
}
}
yy_reduce_print (size_t yyk, yyRuleNum yyrule)
{
int yyi;
- unsigned int yylineno = yyrline[yyrule];
+ unsigned int yylno = yyrline[yyrule];
YYFPRINTF (stderr, "Reducing stack %d by rule %d (line %u), ",
- yyk, yyrule - 1, yylineno);
+ yyk, yyrule - 1, yylno);
/* Print the symbols being reduced, and their result. */
for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi]));
0 < yyn; yyn -= 1)
{
yys = yys->yypred;
- if (! yys)
+ if (yys == NULL)
abort ();
}
yyupdateSplit (yystack, yys);
YYRESULTTAG yyflag;
if (0 < yyn)
{
- if (! yys->yypred)
+ if (yys->yypred == NULL)
abort ();
yyflag = yyresolveStates (yys->yypred, yyn-1, yystack]b4_user_args[);
if (yyflag != yyok)
yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack,
YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
{
- yyGLRStackItem yyrhsVals[YYMAXRHS];
- int yynrhs, yyi;
- yyGLRState* yys;
+ yyGLRStackItem yyrhsVals[YYMAXRHS+1];
+ int yynrhs;
yynrhs = yyrhsLength (yyopt->yyrule);
YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack]b4_user_args[));
- for (yyi = yynrhs-1, yys = yyopt->yystate; 0 <= yyi;
- yyi -= 1, yys = yys->yypred)
- {
- if (! yys->yypred)
- abort ();
- yyrhsVals[yyi].yystate.yyresolved = yytrue;
- yyrhsVals[yyi].yystate.yysemantics.yysval = yys->yysemantics.yysval;
- yyrhsVals[yyi].yystate.yyloc = yys->yyloc;
- }
- return yyuserAction (yyopt->yyrule, yynrhs, yyrhsVals + (yynrhs-1),
+ yyrhsVals[YYMAXRHS].yystate.yypred = yyopt->yystate;
+ return yyuserAction (yyopt->yyrule, yynrhs, yyrhsVals + YYMAXRHS - 1,
yyvalp, yylocp, yystack]b4_user_args[);
}
{
#if YYERROR_VERBOSE
yySymbol* const yytokenp = yystack->yytokenp;
- int yyn, yyx, yycount;
- size_t yysize;
- const char* yyprefix;
- char* yyp;
- char* yymsg;
+ int yyn;
yyn = yypact[yystack->yytops.yystates[0]->yylrState];
if (YYPACT_NINF < yyn && yyn < YYLAST)
{
- yycount = 0;
+ size_t yysize = 0;
+ const char* yyprefix;
+ char* yymsg;
+ int yyx;
+
/* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */
- yysize = sizeof ("syntax error, unexpected ")
- + strlen (yytokenName (*yytokenp));
+ 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 = yyn < 0 ? -yyn : 0; yyx < yytname_size && yycount <= 5;
- yyx += 1)
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- yysize += strlen (yytokenName (yyx)) + strlen (yyprefix),
- yycount += 1, yyprefix = " or ";
- yymsg = yyp = (char*) malloc (yysize);
- sprintf (yyp, "syntax error, unexpected %s",
- yytokenName (*yytokenp));
- yyp += strlen (yyp);
- if (yycount < 5)
- {
- yyprefix = ", expecting ";
- for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yysize += strlen (yyprefix) + strlen (yytokenName (yyx));
+ yycount += 1;
+ if (yycount == 5)
{
- sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
- yyp += strlen (yyp);
- yyprefix = " or ";
+ yysize = 0;
+ break;
}
+ yyprefix = " or ";
+ }
+ yysize += (sizeof ("syntax error, unexpected ")
+ + strlen (yytokenName (*yytokenp)));
+ yymsg = (char*) malloc (yysize);
+ if (yymsg != 0)
+ {
+ char* yyp = yymsg;
+ sprintf (yyp, "syntax error, unexpected %s",
+ 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 (]b4_lyyerror_args[yymsg);
+ free (yymsg);
}
- yyerror (]b4_lyyerror_args[yymsg);
- free (yymsg);
+ else
+ yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted");
}
else
-#endif
+#endif /* YYERROR_VERBOSE */
yyerror (]b4_lyyerror_args["syntax error");
yynerrs += 1;
}