* 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

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