mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 08:13:02 +00:00
* 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.
This commit is contained in:
17
ChangeLog
17
ChangeLog
@@ -1,3 +1,20 @@
|
|||||||
|
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>
|
2004-10-22 Akim Demaille <akim@epita.fr>
|
||||||
and Paul Eggert <eggert@cs.ucla.edu>
|
and Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
|||||||
9
NEWS
9
NEWS
@@ -8,7 +8,14 @@ Changes in version 1.875e:
|
|||||||
initializing @$) from yyparse before parsing starts.
|
initializing @$) from yyparse before parsing starts.
|
||||||
|
|
||||||
* The option `--report=lookahead' was changed to `--report=look-ahead'.
|
* 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:
|
Changes in version 1.875d, 2004-05-21:
|
||||||
|
|
||||||
|
|||||||
37
data/glr.c
37
data/glr.c
@@ -425,8 +425,6 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
|
|||||||
the previous symbol: RHS[0] (always defined). */
|
the previous symbol: RHS[0] (always defined). */
|
||||||
|
|
||||||
]b4_location_if([[
|
]b4_location_if([[
|
||||||
#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
|
|
||||||
|
|
||||||
#ifndef YYLLOC_DEFAULT
|
#ifndef YYLLOC_DEFAULT
|
||||||
# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
|
# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \
|
||||||
do { \
|
do { \
|
||||||
@@ -614,6 +612,8 @@ union yyGLRStackItem {
|
|||||||
struct yyGLRStack {
|
struct yyGLRStack {
|
||||||
int yyerrflag;
|
int yyerrflag;
|
||||||
int yyerrState;
|
int yyerrState;
|
||||||
|
]b4_location_if([[ /* To compute the location of the error token, */
|
||||||
|
YYLTYPE yyerror_range[2];]])[
|
||||||
]b4_pure_if(
|
]b4_pure_if(
|
||||||
[
|
[
|
||||||
int yyerrcnt;
|
int yyerrcnt;
|
||||||
@@ -735,8 +735,9 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
|
|||||||
*yyvalp = yyval_default;
|
*yyvalp = yyval_default;
|
||||||
else
|
else
|
||||||
*yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
|
*yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
|
||||||
|
# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc)
|
||||||
YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
|
YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen);
|
||||||
|
# undef YYRHSLOC
|
||||||
]
|
]
|
||||||
switch (yyn)
|
switch (yyn)
|
||||||
{
|
{
|
||||||
@@ -1719,6 +1720,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
|
|||||||
while (yystack->yytops.yystates[0] != NULL)
|
while (yystack->yytops.yystates[0] != NULL)
|
||||||
{
|
{
|
||||||
yyGLRState *yys = yystack->yytops.yystates[0];
|
yyGLRState *yys = yystack->yytops.yystates[0];
|
||||||
|
]b4_location_if([[ yystack->yyerror_range[0] = yys->yyloc;]])[
|
||||||
yydestruct ("Error: popping",
|
yydestruct ("Error: popping",
|
||||||
yystos[yys->yylrState],
|
yystos[yys->yylrState],
|
||||||
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
|
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
|
||||||
@@ -1729,8 +1731,15 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
|
|||||||
yyFail (yystack][]b4_lpure_args[, NULL);
|
yyFail (yystack][]b4_lpure_args[, NULL);
|
||||||
}
|
}
|
||||||
if (*yytokenp != YYEMPTY)
|
if (*yytokenp != YYEMPTY)
|
||||||
yydestruct ("Error: discarding",
|
{]b4_location_if([[
|
||||||
*yytokenp, yylvalp]b4_location_if([, yyllocp])[);
|
/* 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: "));
|
YYDPRINTF ((stderr, "Reading a token: "));
|
||||||
yychar = YYLEX;
|
yychar = YYLEX;
|
||||||
*yytokenp = YYTRANSLATE (yychar);
|
*yytokenp = YYTRANSLATE (yychar);
|
||||||
@@ -1771,13 +1780,21 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
|
|||||||
if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
|
if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
|
||||||
&& yyisShiftAction (yytable[yyj]))
|
&& 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]],
|
YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
|
||||||
yylvalp, yyllocp);
|
yylvalp, &yyerrloc);
|
||||||
yyglrShift (yystack, 0, yytable[yyj],
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
]b4_location_if([[ yystack->yyerror_range[0] = yys->yyloc;]])[
|
||||||
yydestruct ("Error: popping",
|
yydestruct ("Error: popping",
|
||||||
yystos[yys->yylrState],
|
yystos[yys->yylrState],
|
||||||
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
|
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
|
||||||
@@ -1876,6 +1893,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
|
|||||||
yyrule = yydefaultAction (yystate);
|
yyrule = yydefaultAction (yystate);
|
||||||
if (yyrule == 0)
|
if (yyrule == 0)
|
||||||
{
|
{
|
||||||
|
]b4_location_if([[ yystack.yyerror_range[0] = *yyllocp;]])[
|
||||||
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
|
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
|
||||||
goto yyuser_error;
|
goto yyuser_error;
|
||||||
}
|
}
|
||||||
@@ -1906,6 +1924,8 @@ b4_syncline([@oline@], [@ofile@])])dnl
|
|||||||
}
|
}
|
||||||
else if (yyisErrorAction (yyaction))
|
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[);
|
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
|
||||||
goto yyuser_error;
|
goto yyuser_error;
|
||||||
}
|
}
|
||||||
@@ -1931,6 +1951,7 @@ b4_syncline([@oline@], [@ofile@])])dnl
|
|||||||
yyFail (&yystack][]b4_lpure_args[, "syntax error");
|
yyFail (&yystack][]b4_lpure_args[, "syntax error");
|
||||||
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
|
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
|
||||||
YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
|
YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
|
||||||
|
]b4_location_if([[ yystack.yyerror_range[0] = *yyllocp;]])[
|
||||||
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
|
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
|
||||||
goto yyuser_error;
|
goto yyuser_error;
|
||||||
}
|
}
|
||||||
@@ -2066,7 +2087,7 @@ b4_location_if([
|
|||||||
# define YYLTYPE_IS_TRIVIAL 1
|
# define YYLTYPE_IS_TRIVIAL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
b4_location_if([m4_if(b4_pure, [0],
|
b4_location_if([b4_pure_if([],
|
||||||
[extern YYLTYPE b4_prefix[]lloc;])
|
[extern YYLTYPE b4_prefix[]lloc;])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Checking GLR Parsing. -*- Autotest -*-
|
# 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
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -123,8 +123,7 @@ yylex (LEX_PARAMETERS)
|
|||||||
int c;
|
int c;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
static int lineNum = 1;
|
static int lineNum = 1;
|
||||||
static int colNum = 1;
|
static int colNum = 0;
|
||||||
|
|
||||||
|
|
||||||
#if YYPURE
|
#if YYPURE
|
||||||
# define yylloc (*llocp)
|
# define yylloc (*llocp)
|
||||||
@@ -139,14 +138,14 @@ yylex (LEX_PARAMETERS)
|
|||||||
case EOF:
|
case EOF:
|
||||||
return 0;
|
return 0;
|
||||||
case '\t':
|
case '\t':
|
||||||
colNum = 1 + ((colNum + 7) & ~7);
|
colNum = (colNum + 7) & ~7;
|
||||||
break;
|
break;
|
||||||
case ' ': case '\f':
|
case ' ': case '\f':
|
||||||
colNum += 1;
|
colNum += 1;
|
||||||
break;
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
lineNum += 1;
|
lineNum += 1;
|
||||||
colNum = 1;
|
colNum = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@@ -267,15 +266,15 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT],
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
|
m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
|
||||||
[[3.1-3.6: +(z,q)
|
[[3.0-3.5: +(z,q)
|
||||||
5.1-5.4: <declare>(T,x)
|
5.0-5.3: <declare>(T,x)
|
||||||
7.1-7.8: <init-declare>(T,x,y)
|
7.0-7.7: <init-declare>(T,x,y)
|
||||||
9.1-9.6: =(x,y)
|
9.0-9.5: =(x,y)
|
||||||
11.1-11.10: +(<cast>(x,T),y)
|
11.0-11.9: +(<cast>(x,T),y)
|
||||||
13.1-13.6: <declare>(T,x)
|
13.0-13.5: <declare>(T,x)
|
||||||
15.1-15.14: <init-declare>(T,y,+(z,q))
|
15.0-15.13: <init-declare>(T,y,+(z,q))
|
||||||
17.6-17.16: <error>
|
17.0-17.15: <error>
|
||||||
19.1-19.6: +(z,q)
|
19.0-19.5: +(z,q)
|
||||||
]])
|
]])
|
||||||
|
|
||||||
m4_define([_AT_AMBIG_GLR_OUTPUT],
|
m4_define([_AT_AMBIG_GLR_OUTPUT],
|
||||||
@@ -291,15 +290,15 @@ m4_define([_AT_AMBIG_GLR_OUTPUT],
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
|
m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
|
||||||
[[3.1-3.6: +(z,q)
|
[[3.0-3.5: +(z,q)
|
||||||
5.1-5.4: <declare>(T,x)
|
5.0-5.3: <declare>(T,x)
|
||||||
7.1-7.8: <init-declare>(T,x,y)
|
7.0-7.7: <init-declare>(T,x,y)
|
||||||
9.1-9.6: =(x,y)
|
9.0-9.5: =(x,y)
|
||||||
11.1-11.10: +(<cast>(x,T),y)
|
11.0-11.9: +(<cast>(x,T),y)
|
||||||
13.1-13.6: <OR>(<declare>(T,x),<cast>(x,T))
|
13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
|
||||||
15.1-15.14: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
|
15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
|
||||||
17.6-17.16: <error>
|
17.0-17.15: <error>
|
||||||
19.1-19.6: +(z,q)
|
19.0-19.5: +(z,q)
|
||||||
]])
|
]])
|
||||||
|
|
||||||
m4_define([_AT_GLR_STDERR],
|
m4_define([_AT_GLR_STDERR],
|
||||||
|
|||||||
Reference in New Issue
Block a user