Introduce another definition to address simple location arrays.
(yyGLRStack): New member: yyerror_range.
(yyrecoverSyntaxError, yyparse): Update it.
(yyrecoverSyntaxError): Use it when shifting the error token to
have an accurate range, equivalent to the one computed by both
yacc.c and lalr1.cc.
* tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so
that column numbers start at column 0, as per GNU Coding
Standards, the others tests, and the doc.
(_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC):
Adjust to the above change (first column is 0).
And adjust the location of the "<error>", now covering the whole
line.
+2004-10-25 Akim Demaille <akim@epita.fr>
+
+ * data/glr.c (YYRHSLOC): Move its definition next to its uses.
+ Introduce another definition to address simple location arrays.
+ (yyGLRStack): New member: yyerror_range.
+ (yyrecoverSyntaxError, yyparse): Update it.
+ (yyrecoverSyntaxError): Use it when shifting the error token to
+ have an accurate range, equivalent to the one computed by both
+ yacc.c and lalr1.cc.
+ * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so
+ that column numbers start at column 0, as per GNU Coding
+ Standards, the others tests, and the doc.
+ (_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC):
+ Adjust to the above change (first column is 0).
+ And adjust the location of the "<error>", now covering the whole
+ line.
+
2004-10-22 Akim Demaille <akim@epita.fr>
and Paul Eggert <eggert@cs.ucla.edu>
initializing @$) from yyparse before parsing starts.
* The option `--report=lookahead' was changed to `--report=look-ahead'.
- The old spelling still works, but is not documented and will be removed.
+ The old spelling still works, but is not documented and will be
+ removed.
+
+* Error token location.
+ During error recovery, the location of the syntax error is updated
+ to cover the whole sequence covered by the error token: it includes
+ the shifted symbols thrown away during the first part of the error
+ recovery, and the lookahead rejected during the second part.
Changes in version 1.875d, 2004-05-21:
the previous symbol: RHS[0] (always defined). */
]b4_location_if([[
-#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
-
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
do { \
struct yyGLRStack {
int yyerrflag;
int yyerrState;
+]b4_location_if([[ /* To compute the location of the error token, */
+ YYLTYPE yyerror_range[2];]])[
]b4_pure_if(
[
int yyerrcnt;
*yyvalp = yyval_default;
else
*yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
+# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
-
+# undef YYRHSLOC
]
switch (yyn)
{
while (yystack->yytops.yystates[0] != NULL)
{
yyGLRState *yys = yystack->yytops.yystates[0];
+]b4_location_if([[ yystack->yyerror_range[0] = 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];
+ yys->yyloc.last_line = yyllocp->last_line;
+ yys->yyloc.last_column = yyllocp->last_column;]])[
+ 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[1] = *yyllocp;
+# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK])
+ YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range - 1, 2);
+# undef YYRHSLOC]])[
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[0] = 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[0] = *yyllocp;]])[
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
}
}
else if (yyisErrorAction (yyaction))
{
+ yyGLRState *yys = yystack.yytops.yystates[0];
+]b4_location_if([[ yystack.yyerror_range[0] = *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[0] = *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;])
])
])
# Checking GLR Parsing. -*- Autotest -*-
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004 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
int c;
unsigned int i;
static int lineNum = 1;
- static int colNum = 1;
-
+ static int colNum = 0;
#if YYPURE
# define yylloc (*llocp)
case EOF:
return 0;
case '\t':
- colNum = 1 + ((colNum + 7) & ~7);
+ colNum = (colNum + 7) & ~7;
break;
case ' ': case '\f':
colNum += 1;
break;
case '\n':
lineNum += 1;
- colNum = 1;
+ colNum = 0;
break;
default:
{
]])
m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
-[[3.1-3.6: +(z,q)
-5.1-5.4: <declare>(T,x)
-7.1-7.8: <init-declare>(T,x,y)
-9.1-9.6: =(x,y)
-11.1-11.10: +(<cast>(x,T),y)
-13.1-13.6: <declare>(T,x)
-15.1-15.14: <init-declare>(T,y,+(z,q))
-17.6-17.16: <error>
-19.1-19.6: +(z,q)
+[[3.0-3.5: +(z,q)
+5.0-5.3: <declare>(T,x)
+7.0-7.7: <init-declare>(T,x,y)
+9.0-9.5: =(x,y)
+11.0-11.9: +(<cast>(x,T),y)
+13.0-13.5: <declare>(T,x)
+15.0-15.13: <init-declare>(T,y,+(z,q))
+17.0-17.15: <error>
+19.0-19.5: +(z,q)
]])
m4_define([_AT_AMBIG_GLR_OUTPUT],
]])
m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
-[[3.1-3.6: +(z,q)
-5.1-5.4: <declare>(T,x)
-7.1-7.8: <init-declare>(T,x,y)
-9.1-9.6: =(x,y)
-11.1-11.10: +(<cast>(x,T),y)
-13.1-13.6: <OR>(<declare>(T,x),<cast>(x,T))
-15.1-15.14: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.6-17.16: <error>
-19.1-19.6: +(z,q)
+[[3.0-3.5: +(z,q)
+5.0-5.3: <declare>(T,x)
+7.0-7.7: <init-declare>(T,x,y)
+9.0-9.5: =(x,y)
+11.0-11.9: +(<cast>(x,T),y)
+13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
+15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
+17.0-17.15: <error>
+19.0-19.5: +(z,q)
]])
m4_define([_AT_GLR_STDERR],