bison-patches
[Top][All Lists]
Advanced

[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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]