X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6574576cfb6e5039e8a21714e8d9bf482ae7c32f..c98b5143b071e351bdb820565681890046a6b45a:/data/bison.m4 diff --git a/data/bison.m4 b/data/bison.m4 index 8e105d0d..904bcf2b 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. @@ -684,9 +702,9 @@ m4_define([b4_percent_define_use], # b4_percent_define_get([[foo]]) m4_define([b4_percent_define_get], [b4_percent_define_use([$1])dnl -m4_ifdef([b4_percent_define(]$1[)], - [m4_indir([b4_percent_define(]$1[)])], - [$2])]) +b4_percent_define_ifdef_([$1], + [m4_indir([b4_percent_define(]$1[)])], + [$2])]) # b4_percent_define_get_loc(VARIABLE) # ----------------------------------- @@ -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. @@ -724,6 +756,19 @@ m4_define([b4_percent_define_get_syncline], [m4_indir([b4_percent_define_syncline(]$1[)])], [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) +# b4_percent_define_ifdef_(VARIABLE, IF-TRUE, [IF-FALSE]) +# ------------------------------------------------------ +# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand +# IF-FALSE. Don't record usage of VARIABLE. +# +# For example: +# +# b4_percent_define_ifdef_([[foo]], [[it's defined]], [[it's undefined]]) +m4_define([b4_percent_define_ifdef_], +[m4_ifdef([b4_percent_define(]$1[)], + [$2], + [$3])]) + # b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE]) # ------------------------------------------------------ # Mimic muscle_percent_define_ifdef in ../src/muscle-tab.h exactly. That is, @@ -735,9 +780,9 @@ m4_define([b4_percent_define_get_syncline], # # b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]]) m4_define([b4_percent_define_ifdef], -[m4_ifdef([b4_percent_define(]$1[)], - [b4_percent_define_use([$1])$2], - [$3])]) +[b4_percent_define_ifdef_([$1], + [b4_percent_define_use([$1])$2], + [$3])]) ## --------- ## @@ -780,7 +825,7 @@ m4_define([b4_percent_define_flag_if], # # b4_percent_define_default([[foo]], [[default value]]) m4_define([b4_percent_define_default], -[m4_ifndef([b4_percent_define(]$1[)], +[b4_percent_define_ifdef_([$1], [], [m4_define([b4_percent_define(]$1[)], [$2])dnl m4_define([b4_percent_define_loc(]$1[)], [[[[:-1.-1]], @@ -802,6 +847,21 @@ m4_define([b4_percent_define_if_define], b4_percent_define_if_define_([$1], [$2], $[1], $[2])]) +# b4_percent_define_check_kind(VARIABLE, KIND, [DIAGNOSTIC = complain]) +# --------------------------------------------------------------------- +m4_define([b4_percent_define_check_kind], +[b4_percent_define_ifdef_([$1], + [m4_if(b4_percent_define_get_kind([[$1]]), [$2], [], + [b4_error([m4_default([$3], [complain])], + b4_percent_define_get_loc([$1]), + [m4_case([$2], + [code], [[%%define variable '%s' requires '{...}' values]], + [keyword], [[%%define variable '%s' requires '...' values]], + [string], [[%%define variable '%s' requires '"..."' values]])], + [$1])])])dnl +]) + + # b4_percent_define_check_values(VALUES) # -------------------------------------- # Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly @@ -823,7 +883,7 @@ m4_define([b4_percent_define_check_values], [_b4_percent_define_check_values(b4_sublist)])]) m4_define([_b4_percent_define_check_values], -[m4_ifdef([b4_percent_define(]$1[)], +[b4_percent_define_ifdef_([$1], [m4_pushdef([b4_good_value], [0])dnl m4_if($#, 1, [], [m4_foreach([b4_value], m4_dquote(m4_shift($@)), @@ -880,10 +940,6 @@ m4_define([b4_percent_code_ifdef], ## Common variables. ## ## ------------------ ## -# Default values for %define. -# --------------------------- -# If the api.token.prefix, it is empty. -m4_percent_define_default([[api.token.prefix]], [[]]) # b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT]) # b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT]) @@ -923,9 +979,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 +1018,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 +1031,23 @@ b4_percent_define_ifdef([api.prefix], [%name-prefix], [%define api.prefix])])]) +# api.token.prefix={...} +# Make it a warning for those who used betas of Bison 3.0. +b4_percent_define_check_kind([api.token.prefix], [code], [deprecated]) + +# 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"])])])])