[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Implement %define lr.default_rules.
From: |
Joel E. Denny |
Subject: |
Re: [PATCH] Implement %define lr.default_rules. |
Date: |
Fri, 24 Apr 2009 02:57:52 -0400 (EDT) |
On Tue, 21 Apr 2009, Joel E. Denny wrote:
> On Tue, 21 Apr 2009, Akim Demaille wrote:
>
> > Le 20 avr. 09 ? 07:48, Joel E. Denny a ?crit :
> > > +AT_BISON_CHECK([[input.y]], [[1]], [[]],
> > > +[[input.y:1.9-24: invalid value for %define variable `lr.default_rules':
> > > `bogus'
> > > +]])
> >
> > It should be easy to report the set of valid values too. Sort of
> > unexpected/expected :)
>
> I agree. I'll try to work on that.
I pushed the following to branch-2.5 and master to implement it.
From 25029e164a3b2385ae6d95ca4cd19bad36550c92 Mon Sep 17 00:00:00 2001
From: Joel E. Denny <address@hidden>
Date: Fri, 24 Apr 2009 01:42:58 -0400
Subject: [PATCH] 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.
diff --git a/data/bison.m4 b/data/bison.m4
index f9dd503..00a42e2 100644
--- a/data/bison.m4
+++ b/data/bison.m4
@@ -499,7 +499,11 @@ m4_define([_b4_percent_define_check_values],
[b4_complain_at(b4_percent_define_get_loc([$1]),
[[invalid value for %%define variable `%s': `%s']],
[$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])],
[b4_fatal([[undefined %%define variable `%s' passed to
b4_percent_define_check_values]], [$1])])])
diff --git a/src/muscle_tab.c b/src/muscle_tab.c
index 0265e45..8e2a3e2 100644
--- a/src/muscle_tab.c
+++ b/src/muscle_tab.c
@@ -553,35 +553,40 @@ muscle_percent_define_check_values (char const * const
*values)
{
for (; *values; ++values)
{
- char const *variable = *values;
+ char const * const *variablep = values;
char const *name;
char *value;
- MUSCLE_USER_NAME_CONVERT (name, "percent_define(", variable, ")");
+ MUSCLE_USER_NAME_CONVERT (name, "percent_define(", *variablep, ")");
value = muscle_string_decode (name);
if (value)
{
- bool valid = false;
for (++values; *values; ++values)
{
if (0 == strcmp (value, *values))
- {
- valid = true;
- while (*values)
- ++values;
- break;
- }
+ break;
+ }
+ if (!*values)
+ {
+ 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);
}
else
- fatal(_("undefined %%define variable `%s' passed to
muscle_percent_define_check_values"),
- variable);
+ fatal(_("undefined %%define variable `%s' passed to"
+ " muscle_percent_define_check_values"),
+ *variablep);
}
}
diff --git a/tests/input.at b/tests/input.at
index 9fa8af7..6c56e2f 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -867,38 +867,36 @@ AT_BISON_CHECK([[Input.y]], [1], [],
AT_CLEANUP
-## ---------------------------------------------- ##
-## %define lr.default_reductions invalid values. ##
-## ---------------------------------------------- ##
+## ------------------------ ##
+## %define enum variables. ##
+## ------------------------ ##
-AT_SETUP([[%define lr.default_reductions invalid values]])
+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'
]])
-AT_CLEANUP
-
-## ------------------------ ##
-## %define enum variables. ##
-## ------------------------ ##
-
-AT_SETUP([[%define enum variables]])
-
+# Back-end.
AT_DATA([[input.y]],
[[%define api.push_pull "neither"
%%
start: ;
]])
-
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: accepted value: `pull'
+input.y:1.9-21: accepted value: `push'
+input.y:1.9-21: accepted value: `both'
]])
AT_CLEANUP
--
1.5.4.3