More fixes related to last two patches.

* data/c.m4 (b4_table_value_equals): Comment that YYID must be
defined.
* data/glr.c, data/lalr1.cc, data/lalr1.java, data/yacc.c: Fix
yytable comments: zero indicates syntax error not default
action.
* data/glr.c (yyis_pact_ninf): Rename to...
(yypact_value_is_default): ... this.
(yyisDefaultedState): Update for rename.
(yyis_table_ninf): Rename to...
(yytable_value_is_error): ... this, and check for value zero
besides just YYTABLE_NINF.
(yygetLRActions): Check for default value from yypact.  It
appears that this check is always performed before this function
is invoked, and so adding the check here is probably redundant.
However, the code may evolve after this subtlety is forgotten.
Also, update for rename to yytable_value_is_error.  Because that
macro now checks for zero, a different but equivalent branch of
the if-then-else here is evaluated.
(yyreportSyntaxError): Update for rename to
yytable_value_is_error.  The zero condition was mishandled
before.
(yyrecoverSyntaxError): Update for renames.  No behavioral
changes.
* data/lalr1.cc, data/lalr1.java (yy_pact_value_is_default_):
New function.
(yy_table_value_is_error_): New function.
(parse): Use new functions where possible.  No behavioral
changes.
(yysyntax_error_, yysyntax_error): Use yy_table_value_is_error_.
The zero condition was mishandled before.
* data/yacc.c (yyis_pact_ninf): Rename to...
(yypact_value_is_default): ... this.
(yyis_table_ninf): Rename to...
(yytable_value_is_error): ... this, and check for value zero
besides just YYTABLE_NINF.
(yysyntax_error): Update for rename to yytable_value_is_error.
The zero condition was mishandled before.
(yyparse): Update for renames.  No behavioral changes.
* src/tables.h: Improve comments about yypact, yytable, etc.
more.  Most importantly, say yytable value of zero means syntax
error not default action.
(cherry picked from commit f2b30bdf37)

Conflicts:

	data/bison.m4
	data/lalr1.cc
	data/lalr1.java
	data/yacc.c
	src/parse-gram.c
	src/parse-gram.h
This commit is contained in:
Joel E. Denny
2009-08-25 19:41:49 -04:00
parent 1fa303077d
commit d5eb0826af
9 changed files with 162 additions and 73 deletions

View File

@@ -138,7 +138,8 @@ m4_define([b4_int_type_for],
# --------------------------------------------
# Without inducing a comparison warning from the compiler, check if the
# literal value LITERAL equals VALUE from table TABLE, which must have
# TABLE_min and TABLE_max defined.
# TABLE_min and TABLE_max defined. YYID must be defined as an identity
# function that suppresses warnings about constant conditions.
m4_define([b4_table_value_equals],
[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
|| m4_indir([b4_]$1[_max]) < $3), [1],

View File

@@ -442,8 +442,7 @@ static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
number is the opposite. If zero or YYTABLE_NINF, syntax error. */
#define YYTABLE_NINF ]b4_table_ninf[
static const ]b4_int_type_for([b4_table])[ yytable[] =
{
@@ -1013,7 +1012,7 @@ yylhsNonterm (yyRuleNum yyrule)
return yyr1[yyrule];
}
#define yyis_pact_ninf(yystate) \
#define yypact_value_is_default(yystate) \
]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[
/** True iff LR state STATE has only a default reduction (regardless
@@ -1021,7 +1020,7 @@ yylhsNonterm (yyRuleNum yyrule)
static inline yybool
yyisDefaultedState (yyStateNum yystate)
{
return yyis_pact_ninf (yypact[yystate]);
return yypact_value_is_default (yypact[yystate]);
}
/** The default reduction for STATE, assuming it has one. */
@@ -1031,8 +1030,9 @@ yydefaultAction (yyStateNum yystate)
return yydefact[yystate];
}
#define yyis_table_ninf(yytable_value) \
]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[
#define yytable_value_is_error(yytable_value) \
(]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[ \
|| ]b4_table_value_equals([[table]], [[yytable_value]], [[0]])[)
/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
* Result R means
@@ -1047,12 +1047,13 @@ yygetLRActions (yyStateNum yystate, int yytoken,
int* yyaction, const short int** yyconflicts)
{
int yyindex = yypact[yystate] + yytoken;
if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
if (yypact_value_is_default (yypact[yystate])
|| yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
{
*yyaction = -yydefact[yystate];
*yyconflicts = yyconfl;
}
else if (! yyis_table_ninf (yytable[yyindex]))
else if (! yytable_value_is_error (yytable[yyindex]))
{
*yyaction = yytable[yyindex];
*yyconflicts = yyconfl + yyconflp[yyindex];
@@ -2129,7 +2130,7 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
&& !yyis_table_ninf (yytable[yyx + yyn]))
&& !yytable_value_is_error (yytable[yyx + yyn]))
{
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{
@@ -2230,7 +2231,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
if (yyis_pact_ninf (yyj))
if (yypact_value_is_default (yyj))
return;
yyj += yytoken;
if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
@@ -2238,7 +2239,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0)
return;
}
else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj]))
else if (! yytable_value_is_error (yytable[yyj]))
return;
}
@@ -2259,7 +2260,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{
yyGLRState *yys = yystackp->yytops.yystates[0];
yyj = yypact[yys->yylrState];
if (! yyis_pact_ninf (yyj))
if (! yypact_value_is_default (yyj))
{
yyj += YYTERROR;
if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR

View File

@@ -190,6 +190,14 @@ b4_error_verbose_if([, int tok])[);
/// The location stack.
location_stack_type yylocation_stack_;
/// Whether the given \c yypact_ value indicates a defaulted state.
/// \param yyvalue the value to check
static bool yy_pact_value_is_default_ (int yyvalue);
/// Whether the given \c yytable_ value indicates a syntax error.
/// \param yyvalue the value to check
static bool yy_table_value_is_error_ (int yyvalue);
/// Internal symbol numbers.
typedef ]b4_int_type_for([b4_translate])[ token_number_type;
/* Tables. */
@@ -518,6 +526,18 @@ do { \
}
#endif
inline bool
]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
{
return yyvalue == yypact_ninf_;
}
inline bool
]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
{
return yyvalue == 0 || yyvalue == yytable_ninf_;
}
int
]b4_parser_class_name[::parse ()
{
@@ -584,7 +604,7 @@ m4_popdef([b4_at_dollar])])dnl
/* Try to take a decision without lookahead. */
yyn = yypact_[yystate];
if (yyn == yypact_ninf_)
if (yy_pact_value_is_default_ (yyn))
goto yydefault;
/* Read a lookahead token. */
@@ -620,8 +640,8 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
yyn = yytable_[yyn];
if (yyn <= 0)
{
if (yyn == 0 || yyn == yytable_ninf_)
goto yyerrlab;
if (yy_table_value_is_error_ (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
@@ -762,7 +782,7 @@ b4_error_verbose_if([, yytoken])[));
for (;;)
{
yyn = yypact_[yystate];
if (yyn != yypact_ninf_)
if (!yy_pact_value_is_default_ (yyn))
{
yyn += yyterror_;
if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
@@ -851,7 +871,7 @@ b4_error_verbose_if([, int tok])[)
int count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_
&& yytable_[x + yyn] != yytable_ninf_)
&& !yy_table_value_is_error_ (yytable_[x + yyn]))
++count;
// FIXME: This method of building the message is not compatible
@@ -869,7 +889,7 @@ b4_error_verbose_if([, int tok])[)
count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_
&& yytable_[x + yyn] != yytable_ninf_)
&& !yy_table_value_is_error_ (yytable_[x + yyn]))
{
res += (!count++) ? ", expecting " : " or ";
res += yytnamerr_ (yytname_[x]);
@@ -917,7 +937,8 @@ b4_error_verbose_if([, int tok])[)
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says. */
number is the opposite. If zero or YYTABLE_NINF_, syntax
error. */
const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
const ]b4_int_type_for([b4_table])[
]b4_parser_class_name[::yytable_[] =

View File

@@ -489,7 +489,7 @@ m4_popdef([b4_at_dollar])])dnl
/* Take a decision. First try without lookahead. */
yyn = yypact_[yystate];
if (yyn == yypact_ninf_)
if (yy_pact_value_is_default_ (yyn))
{
label = YYDEFAULT;
break;
@@ -528,7 +528,7 @@ m4_popdef([b4_at_dollar])])dnl
/* <= 0 means reduce or error. */
else if ((yyn = yytable_[yyn]) <= 0)
{
if (yyn == 0 || yyn == yytable_ninf_)
if (yy_table_value_is_error_ (yyn))
label = YYFAIL;
else
{
@@ -632,7 +632,7 @@ m4_popdef([b4_at_dollar])])dnl
for (;;)
{
yyn = yypact_[yystate];
if (yyn != yypact_ninf_)
if (!yy_pact_value_is_default_ (yyn))
{
yyn += yyterror_;
if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
@@ -701,7 +701,7 @@ m4_popdef([b4_at_dollar])])dnl
int count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_
&& yycheck_[x + yyn] != yytable_ninf_)
&& !yy_table_value_is_error_ (yycheck_[x + yyn]))
++count;
// FIXME: This method of building the message is not compatible
@@ -713,7 +713,7 @@ m4_popdef([b4_at_dollar])])dnl
count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_
&& yycheck_[x + yyn] != yytable_ninf_)
&& !yy_table_value_is_error_ (yycheck_[x + yyn]))
{
res.append (count++ == 0 ? ", expecting " : " or ");
res.append (yytnamerr_ (yytname_[x]));
@@ -726,6 +726,23 @@ m4_popdef([b4_at_dollar])])dnl
return "syntax error";
}
/**
* Whether the given <code>yypact_</code> value indicates a defaulted state.
* @@param yyvalue the value to check
*/
private static boolean yy_pact_value_is_default_ (int yyvalue)
{
return yyvalue == yypact_ninf_;
}
/**
* Whether the given <code>yytable_</code> value indicates a syntax error.
* @@param yyvalue the value to check
*/
private static boolean yy_table_value_is_error_ (int yyvalue)
{
return yyvalue == 0 || yyvalue == yytable_ninf_;
}
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
@@ -758,7 +775,7 @@ m4_popdef([b4_at_dollar])])dnl
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says. */
number is the opposite. If zero or YYTABLE_NINF_, syntax error. */
private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
private static final ]b4_int_type_for([b4_table])[
yytable_[] =

View File

@@ -578,19 +578,19 @@ static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
number is the opposite. If zero or YYTABLE_NINF, syntax error. */
#define YYTABLE_NINF ]b4_table_ninf[
static const ]b4_int_type_for([b4_table])[ yytable[] =
{
]b4_table[
};
#define yyis_pact_ninf(yystate) \
#define yypact_value_is_default(yystate) \
]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[
#define yyis_table_ninf(yytable_value) \
]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[
#define yytable_value_is_error(yytable_value) \
(]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[ \
|| ]b4_table_value_equals([[table]], [[yytable_value]], [[0]])[)
static const ]b4_int_type_for([b4_check])[ yycheck[] =
{
@@ -954,7 +954,7 @@ yysyntax_error (char *yyresult, int yystate, int yychar)
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
&& !yyis_table_ninf (yytable[yyx + yyn]))
&& !yytable_value_is_error (yytable[yyx + yyn]))
{
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{
@@ -1355,7 +1355,7 @@ yybackup:
/* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate];
if (yyis_pact_ninf (yyn))
if (yypact_value_is_default (yyn))
goto yydefault;
/* Not known => get a lookahead token if don't already have one. */
@@ -1405,7 +1405,7 @@ yyread_pushed_token:]])[
yyn = yytable[yyn];
if (yyn <= 0)
{
if (yyn == 0 || yyis_table_ninf (yyn))
if (yytable_value_is_error (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
@@ -1589,7 +1589,7 @@ yyerrlab1:
for (;;)
{
yyn = yypact[yystate];
if (!yyis_pact_ninf (yyn))
if (!yypact_value_is_default (yyn))
{
yyn += YYTERROR;
if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)