mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
* data/glr.c (yyreportSyntaxError): Fix off-by-one error in
checking against YYLAST that caused the parser to miss a potential alternative in its diagnostic. Problem reported by Maria Jose Moron Fernandez in <http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00024.html>. * data/lalr1.cc (yysyntax_error_): Likewise. * data/yacc.c (yysyntax_error): Likewise. * tests/regression.at (_AT_DATA_DANCER_Y): Use static array for tokens, in case we run into an older C compiler. (_AT_DATA_EXPECT2_Y, AT_CHECK_EXPECT2): New macros. Use them to check for the off-by-one error fixed above.
This commit is contained in:
12
ChangeLog
12
ChangeLog
@@ -1,5 +1,17 @@
|
|||||||
2006-05-14 Paul Eggert <eggert@cs.ucla.edu>
|
2006-05-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
* data/glr.c (yyreportSyntaxError): Fix off-by-one error in
|
||||||
|
checking against YYLAST that caused the parser to miss a potential
|
||||||
|
alternative in its diagnostic.
|
||||||
|
Problem reported by Maria Jose Moron Fernandez in
|
||||||
|
<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00024.html>.
|
||||||
|
* data/lalr1.cc (yysyntax_error_): Likewise.
|
||||||
|
* data/yacc.c (yysyntax_error): Likewise.
|
||||||
|
* tests/regression.at (_AT_DATA_DANCER_Y): Use static array for
|
||||||
|
tokens, in case we run into an older C compiler.
|
||||||
|
(_AT_DATA_EXPECT2_Y, AT_CHECK_EXPECT2): New macros.
|
||||||
|
Use them to check for the off-by-one error fixed above.
|
||||||
|
|
||||||
* data/yacc.c (yytnamerr): Fix typo: local var should be of type
|
* data/yacc.c (yytnamerr): Fix typo: local var should be of type
|
||||||
YYSIZE_T, not size_t.
|
YYSIZE_T, not size_t.
|
||||||
* tests/regression.at (Trivial grammars): New test, to catch
|
* tests/regression.at (Trivial grammars): New test, to catch
|
||||||
|
|||||||
@@ -2077,7 +2077,7 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
|
|||||||
#if YYERROR_VERBOSE
|
#if YYERROR_VERBOSE
|
||||||
int yyn;
|
int yyn;
|
||||||
yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
|
yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
|
||||||
if (YYPACT_NINF < yyn && yyn < YYLAST)
|
if (YYPACT_NINF < yyn && yyn <= YYLAST)
|
||||||
{
|
{
|
||||||
yySymbol yytoken = YYTRANSLATE (yychar);
|
yySymbol yytoken = YYTRANSLATE (yychar);
|
||||||
size_t yysize0 = yytnamerr (NULL, yytokenName (yytoken));
|
size_t yysize0 = yytnamerr (NULL, yytokenName (yytoken));
|
||||||
@@ -2104,7 +2104,7 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
|
|||||||
int yyxbegin = 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 + 1;
|
||||||
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
||||||
int yycount = 1;
|
int yycount = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -838,14 +838,14 @@ b4_error_verbose_if([, int tok])[)
|
|||||||
YYUSE (yystate);
|
YYUSE (yystate);
|
||||||
#if YYERROR_VERBOSE
|
#if YYERROR_VERBOSE
|
||||||
int yyn = yypact_[yystate];
|
int yyn = yypact_[yystate];
|
||||||
if (yypact_ninf_ < yyn && yyn < yylast_)
|
if (yypact_ninf_ < yyn && yyn <= yylast_)
|
||||||
{
|
{
|
||||||
/* 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 yyxbegin = 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 + 1;
|
||||||
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
|
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (int x = yyxbegin; x < yyxend; ++x)
|
for (int x = yyxbegin; x < yyxend; ++x)
|
||||||
|
|||||||
@@ -847,7 +847,7 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
|
|||||||
{
|
{
|
||||||
int yyn = yypact[yystate];
|
int yyn = yypact[yystate];
|
||||||
|
|
||||||
if (! (YYPACT_NINF < yyn && yyn < YYLAST))
|
if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -885,7 +885,7 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
|
|||||||
int yyxbegin = 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 + 1;
|
||||||
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
||||||
int yycount = 1;
|
int yycount = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -824,7 +824,7 @@ static int
|
|||||||
yylex (AT_LALR1_CC_IF([int *lval], [void]))
|
yylex (AT_LALR1_CC_IF([int *lval], [void]))
|
||||||
[{
|
[{
|
||||||
static int toknum = 0;
|
static int toknum = 0;
|
||||||
int tokens[] =
|
static int tokens[] =
|
||||||
{
|
{
|
||||||
':', -1
|
':', -1
|
||||||
};
|
};
|
||||||
@@ -864,3 +864,100 @@ AT_CLEANUP
|
|||||||
AT_CHECK_DANCER()
|
AT_CHECK_DANCER()
|
||||||
AT_CHECK_DANCER([%glr-parser])
|
AT_CHECK_DANCER([%glr-parser])
|
||||||
AT_CHECK_DANCER([%skeleton "lalr1.cc"])
|
AT_CHECK_DANCER([%skeleton "lalr1.cc"])
|
||||||
|
|
||||||
|
|
||||||
|
## ------------------------------------------ ##
|
||||||
|
## Diagnostic that expects two alternatives. ##
|
||||||
|
## ------------------------------------------ ##
|
||||||
|
|
||||||
|
|
||||||
|
# _AT_DATA_EXPECT2_Y(BISON-OPTIONS)
|
||||||
|
# --------------------------------
|
||||||
|
m4_define([_AT_DATA_EXPECT2_Y],
|
||||||
|
[AT_DATA_GRAMMAR([expect2.y],
|
||||||
|
[%{
|
||||||
|
static int yylex (AT_LALR1_CC_IF([int *], [void]));
|
||||||
|
AT_LALR1_CC_IF([],
|
||||||
|
[#include <stdio.h>
|
||||||
|
static void yyerror (const char *);])
|
||||||
|
%}
|
||||||
|
$1
|
||||||
|
%defines
|
||||||
|
%error-verbose
|
||||||
|
%token A 1000
|
||||||
|
%token B
|
||||||
|
|
||||||
|
%%
|
||||||
|
program: /* empty */
|
||||||
|
| program e ';'
|
||||||
|
| program error ';';
|
||||||
|
|
||||||
|
e: e '+' t | t;
|
||||||
|
t: A | B;
|
||||||
|
|
||||||
|
%%
|
||||||
|
AT_LALR1_CC_IF(
|
||||||
|
[/* A C++ error reporting function. */
|
||||||
|
void
|
||||||
|
yy::parser::error (const location&, const std::string& m)
|
||||||
|
{
|
||||||
|
std::cerr << m << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
yyparse ()
|
||||||
|
{
|
||||||
|
yy::parser parser;
|
||||||
|
return parser.parse ();
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[static void
|
||||||
|
yyerror (const char *s)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s\n", s);
|
||||||
|
}])
|
||||||
|
|
||||||
|
static int
|
||||||
|
yylex (AT_LALR1_CC_IF([int *lval], [void]))
|
||||||
|
[{
|
||||||
|
static int toknum = 0;
|
||||||
|
static int tokens[] =
|
||||||
|
{
|
||||||
|
1000, '+', '+', -1
|
||||||
|
};
|
||||||
|
]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
|
||||||
|
return tokens[toknum++];
|
||||||
|
}]
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
return yyparse ();
|
||||||
|
}
|
||||||
|
])
|
||||||
|
])# _AT_DATA_EXPECT2_Y
|
||||||
|
|
||||||
|
|
||||||
|
# AT_CHECK_EXPECT2(BISON-OPTIONS)
|
||||||
|
# ------------------------------
|
||||||
|
# Generate the grammar, compile it, run it.
|
||||||
|
m4_define([AT_CHECK_EXPECT2],
|
||||||
|
[AT_SETUP([Expecting two tokens $1])
|
||||||
|
AT_BISON_OPTION_PUSHDEFS([$1])
|
||||||
|
_AT_DATA_EXPECT2_Y([$1])
|
||||||
|
AT_CHECK([bison -o expect2.c expect2.y])
|
||||||
|
AT_LALR1_CC_IF(
|
||||||
|
[AT_CHECK([bison -o expect2.cc expect2.y])
|
||||||
|
AT_COMPILE_CXX([expect2])],
|
||||||
|
[AT_CHECK([bison -o expect2.c expect2.y])
|
||||||
|
AT_COMPILE([expect2])])
|
||||||
|
AT_PARSER_CHECK([./expect2], 1, [],
|
||||||
|
[syntax error, unexpected '+', expecting A or B
|
||||||
|
])
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
AT_CLEANUP
|
||||||
|
])
|
||||||
|
|
||||||
|
AT_CHECK_EXPECT2()
|
||||||
|
AT_CHECK_EXPECT2([%glr-parser])
|
||||||
|
AT_CHECK_EXPECT2([%skeleton "lalr1.cc"])
|
||||||
|
|||||||
Reference in New Issue
Block a user