X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/327afc7c849accd5fd7f97bd061f6480c6961ed8..21fe08cadcb84fddd5038ac6857a904dbe1ad885:/data/c.m4 diff --git a/data/c.m4 b/data/c.m4 index c7c50636..ffb04c20 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -81,20 +81,24 @@ m4_define([b4_identification], ]) - ## ---------------- ## ## Default values. ## ## ---------------- ## m4_define_default([b4_epilogue], []) +# If the %union is not named, its name is YYSTYPE. +m4_define_default([b4_union_name], [YYSTYPE]) + +# The initial column and line. +m4_define_default([b4_location_initial_column], [1]) +m4_define_default([b4_location_initial_line], [1]) ## ------------------------ ## ## Pure/impure interfaces. ## ## ------------------------ ## - # b4_user_args # ------------ m4_define([b4_user_args], @@ -131,11 +135,11 @@ m4_define([b4_parse_param_use], ])dnl ]) + ## ------------ ## ## Data Types. ## ## ------------ ## - # b4_ints_in(INT1, INT2, LOW, HIGH) # --------------------------------- # Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise. @@ -167,6 +171,17 @@ m4_define([b4_int_type_for], [b4_int_type($1_min, $1_max)]) +## ---------## +## Values. ## +## ---------## + +# b4_null +--------- +# Return a null pointer constant. NULL infringes on the user name +# space in C, so use 0 rather than NULL. +m4_define([b4_null], [0]) + + ## ------------------ ## ## Decoding options. ## ## ------------------ ## @@ -196,7 +211,7 @@ m4_define([b4_define_flag_if], m4_define([_b4_define_flag_if], [m4_if([$1$2], $[1]$[2], [], [m4_fatal([$0: Invalid arguments: $@])])dnl -m4_define([b4_$3_if], +m4_define([b4_$3_if], [b4_flag_if([$3], [$1], [$2])])]) @@ -204,9 +219,10 @@ m4_define([b4_$3_if], # ----------------------------- # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise. b4_define_flag_if([defines]) # Whether headers are requested. -b4_define_flag_if([error_verbose]) # Wheter error are verbose. +b4_define_flag_if([error_verbose]) # Whether error are verbose. b4_define_flag_if([locations]) # Whether locations are tracked. b4_define_flag_if([pure]) # Whether the interface is pure. +b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. @@ -260,9 +276,10 @@ m4_map_sep([ b4_token_enum], [, # b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) # ------------------------------------------------------------- -# Output the definition of the tokens (if there are) as enums and #defines. +# Output the definition of the tokens (if there are any) as enums and, if POSIX +# Yacc is enabled, as #defines. m4_define([b4_token_enums_defines], -[b4_token_enums($@)b4_token_defines($@) +[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], []) ]) @@ -400,17 +417,63 @@ m4_define([b4_c_arg], ## Synclines. ## ## ----------- ## +# b4_basename(NAME) +# ----------------- +# Similar to POSIX basename; the differences don't matter here. +# Beware that NAME is not evaluated. +m4_define([b4_basename], +[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])]) + + # b4_syncline(LINE, FILE) # ----------------------- m4_define([b4_syncline], -[b4_flag_if([synclines], [[#]line $1 $2])]) +[b4_flag_if([synclines], +[/* Line __line__ of b4_basename(m4_quote(__file__)). */ +[#]line $1 $2])]) + +# b4_user_code(USER-CODE) +# ----------------------- +# Emit code from the user, ending it with synclines. +m4_define([b4_user_code], +[$1 +b4_syncline([@oline@], [@ofile@])]) + + +# b4_define_user_code(MACRO) +# -------------------------- +# From b4_MACRO, build b4_user_MACRO that includes the synclines. +m4_define([b4_define_user_code], +[m4_define([b4_user_$1], +[b4_user_code([b4_$1])])]) + + +# b4_user_actions +# b4_user_initial_action +# b4_user_post_prologue +# b4_user_start_header +# b4_user_stype +# ---------------------- +# 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([start_header]) +b4_define_user_code([stype]) ## -------------- ## ## User actions. ## ## -------------- ## +# b4_case(LABEL, STATEMENTS) +# -------------------------- +m4_define([b4_case], +[ case $1: +$2 + break;]) + # b4_symbol_actions(FILENAME, LINENO, # SYMBOL-TAG, SYMBOL-NUM, # SYMBOL-ACTION, SYMBOL-TYPENAME) @@ -483,8 +546,8 @@ m4_define_default([b4_yy_symbol_print_generate], [static void], [[FILE *yyoutput], [yyoutput]], [[int yytype], [yytype]], - [[const YYSTYPE * const yyvaluep], [yyvaluep]][]dnl -b4_locations_if([, [[const YYLTYPE * const yylocationp], [yylocationp]]])[]dnl + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl +b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { if (!yyvaluep) @@ -515,8 +578,8 @@ b4_parse_param_use[]dnl [static void], [[FILE *yyoutput], [yyoutput]], [[int yytype], [yytype]], - [[const YYSTYPE * const yyvaluep], [yyvaluep]][]dnl -b4_locations_if([, [[const YYLTYPE * const yylocationp], [yylocationp]]])[]dnl + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl +b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { if (yytype < YYNTOKENS)