* data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to

generate verbose error messages.
Use the number of tokens as an upper bound in yytname, as it
cannot be a non terminal.
This commit is contained in:
Akim Demaille
2003-03-02 13:39:44 +00:00
parent d5286af19b
commit c47495657b
4 changed files with 37 additions and 28 deletions

View File

@@ -1,3 +1,10 @@
2003-03-02 Akim Demaille <akim@epita.fr>
* data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to
generate verbose error messages.
Use the number of tokens as an upper bound in yytname, as it
cannot be a non terminal.
2003-03-02 Akim Demaille <akim@epita.fr> 2003-03-02 Akim Demaille <akim@epita.fr>
* tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error * tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error

View File

@@ -613,14 +613,14 @@ yytokenName (yySymbol yytoken)
/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
* at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred
* containing the pointer to the next state in the chain. Assumes * containing the pointer to the next state in the chain. Assumes
* YYLOW1 < YYLOW0. For convenience, returns YYLOW1. */ * YYLOW1 < YYLOW0. For convenience, returns YYLOW1. */
static int static int
yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1) yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1)
{ {
yyGLRState* s; yyGLRState* s;
int i; int i;
s = yyvsp[yylow0].yystate.yypred; s = yyvsp[yylow0].yystate.yypred;
for (i = yylow0-1; i >= yylow1; i -= 1) for (i = yylow0-1; i >= yylow1; i -= 1)
{ {
if (! s->yyresolved) if (! s->yyresolved)
@@ -1022,7 +1022,7 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn,
} }
/** Shift stack #K of YYSTACK, to a new state corresponding to LR /** Shift stack #K of YYSTACK, to a new state corresponding to LR
* state YYLRSTATE, at input position YYPOSN, with the (unresolved) * state YYLRSTATE, at input position YYPOSN, with the (unresolved)
* semantic value of YYRHS under the action for YYRULE. */ * semantic value of YYRHS under the action for YYRULE. */
static inline void static inline void
yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
@@ -1597,29 +1597,28 @@ yyreportSyntaxError (yyGLRStack* yystack,
#if YYERROR_VERBOSE #if YYERROR_VERBOSE
yySymbol* const yytokenp = yystack->yytokenp; yySymbol* const yytokenp = yystack->yytokenp;
int yyn; int yyn;
const char* yyprefix;
yyn = yypact[yystack->yytops.yystates[0]->yylrState]; yyn = yypact[yystack->yytops.yystates[0]->yylrState];
if (YYPACT_NINF < yyn && yyn < YYLAST) if (YYPACT_NINF < yyn && yyn < YYLAST)
{ {
size_t yysize = 0; size_t yysize = 0;
const char* yyprefix;
char* yymsg; char* yymsg;
int yyx; int yyx;
/* Start YYX at -YYN if negative to avoid negative indexes in /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */ YYCHECK. */
int yyxbase = yyn < 0 ? -yyn : 0; int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */ /* Stay within bounds of both yycheck and yytname. */
int yychecklim = YYLAST - yyn; int yychecklim = YYLAST - yyn;
int yynsyms = sizeof (yytname) / sizeof (yytname[0]); int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yyxlim = yychecklim < yynsyms ? yychecklim : yynsyms;
int yycount = 0; int yycount = 0;
yyprefix = ", expecting "; yyprefix = ", expecting ";
for (yyx = yyxbase; yyx < yyxlim && yycount < 5; yyx += 1) for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{ {
yysize += strlen (yytokenName (yyx)) + strlen (yyprefix); yysize += strlen (yyprefix) + strlen (yytokenName (yyx));
yycount += 1; yycount += 1;
if (yycount == 5) if (yycount == 5)
{ {
@@ -1640,7 +1639,7 @@ yyreportSyntaxError (yyGLRStack* yystack,
if (yycount < 5) if (yycount < 5)
{ {
yyprefix = ", expecting "; yyprefix = ", expecting ";
for (yyx = yyxbase; yyx < yyxlim; yyx += 1) for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{ {
sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));

View File

@@ -498,13 +498,19 @@ b4_syncline([@oline@], [@ofile@])[
message += name_[ilooka_]; message += name_[ilooka_];
{ {
int count = 0; int count = 0;
for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */
int xbegin = n_ < 0 ? -n_ : 0;
/* Stay within bounds of both yycheck and yytname. */
int checklim = last_ - n_;
int xend = checklim < ntokens_ ? checklim : ntokens_;
for (int x = xbegin; x < xend; ++x)
if (check_[x + n_] == x && x != terror_) if (check_[x + n_] == x && x != terror_)
++count; ++count;
if (count < 5) if (count < 5)
{ {
count = 0; count = 0;
for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) for (int x = xbegin; x < xend; ++x)
if (check_[x + n_] == x && x != terror_) if (check_[x + n_] == x && x != terror_)
{ {
message += (!count++) ? ", expecting " : " or "; message += (!count++) ? ", expecting " : " or ";

View File

@@ -1038,32 +1038,30 @@ yyerrlab:
{ {
YYSIZE_T yysize = 0; YYSIZE_T yysize = 0;
int yytype = YYTRANSLATE (yychar); int yytype = YYTRANSLATE (yychar);
const char* yyprefix;
char *yymsg; char *yymsg;
int yyx; int yyx;
/* Start YYX at -YYN if negative to avoid negative indexes in /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */ YYCHECK. */
int yyxbase = yyn < 0 ? -yyn : 0; int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */ /* Stay within bounds of both yycheck and yytname. */
int yychecklim = YYLAST - yyn; int yychecklim = YYLAST - yyn;
int yynsyms = sizeof (yytname) / sizeof (yytname[0]); int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yyxlim = yychecklim < yynsyms ? yychecklim : yynsyms;
int yycount = 0; int yycount = 0;
for (yyx = yyxbase; yyx < yyxlim; yyx++) yyprefix = ", expecting ";
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{ {
yysize += (! yycount yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
? sizeof (", expecting ") - 1 yycount += 1;
: sizeof (" or ") - 1);
yysize += yystrlen (yytname[yyx]);
yycount++;
if (yycount == 5) if (yycount == 5)
{ {
yysize = 0; yysize = 0;
break; break;
} }
} }
yysize += (sizeof ("syntax error, unexpected ") yysize += (sizeof ("syntax error, unexpected ")
+ yystrlen (yytname[yytype])); + yystrlen (yytname[yytype]));
@@ -1075,14 +1073,13 @@ yyerrlab:
if (yycount < 5) if (yycount < 5)
{ {
yycount = 0; yyprefix = ", expecting ";
for (yyx = yyxbase; yyx < yyxlim; yyx++) for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{ {
const char *yyq = ! yycount ? ", expecting " : " or "; yyp = yystpcpy (yyp, yyprefix);
yyp = yystpcpy (yyp, yyq);
yyp = yystpcpy (yyp, yytname[yyx]); yyp = yystpcpy (yyp, yytname[yyx]);
yycount++; yyprefix = " or ";
} }
} }
yyerror (]b4_yyerror_args[yymsg); yyerror (]b4_yyerror_args[yymsg);