m4_divert(-1) -*- C -*-
-m4_include([c.m4])
# GLR skeleton for Bison
-# Copyright (C) 2002 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003 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
# 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()
m4_divert(0)dnl
@output @output_parser_name@
-b4_copyright([Skeleton parser for GLR parsing with Bison], [2002])
+b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003])
[
/* This is the parser code for GLR (Generalized LR) parser. */
]/* Line __line__ of glr.c. */
b4_syncline([@oline@], [@ofile@])
[
-#if ! defined (__cplusplus)
- typedef char bool;
-# define yytrue 1
-# define yyfalse 0
+#ifdef __cplusplus
+ typedef bool yybool;
+#else
+ typedef unsigned char yybool;
#endif
+#define yytrue 1
+#define yyfalse 0
/*-----------------.
| GCC extensions. |
{
]b4_tname[
};
-
-#define yytname_size ((int) (sizeof (yytname) / sizeof (yytname[0])))
#endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
typedef struct yyGLRStateSet yyGLRStateSet;
struct yyGLRState {
- bool yyisState;
- bool yyresolved;
+ yybool yyisState;
+ yybool yyresolved;
yyStateNum yylrState;
yyGLRState* yypred;
size_t yyposn;
};
struct yySemanticOption {
- bool yyisState;
+ yybool yyisState;
yyRuleNum yyrule;
yyGLRState* yystate;
yySemanticOption* yynext;
}
#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
/** True iff LR state STATE has only a default reduction (regardless
* of token). */
-static inline bool
+static inline yybool
yyisDefaultedState (yyStateNum yystate)
{
return yyis_pact_ninf (yypact[yystate]);
return yydefgoto[yylhs - YYNTOKENS];
}
-static inline bool
+static inline yybool
yyisShiftAction (int yyaction)
{
return 0 < yyaction;
}
-static inline bool
+static inline yybool
yyisErrorAction (int yyaction)
{
return yyaction == 0;
yyn -= 1, yyp0 += 1, yyp1 += 1)
{
*yyp1 = *yyp0;
- if (*(bool*) yyp0)
+ if (*(yybool *) yyp0)
{
yyGLRState* yys0 = &yyp0->yystate;
yyGLRState* yys1 = &yyp1->yystate;
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]));
*/
static inline YYRESULTTAG
yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule,
- bool yyforceEval]b4_pure_formals[)
+ yybool yyforceEval]b4_pure_formals[)
{
size_t yyposn = yystack->yytops.yystates[yyk]->yyposn;
0 < yyn; yyn -= 1)
{
yys = yys->yypred;
- if (! yys)
+ if (yys == NULL)
abort ();
}
yyupdateSplit (yystack, yys);
/** 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 bool
+static yybool
yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1)
{
if (yyy0->yyrule == yyy1->yyrule)
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;
+ int yyn;
const char* yyprefix;
- char* yyp;
- char* yymsg;
yyn = yypact[yystack->yytops.yystates[0]->yylrState];
if (YYPACT_NINF < yyn && yyn < YYLAST)
{
- yycount = 0;
+ size_t yysize = 0;
+ 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 yyxbase = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yynsyms = sizeof (yytname) / sizeof (yytname[0]);
+ int yyxlim = yychecklim < yynsyms ? yychecklim : yynsyms;
+ int yycount = 0;
+
yyprefix = ", expecting ";
- for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size && yycount <= 5;
- yyx += 1)
+ for (yyx = yyxbase; yyx < yyxlim && yycount < 5; yyx += 1)
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 (yytokenName (yyx)) + strlen (yyprefix);
+ 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 = yyxbase; yyx < yyxlim; yyx += 1)
+ 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;
}
for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1)
{
fprintf (stderr, "%3lu. ", (unsigned long) (yyp - yystack->yyitems));
- if (*(bool*) yyp)
+ if (*(yybool *) yyp)
{
fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
yyp->yystate.yyresolved, yyp->yystate.yylrState,
b4_epilogue
m4_if(b4_defines_flag, 0, [],
[@output @output_header_name@
-b4_copyright([Skeleton parser for GLR parsing with Bison], [2002])
+b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003])
b4_token_defines(b4_tokens)