/* This is the parser code for GLR (Generalized LR) parser. */
/* FIXME: minimize these */
-#include <stdlib.h>
+#include <assert.h>
#include <setjmp.h>
-#include <stdio.h>
#include <stdarg.h>
-#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
/* Identify Bison output. */
#define YYBISON 1
#define yynerrs b4_prefix[]nerrs
b4_location_if([#define yylloc b4_prefix[]lloc])])
-/* Copy the first part of user declarations. */
-b4_pre_prologue
+b4_token_defines(b4_tokens)
-b4_token_defines(b4_tokens)[
+/* Copy the first part of user declarations. */
+b4_pre_prologue[
/* Enabling traces. */
#ifndef YYDEBUG
typedef struct yyltype
{
]b4_location_if([
- int yyfirst_line;
- int yyfirst_column;
- int yylast_line;
- int yylast_column;])[
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;])[
} yyltype;
# define YYLTYPE ]b4_ltype[
# define YYLTYPE_IS_TRIVIAL 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 zero, do what YYDEFACT says. */
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, parse error. */
#define YYTABLE_NINF ]b4_table_ninf[
static const ]b4_int_type_for([b4_table])[ yytable[] =
{
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
- yyCurrent.yyfirst_line = YYRHSLOC(yyRhs,1).yyfirst_line; \
- yyCurrent.yyfirst_column = YYRHSLOC(yyRhs,1).yyfirst_column; \
- yyCurrent.yylast_line = YYRHSLOC(yyRhs,YYN).yylast_line; \
- yyCurrent.yylast_column = YYRHSLOC(yyRhs,YYN).yylast_column;
+ yyCurrent.first_line = YYRHSLOC(yyRhs,1).first_line; \
+ yyCurrent.first_column = YYRHSLOC(yyRhs,1).first_column; \
+ yyCurrent.last_line = YYRHSLOC(yyRhs,YYN).last_line; \
+ yyCurrent.last_column = YYRHSLOC(yyRhs,YYN).last_column;
#endif
/* YYLEX -- calling `yylex' with the right arguments. */
return yydefact[yystate];
}
-/** Set *ACTION to the action to take in STATE on seeing TOKEN.
+/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
* Result R means
* R < 0: Reduce on rule -R.
* R = 0: Error.
int* yyaction, const short** yyconflicts)
{
int yyindex = yypact[yystate] + yytoken;
- if (yyindex < 0 || yyindex > YYLAST || yycheck[yyindex] != yytoken)
+ if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
{
*yyaction = -yydefact[yystate];
*yyconflicts = yyconfl;
}
- else
+ else if (yytable[yyindex] != YYTABLE_NINF)
{
*yyaction = yytable[yyindex];
*yyconflicts = yyconfl + yyconflp[yyindex];
}
+ else
+ {
+ *yyaction = 0;
+ *yyconflicts = yyconfl + yyconflp[yyindex];
+ }
}
static inline yyStateNum
{
int yyr;
yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
- if (yyr >= 0 && yyr <= YYLAST && yycheck[yyr] == yystate)
+ if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
return yytable[yyr];
else
return yydefgoto[yylhs - YYNTOKENS];
static inline bool
yyisErrorAction (int yyaction)
{
- return yyaction == 0 || yyaction == YYPACT_NINF;
+ return yyaction == 0;
}
/* GLRStates */
YYSTYPE yysval;
YYLTYPE yyloc;
+#if YYDEBUG
+ if (yydebug)
+ {
+ int yyi;
+ YYDPRINTF ((stderr, "Reducing stack %d by rule %d (line %d),",
+ yyk, yyrule - 1, yyrline[yyrule]));
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; yyrhs[yyi] >= 0; yyi++)
+ YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi]));
+ YYFPRINTF (stderr, " -> %s\n", yytokenName (yyr1[yyrule]));
+ }
+#endif
YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc));
yyglrShift (yystack, yyk,
yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState,
yylhsNonterm (yyrule)),
yyposn, yysval, &yyloc);
- YYDPRINTF ((stderr, "Reduced stack %d by rule #%d. Now in state %d.\n",
- yyk, yyrule-1, yystack->yytops.yystates[yyk]->yylrState));
+ YYDPRINTF ((stderr, "Stack %d entering state %d\n",
+ yyk, yystack->yytops.yystates[yyk]->yylrState));
}
else
{
}
#if YYDEBUG
-static yyGLRState YYLEFTMOST_STATE = { 0, NULL, -1, 0, { NULL } };
+static yyGLRState YYLEFTMOST_STATE = { 0, 0, -1, NULL, 0, { NULL } };
static void yyreportTree (yySemanticOption* yyx, int yyindent)
{
{
if (*yytokenp == YYEMPTY)
{
+ YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
*yytokenp = YYTRANSLATE(yychar);
- YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp)));
+ YYDPRINTF ((stderr, "Next token is %s\n",
+ yytokenName (*yytokenp)));
}
yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts);
if (yyisShiftAction (yyaction))
{
- YYDPRINTF ((stderr, "Shifted token %s on stack %d, ",
+ YYDPRINTF ((stderr, "Shifting token %s on stack %d, ",
yytokenName (*yytokenp), yyk));
yyglrShift (yystack, yyk, yyaction, yyposn+1, *yylvalp, yyllocp);
YYDPRINTF ((stderr, "which is now in state #%d\n",
{
#if YYERROR_VERBOSE
yySymbol* const yytokenp = yystack->yytokenp;
- int yyn, yyx, yycount, yysize;
+ int yyn, yyx, yycount;
+ size_t yysize;
const char* yyprefix;
char* yyp;
char* yymsg;
{
yyprefix = ", expecting ";
for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1)
- if (yycheck[yyx + yyn] == yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
yyp += sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
yyprefix = " or ";
}
}
-/* Recover from a syntax error on STACK, assuming that TOKENP,
+/* Recover from a syntax error on YYSTACK, assuming that YYTOKENP,
YYLVALP, and YYLLOCP point to the syntactic category, semantic
- value, and location of the lookahead.
- NOTE: This uses the panic-mode recovery algorithm described in the
- Bison documentation, which differs from what is in bison.simple.
- Specifically, this routine performs no reductions before shifting
- the error token. */
+ value, and location of the lookahead. */
static void
yyrecoverParseError (yyGLRStack* yystack, YYSTYPE* yylvalp, YYLTYPE* yyllocp)
{
if (yystack->yyerrState == 0)
yystack->yyerrState = 3;
else if (yystack->yyerrState == 3)
- {
- /* We just shifted the error token and (perhaps) took some
- reductions. Skip tokens until we can proceed. */
- do {
+ /* We just shifted the error token and (perhaps) took some
+ reductions. Skip tokens until we can proceed. */
+ while (yytrue)
+ {
if (*yytokenp == YYEOF)
yyFail (yystack, NULL);
if (*yytokenp != YYEMPTY)
YYDPRINTF ((stderr, "Discarding token %s\n",
yytokenName (*yytokenp)));
+ YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
*yytokenp = YYTRANSLATE (yychar);
- YYDPRINTF ((stderr, "Read token %s\n", yytokenName (*yytokenp)));
+ YYDPRINTF ((stderr, "Next token is %s\n", yytokenName (*yytokenp)));
yyj = yypact[yystack->yytops.yystates[0]->yylrState];
if (yyj == YYPACT_NINF)
- /* Something's not right; we shouldn't be here */
+ /* Something's not right; we shouldn't be here. */
yyFail (yystack, NULL);
yyj += *yytokenp;
if (yyj < 0 || yyj > YYLAST || yycheck[yyj] != *yytokenp)
}
else if (yytable[yyj] != 0 && yytable[yyj] != YYTABLE_NINF)
return;
- } while (yytrue);
- }
+ }
- /* Reduce to one stack */
+ /* Reduce to one stack. */
for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1)
if (yystack->yytops.yystates[yyk] != NULL)
break;
yyinitGLRStack (&yystack, YYINITDEPTH);
yystack.yytokenp = &yytoken;
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
if (setjmp (yystack.yyexception_buffer) != 0)
goto yyDone;
{
if (yytoken == YYEMPTY)
{
+ YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
yytoken = YYTRANSLATE (yychar);
- YYDPRINTF ((stderr, "Read token %s\n",
+ YYDPRINTF ((stderr, "Next token is %s\n",
yytokenName (yytoken)));
}
yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
break;
if (yyisShiftAction (yyaction))
{
- YYDPRINTF ((stderr, "Shifted token %s. ",
+ YYDPRINTF ((stderr, "Shifting token %s, ",
yytokenName (yytoken)));
if (yytoken != YYEOF)
yytoken = YYEMPTY;
yyglrShift (&yystack, 0, yyaction, yyposn, yylval, yyllocp);
if (yystack.yyerrState > 0)
yystack.yyerrState -= 1;
- YYDPRINTF ((stderr, "Now in state #%d\n",
+ YYDPRINTF ((stderr, "Entering state %d\n",
yystack.yytops.yystates[0]->yylrState));
}
else if (yyisErrorAction (yyaction))
static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED;
static void
-yypstates (yyGLRState* yyst)
+yy_yypstack (yyGLRState* yys)
{
- static void
- yy_yypstack (yyGLRState* yys)
+ if (yys->yypred)
{
- if (yys->yypred == NULL)
- fprintf (stderr, "%d@%d", yys->yylrState, yys->yyposn);
- else
- {
- yy_yypstack (yys->yypred);
- fprintf (stderr, " -> %d@%d", yys->yylrState, yys->yyposn);
- }
+ yy_yypstack (yys->yypred);
+ fprintf (stderr, " -> ");
}
+ fprintf (stderr, "%d@%lu", yys->yylrState, (unsigned long) yys->yyposn);
+}
+static void
+yypstates (yyGLRState* yyst)
+{
if (yyst == NULL)
fprintf (stderr, "<null>");
else
size_t yyi;
for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1)
{
- fprintf (stderr, "%3d. ", yyp - yystack->yyitems);
+ fprintf (stderr, "%3lu. ", (unsigned long) (yyp - yystack->yyitems));
if (*(bool*) yyp)
{
- fprintf (stderr, "Res: %d, LR State: %d, posn: %d, pred: %d",
+ fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
yyp->yystate.yyresolved, yyp->yystate.yylrState,
- yyp->yystate.yyposn,
- YYINDEX(yyp->yystate.yypred));
+ (unsigned long) yyp->yystate.yyposn,
+ (long) YYINDEX (yyp->yystate.yypred));
if (! yyp->yystate.yyresolved)
- fprintf (stderr, ", firstVal: %d",
- YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
+ fprintf (stderr, ", firstVal: %ld",
+ (long) YYINDEX (yyp->yystate.yysemantics.yyfirstVal));
}
else
{
- fprintf (stderr, "Option. rule: %d, state: %d, next: %d",
- yyp->yyoption.yyrule, YYINDEX (yyp->yyoption.yystate),
- YYINDEX (yyp->yyoption.yynext));
+ fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld",
+ yyp->yyoption.yyrule,
+ (long) YYINDEX (yyp->yyoption.yystate),
+ (long) YYINDEX (yyp->yyoption.yynext));
}
fprintf (stderr, "\n");
}
fprintf (stderr, "Tops:");
for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
- fprintf (stderr, "%d: %d; ", yyi, YYINDEX (yystack->yytops.yystates[yyi]));
+ fprintf (stderr, "%lu: %ld; ", (unsigned long) yyi,
+ (long) YYINDEX (yystack->yytops.yystates[yyi]));
fprintf (stderr, "\n");
}
[#ifndef YYLTYPE
typedef struct yyltype
{
- int yyfirst_line;
- int yyfirst_column;
- int yylast_line;
- int yylast_column;
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;
} yyltype;
# define YYLTYPE yyltype
#endif