X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7d6bad195977b0204fc8406cac57cf5a4f1c769b..cc8962bdde81b04aa728aef21e53b4a08a0debfe:/data/bison.m4 diff --git a/data/bison.m4 b/data/bison.m4 index 704f172e..910cdf26 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -85,6 +85,20 @@ m4_changecom([#]) ]) +# b4_divert_kill(CODE) +# -------------------- +# Expand CODE for its side effects, discard its output. +m4_define([b4_divert_kill], +[m4_divert_text([KILL], [$1])]) + + +# b4_define_silent(MACRO, CODE) +# ----------------------------- +# Same as m4_define, but throw away the expansion of CODE. +m4_define([b4_define_silent], +[m4_define([$1], [b4_divert_kill([$2])])]) + + ## ---------------- ## ## Error handling. ## ## ---------------- ## @@ -313,7 +327,7 @@ m4_define([b4_define_flag_if], # _b4_define_flag_if($1, $2, FLAG) # -------------------------------- # Work around the impossibility to define macros inside macros, -# because issuing `[$1]' is not possible in M4. GNU M4 should provide +# because issuing '[$1]' is not possible in M4. GNU M4 should provide # $$1 a la M5/TeX. m4_define([_b4_define_flag_if], [m4_if([$1$2], $[1]$[2], [], @@ -347,6 +361,7 @@ b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. # Whether the symbol has an id. # - id: string # If has_id, the id. Guaranteed to be usable as a C identifier. +# Prefixed by api.token.prefix if defined. # - tag: string. # A representat of the symbol. Can be 'foo', 'foo.id', '"foo"' etc. # - user_number: integer @@ -357,9 +372,13 @@ b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. # The internalized number (used after yytranslate). # - has_type: 0, 1 # Whether has a semantic value. +# - type_tag: string +# When api.value.type=union, the generated name for the union member. +# yytype_INT etc. for symbols that has_id, otherwise yytype_1 etc. # - type # If it has a semantic value, its type tag, or, if variant are used, # its type. +# In the case of api.value.type=union, type is the real type (e.g. int). # - has_printer: 0, 1 # - printer: string # - printer_file: string @@ -442,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. @@ -577,14 +614,14 @@ m4_define([b4_define_user_code], # b4_user_initial_action # b4_user_post_prologue # b4_user_pre_prologue -# b4_user_stype +# b4_user_union_members # ---------------------- # Macros that issue user code, ending with synclines. b4_define_user_code([actions]) b4_define_user_code([initial_action]) b4_define_user_code([post_prologue]) b4_define_user_code([pre_prologue]) -b4_define_user_code([stype]) +b4_define_user_code([union_members]) # b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE) @@ -686,7 +723,21 @@ m4_define([b4_percent_define_get_loc], [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl b4_loc[]dnl m4_popdef([b4_loc])], - [b4_fatal([[b4_percent_define_get_loc: undefined %%define variable '%s']], [$1])])]) + [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) # ---------------------------------------- @@ -703,7 +754,7 @@ m4_popdef([b4_loc])], m4_define([b4_percent_define_get_syncline], [m4_ifdef([b4_percent_define_syncline(]$1[)], [m4_indir([b4_percent_define_syncline(]$1[)])], - [b4_fatal([[b4_percent_define_get_syncline: undefined %%define variable '%s']], [$1])])]) + [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) # b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE]) # ------------------------------------------------------ @@ -747,7 +798,7 @@ m4_define([b4_percent_define_flag_if], [[invalid value for %%define Boolean variable '%s']], [$1])], [[b4_percent_define_flag_if($1)]])])], - [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])]) + [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) # b4_percent_define_default(VARIABLE, DEFAULT) @@ -772,8 +823,8 @@ m4_define([b4_percent_define_default], # b4_percent_define_if_define(NAME, [VARIABLE = NAME]) # ---------------------------------------------------- # Define b4_NAME_if that executes its $1 or $2 depending whether -# VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped -# to `_'. +# VARIABLE was %defined. The characters '.' and `-' in VARIABLE are mapped +# to '_'. m4_define([b4_percent_define_if_define_], [m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]), [b4_percent_define_flag_if(m4_default([$2], [$1]), @@ -820,7 +871,7 @@ m4_define([_b4_percent_define_check_values], [[accepted value: '%s']], m4_dquote(b4_value))])])dnl m4_popdef([b4_good_value])], - [b4_fatal([[b4_percent_define_check_values: undefined %%define variable '%s']], [$1])])]) + [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) # b4_percent_code_get([QUALIFIER]) # -------------------------------- @@ -904,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]) @@ -941,10 +994,32 @@ 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]), [['%s' and '%s' cannot be used together]], [%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"])])])])