X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/1fa19a769721658bb53177596531afbbea8b4e1c..cc8962bdde81b04aa728aef21e53b4a08a0debfe:/data/bison.m4 diff --git a/data/bison.m4 b/data/bison.m4 index e536ceb3..910cdf26 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -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])