]> git.saurik.com Git - bison.git/commitdiff
List accepted values for a %define enum variable with an invalid value.
authorJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 24 Apr 2009 05:42:58 +0000 (01:42 -0400)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 24 Apr 2009 06:47:22 +0000 (02:47 -0400)
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.

ChangeLog
data/bison.m4
src/muscle_tab.c
tests/input.at

index 741691305bd45a552c723fbe7e687f25bfbd8210..508c955e672f3a637e81718572e7d931021708de 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        Rename "default rule" to "default reduction".
index f9dd503d74a23446f6257f5f39ae64013b68cc44..00a42e21fe4e3de9035275dc641fc3fd5df48c1e 100644 (file)
@@ -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])])])
 
index 0265e45a7b69f3469b00eb46a745c1518cee3ba4..8e2a3e2d86107a4ed2269f72b5bb4d32a85b8193 100644 (file)
@@ -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);
     }
 }
 
index 9fa8af7233907a10e2b3486681f2bab0b68a44ea..6c56e2fce63453be74aa6c181fd083464935e807 100644 (file)
@@ -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