# --------------------
# Expansion of $<TYPE>$.
m4_define([b4_lhs_value],
-[(*yyvalp)[]m4_ifval([$1], [.$1])])
+[((*yyvalp)[]m4_ifval([$1], [.$1]))])
# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS.
m4_define([b4_rhs_value],
-[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])])
+[(((yyGLRStackItem const *)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],
-[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc])
+[(((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc)])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
]b4_identification
m4_if(b4_prefix[], [yy], [],
-[/* If NAME_PREFIX is specified substitute the variables and functions
- names. */
+[/* Substitute the variable and function names. */
#define yyparse b4_prefix[]parse
#define yylex b4_prefix[]lex
#define yyerror b4_prefix[]error
# define YYLTYPE_IS_TRIVIAL 1
#endif
-/* Default (constant) values used for initialization for null
+/* Default (constant) value used for initialization for null
right-hand sides. Unlike the standard yacc.c template,
- here we set the default values of $$ and $@@ to zeroed-out
- values. Since the default value of these quantities is undefined,
- this behavior is technically correct. */
+ 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;
-static YYLTYPE yyloc_default;
/* Copy the second part of user declarations. */
]b4_post_prologue[
the previous symbol: RHS[0] (always defined). */
]b4_location_if([[
-#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
-
+#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
-do { \
- if (YYN) \
- { \
- (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; \
- } \
- else \
- { \
- (yyCurrent).first_line = YYRHSLOC(yyRhs, 0).last_line; \
- (yyCurrent).first_column = YYRHSLOC(yyRhs, 0).last_column; \
- (yyCurrent).last_line = YYRHSLOC(yyRhs, 0).last_line; \
- (yyCurrent).last_column = YYRHSLOC(yyRhs, 0).last_column; \
- } \
-} while(0)
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) \
+ { \
+ (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC(Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC(Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC(Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC(Rhs, 0).last_column; \
+ } \
+ while (0)
/* YY_LOCATION_PRINT -- Print the location on the stream.
This macro was not mandated originally: define only if we know
#endif
]],[
#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) ((void) 0)
+# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0)
#endif
])[
struct yyGLRStack {
int yyerrflag;
int yyerrState;
+]b4_location_if([[ /* To compute the location of the error token. */
+ yyGLRStackItem yyerror_range[3];]])[
]b4_pure_if(
[
int yyerrcnt;
* yyerr for YYERROR, yyabort for YYABORT. */
static YYRESULTTAG
yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
- YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack
+ YYSTYPE* yyvalp,
+ YYLTYPE* yylocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[,
+ yyGLRStack* yystack
]b4_user_formals[)
{
yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL);
else
*yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
-
]
switch (yyn)
{
value, and location of the look-ahead. */
static void
yyrecoverSyntaxError (yyGLRStack* yystack,
- YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[)
+ YYSTYPE* yylvalp,
+ YYLTYPE* yyllocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[
+ ]b4_user_formals[)
{
yySymbol* const yytokenp = yystack->yytokenp;
size_t yyk;
while (yystack->yytops.yystates[0] != NULL)
{
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])[);
yyFail (yystack][]b4_lpure_args[, NULL);
}
if (*yytokenp != YYEMPTY)
- yydestruct ("Error: discarding",
- *yytokenp, yylvalp]b4_location_if([, yyllocp])[);
+ {]b4_location_if([[
+ /* We throw away the lookahead, but the error range
+ of the shifted error token must take it into account. */
+ yyGLRState *yys = yystack->yytops.yystates[0];
+ yyGLRStackItem yyerror_range[3];
+ yyerror_range[1].yystate.yyloc = yys->yyloc;
+ yyerror_range[2].yystate.yyloc = *yyllocp;
+ YYLLOC_DEFAULT (yys->yyloc, yyerror_range, 2);]])[
+ yydestruct ("Error: discarding",
+ *yytokenp, yylvalp]b4_location_if([, yyllocp])[);
+ }
YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
*yytokenp = YYTRANSLATE (yychar);
if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
&& yyisShiftAction (yytable[yyj]))
{
+ /* Shift the error token having adjusted its location. */
+ YYLTYPE yyerrloc;]b4_location_if([[
+ yystack->yyerror_range[2].yystate.yyloc = *yyllocp;
+ YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range, 2);]])[
YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
- yylvalp, yyllocp);
+ yylvalp, &yyerrloc);
yyglrShift (yystack, 0, yytable[yyj],
- yys->yyposn, *yylvalp, yyllocp]b4_user_args[);
+ yys->yyposn, *yylvalp, &yyerrloc]b4_user_args[);
+ yys = yystack->yytops.yystates[0];
break;
}
}
+]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])[);
yyrule = yydefaultAction (yystate);
if (yyrule == 0)
{
+]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
}
}
else if (yyisErrorAction (yyaction))
{
+]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
}
yyFail (&yystack][]b4_lpure_args[, "syntax error");
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
}
# define YYLTYPE_IS_TRIVIAL 1
#endif
-b4_location_if([m4_if(b4_pure, [0],
+b4_location_if([b4_pure_if([],
[extern YYLTYPE b4_prefix[]lloc;])
])
])