List accepted values for a %define enum variable with an invalid value.

Suggested by Akim Demaille at
<http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00082.html>.
* data/bison.m4 (_b4_percent_define_check_values): Implement.
* src/muscle-tab.c (muscle_percent_define_check_values): Implement.
* tests/input.at (%define lr.default_reductions invalid values): Merge
into...
(%define enum variables): ... here, and update output.
(cherry picked from commit 25029e164a)
This commit is contained in:
Joel E. Denny
2009-04-24 01:42:58 -04:00
parent 110ef36a1a
commit f49097730e
4 changed files with 53 additions and 35 deletions

View File

@@ -1,3 +1,14 @@
2009-04-24 Joel E. Denny <jdenny@ces.clemson.edu>
List accepted values for a %define enum variable with an invalid value.
Suggested by Akim Demaille at
<http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00082.html>.
* data/bison.m4 (_b4_percent_define_check_values): Implement.
* src/muscle-tab.c (muscle_percent_define_check_values): Implement.
* tests/input.at (%define lr.default_reductions invalid values): Merge
into...
(%define enum variables): ... here, and update output.
2009-04-23 Joel E. Denny <jdenny@ces.clemson.edu> 2009-04-23 Joel E. Denny <jdenny@ces.clemson.edu>
Rename "default rule" to "default reduction". Rename "default rule" to "default reduction".

View File

@@ -724,7 +724,11 @@ m4_define([_b4_percent_define_check_values],
[b4_complain_at(b4_percent_define_get_loc([$1]), [b4_complain_at(b4_percent_define_get_loc([$1]),
[[invalid value for %%define variable `%s': `%s']], [[invalid value for %%define variable `%s': `%s']],
[$1], [$1],
m4_dquote(m4_indir([b4_percent_define(]$1[)])))])dnl m4_dquote(m4_indir([b4_percent_define(]$1[)])))
m4_foreach([b4_value], m4_dquote(m4_shift($@)),
[b4_complain_at(b4_percent_define_get_loc([$1]),
[[accepted value: `%s']],
m4_dquote(b4_value))])])dnl
m4_popdef([b4_good_value])], m4_popdef([b4_good_value])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])]) [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])])

View File

@@ -575,35 +575,40 @@ muscle_percent_define_check_values (char const * const *values)
{ {
for (; *values; ++values) for (; *values; ++values)
{ {
char const *variable = *values; char const * const *variablep = values;
char const *name; char const *name;
char *value; char *value;
MUSCLE_USER_NAME_CONVERT (name, "percent_define(", variable, ")"); MUSCLE_USER_NAME_CONVERT (name, "percent_define(", *variablep, ")");
value = muscle_string_decode (name); value = muscle_string_decode (name);
if (value) if (value)
{ {
bool valid = false;
for (++values; *values; ++values) for (++values; *values; ++values)
{ {
if (0 == strcmp (value, *values)) if (0 == strcmp (value, *values))
{ break;
valid = true; }
while (*values) if (!*values)
++values; {
break; location loc = muscle_percent_define_get_loc (*variablep);
} complain_at(loc,
_("invalid value for %%define variable `%s': `%s'"),
*variablep, value);
for (values = variablep + 1; *values; ++values)
complain_at (loc, _("accepted value: `%s'"), *values);
}
else
{
while (*values)
++values;
} }
if (!valid)
complain_at(muscle_percent_define_get_loc (variable),
_("invalid value for %%define variable `%s': `%s'"),
variable, value);
free (value); free (value);
} }
else else
fatal(_("undefined %%define variable `%s' passed to muscle_percent_define_check_values"), fatal(_("undefined %%define variable `%s' passed to"
variable); " muscle_percent_define_check_values"),
*variablep);
} }
} }

View File

@@ -921,38 +921,36 @@ AT_BISON_CHECK([[Input.y]], [1], [],
AT_CLEANUP AT_CLEANUP
## ---------------------------------------------- ##
## %define lr.default_reductions invalid values. ##
## ---------------------------------------------- ##
AT_SETUP([[%define lr.default_reductions invalid values]])
AT_DATA([[input.y]],
[[%define lr.default_reductions "bogus"
%%
start: ;
]])
AT_BISON_CHECK([[input.y]], [[1]], [[]],
[[input.y:1.9-29: invalid value for %define variable `lr.default_reductions': `bogus'
]])
AT_CLEANUP
## ------------------------ ## ## ------------------------ ##
## %define enum variables. ## ## %define enum variables. ##
## ------------------------ ## ## ------------------------ ##
AT_SETUP([[%define enum variables]]) AT_SETUP([[%define enum variables]])
# Front-end.
AT_DATA([[input.y]],
[[%define lr.default_reductions "bogus"
%%
start: ;
]])
AT_BISON_CHECK([[input.y]], [[1]], [[]],
[[input.y:1.9-29: invalid value for %define variable `lr.default_reductions': `bogus'
input.y:1.9-29: accepted value: `all'
input.y:1.9-29: accepted value: `consistent'
input.y:1.9-29: accepted value: `accepting'
]])
# Back-end.
AT_DATA([[input.y]], AT_DATA([[input.y]],
[[%define api.push_pull "neither" [[%define api.push_pull "neither"
%% %%
start: ; start: ;
]]) ]])
AT_BISON_CHECK([[input.y]], [1], [], AT_BISON_CHECK([[input.y]], [1], [],
[[input.y:1.9-21: invalid value for %define variable `api.push_pull': `neither' [[input.y:1.9-21: invalid value for %define variable `api.push_pull': `neither'
input.y:1.9-21: accepted value: `pull'
input.y:1.9-21: accepted value: `push'
input.y:1.9-21: accepted value: `both'
]]) ]])
AT_CLEANUP AT_CLEANUP