X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/3eb4f1a3e62807125a815dc572da9204b5b51865..4323e0dac386d777d070c68564f1c0041b06935d:/data/bison.m4?ds=sidebyside diff --git a/data/bison.m4 b/data/bison.m4 index 58ed5d85..f2126ef4 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -326,6 +326,13 @@ b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. ## Symbols. ## ## --------- ## +# In order to unify the handling of the various aspects of symbols +# (tag, type_name, whether terminal, etc.), bison.exe defines one +# macro per (token, field), where field can has_id, id, etc.: see +# src/output.c:prepare_symbols_definitions(). +# +# The following macros provide access to these values. + # b4_symbol_(NUM, FIELD) # ---------------------- # Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if @@ -369,19 +376,17 @@ m4_define([b4_symbol_action_location], # Same as in C, but using references instead of pointers. m4_define([b4_symbol_action], [b4_symbol_if([$1], [has_$2], -[m4_pushdef([b4_dollar_dollar], - [b4_symbol_value([(*yyvaluep)], - b4_symbol_if([$1], [has_type], - [b4_symbol([$1], [type])]))])dnl -m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl - b4_symbol_case_([$1]) +[b4_dollar_pushdef([(*yyvaluep)], + b4_symbol_if([$1], [has_type], + [m4_dquote(b4_symbol([$1], [type]))]), + [(*yylocationp)])dnl + b4_symbol_case_([$1])[]dnl b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"]) b4_symbol([$1], [$2]) b4_syncline([@oline@], [@ofile@]) break; -m4_popdef([b4_at_dollar])dnl -m4_popdef([b4_dollar_dollar])dnl +b4_dollar_popdef[]dnl ])]) @@ -406,6 +411,45 @@ m4_define([b4_symbol_case_], m4_define([b4_symbol_foreach], [m4_map([$1], m4_defn([b4_symbol_numbers]))]) +# b4_symbol_map(MACRO) +# -------------------- +# Return a list (possibly empty elements) of MACRO invoked for each +# SYMBOL-NUM. +m4_define([b4_symbol_map], +[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)]) + + +# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE) +# ------------------------------------------- +# Whether NUM denotes a token that has an exported definition (i.e., +# shows in enum yytokentype). +m4_define([b4_token_visible_if], +[b4_symbol_if([$1], [is_token], + [b4_symbol_if([$1], [has_id], [$2], [$3])], + [$3])]) + +# b4_token_has_definition(NUM) +# ---------------------------- +# 1 if NUM is visible, nothing otherwise. +m4_define([b4_token_has_definition], +[b4_token_visible_if([$1], [1])]) + +# b4_any_token_visible_if([IF-TRUE], [IF-FALSE]) +# ---------------------------------------------- +# Whether there is a token that needs to be defined. +m4_define([b4_any_token_visible_if], +[m4_ifval(b4_symbol_foreach([b4_token_has_definition]), + [$1], [$2])]) + + +# b4_token_format(FORMAT, NUM) +# ---------------------------- +m4_define([b4_token_format], +[b4_token_visible_if([$2], +[m4_quote(m4_format([$1], + [b4_symbol([$2], [id])], + [b4_symbol([$2], [user_number])]))])]) + ## ------- ## ## Types. ##