]> git.saurik.com Git - bison.git/blobdiff - data/bison.m4
Merge remote-tracking branch 'origin/maint'
[bison.git] / data / bison.m4
index 8e105d0dbb497d5f7cfaea79bae43cae3fb67872..910cdf26270e79a6cc4a0fddcaa9feb5c116f8e4 100644 (file)
@@ -461,6 +461,24 @@ m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
 m4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
 
 
+# b4_symbol_actions(KIND, [TYPE = yytype])
+# ----------------------------------------
+# Emit the symbol actions for KIND ("printer" or "destructor").
+# Dispatch on TYPE.
+m4_define([b4_symbol_actions],
+[m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
+m4_ifval(m4_defn([b4_actions_]),
+[switch (m4_default([$2], [yytype]))
+    {
+      m4_defn([b4_actions_])
+      default:
+        break;
+    }dnl
+],
+[YYUSE (m4_default([$2], [yytype]));])dnl
+m4_popdef([b4_actions_])dnl
+])
+
 # b4_symbol_case_(SYMBOL-NUM)
 # ---------------------------
 # Issue a "case NUM" for SYMBOL-NUM.
@@ -707,6 +725,20 @@ b4_loc[]dnl
 m4_popdef([b4_loc])],
           [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
 
+# b4_percent_define_get_kind(VARIABLE)
+# ------------------------------------
+# Get the kind (code, keyword, string) of VARIABLE, i.e., how its
+# value was defined (braces, not delimiters, quotes).
+#
+# If the %define variable VARIABLE is undefined, complain fatally
+# since that's a Bison or skeleton error.  Don't record this as a
+# Bison usage of VARIABLE as there's no reason to suspect that the
+# user-supplied value has yet influenced the output.
+m4_define([b4_percent_define_get_kind],
+[m4_ifdef([b4_percent_define_kind(]$1[)],
+          [m4_indir([b4_percent_define_kind(]$1[)])],
+          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
+
 # b4_percent_define_get_syncline(VARIABLE)
 # ----------------------------------------
 # Mimic muscle_percent_define_get_syncline in ../src/muscle-tab.h exactly.
@@ -923,9 +955,11 @@ b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 # b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
 # ----------------------------------------------
 b4_percent_define_if_define([variant])
-m4_case(b4_percent_define_get([[api.value.type]]),
-        [variant], [m4_define([b4_variant_flag], [[1]])],
-                   [m4_define([b4_variant_flag], [[0]])])
+m4_define([b4_variant_flag], [[0]])
+b4_percent_define_ifdef([[api.value.type]],
+   [m4_case(b4_percent_define_get_kind([[api.value.type]]), [keyword],
+            [m4_case(b4_percent_define_get([[api.value.type]]), [variant],
+                    [m4_define([b4_variant_flag], [[1]])])])])
 b4_define_flag_if([variant])
 
 
@@ -960,7 +994,12 @@ m4_define_default([b4_parse_param], [])
 m4_define_default([b4_location_initial_column], [1])
 m4_define_default([b4_location_initial_line],   [1])
 
-# Sanity checks.
+
+## --------------- ##
+## Sanity checks.  ##
+## --------------- ##
+
+# api.prefix >< %name-prefix.
 b4_percent_define_ifdef([api.prefix],
 [m4_ifdef([b4_prefix],
 [b4_complain_at(b4_percent_define_get_loc([api.prefix]),
@@ -968,9 +1007,19 @@ b4_percent_define_ifdef([api.prefix],
                 [%name-prefix],
                 [%define api.prefix])])])
 
+# api.value.type >< %union.
 b4_percent_define_ifdef([api.value.type],
 [m4_ifdef([b4_union_members],
 [b4_complain_at(b4_percent_define_get_loc([api.value.type]),
                 [['%s' and '%s' cannot be used together]],
                 [%union],
                 [%define api.value.type])])])
+
+# api.value.type=union >< %yacc.
+b4_percent_define_ifdef([api.value.type],
+[m4_if(b4_percent_define_get([api.value.type]), [union],
+[b4_yacc_if(dnl
+[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
+                [['%s' and '%s' cannot be used together]],
+                [%yacc],
+                [%define api.value.type "union"])])])])