X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/60aa04a236004d3d03f00aeaf07b643a52ef0760..d87ea54cf6cc98d52356c138bd142d1b450bbc9a:/data/bison.m4 diff --git a/data/bison.m4 b/data/bison.m4 index 58ed5d85..42a548da 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -206,23 +206,23 @@ m4_define([b4_subtract], [m4_eval([$1 - $2])], [($1) - ($2)])]) -# b4_args(ARG1, ...) -# _b4_args(ARG1, ...) +# b4_join(ARG1, ...) +# _b4_join(ARG1, ...) # ------------------- # Join with comma, skipping empty arguments. -# b4_args calls itself recursively until it sees the first non-empty -# argument, then calls _b4_args which prepends each non-empty argument +# b4_join calls itself recursively until it sees the first non-empty +# argument, then calls _b4_join which prepends each non-empty argument # with a comma. -m4_define([b4_args], +m4_define([b4_join], [m4_if([$#$1], [1], [], [m4_ifval([$1], [$1[]_$0(m4_shift($@))], [$0(m4_shift($@))])])]) -# _b4_args(ARGS1, ...) +# _b4_join(ARGS1, ...) # -------------------- -m4_define([_b4_args], +m4_define([_b4_join], [m4_if([$#$1], [1], [], [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])]) @@ -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. ##