X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6e93d810ca7b3ea73aaa4ff2aa06c0d948797d0a..b931235eb9e55277e0147443f916c0f73ad697c4:/data/c.m4?ds=sidebyside diff --git a/data/c.m4 b/data/c.m4 index 8b96b95b..46bacfcc 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -74,7 +74,7 @@ m4_define([b4_identification], [#]define YYSKELETON_NAME b4_skeleton /* Pure parsers. */ -[#]define YYPURE b4_pure +[#]define YYPURE b4_pure_flag /* Using locations. */ [#]define YYLSP_NEEDED b4_locations_flag @@ -171,32 +171,43 @@ m4_define([b4_int_type_for], ## Decoding options. ## ## ------------------ ## - -# b4_error_verbose_if(IF-TRUE, IF-FALSE) -# -------------------------------------- -# Expand IF-TRUE, if errors are verbose, IF-FALSE otherwise. -m4_define([b4_error_verbose_if], -[m4_if(b4_error_verbose, [1], - [$1], - [$2])]) - - -# b4_location_if(IF-TRUE, IF-FALSE) -# --------------------------------- -# Expand IF-TRUE, if locations are used, IF-FALSE otherwise. -m4_define([b4_location_if], -[m4_if(b4_locations_flag, [1], - [$1], - [$2])]) +# b4_flag_if(FLAG, IF-TRUE, IF-FALSE) +# ----------------------------------- +# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail. +m4_define([b4_flag_if], +[m4_case(b4_$1_flag, + [0], [$3], + [1], [$2], + [m4_fatal([invalid $1 value: ]$1)])]) -# b4_pure_if(IF-TRUE, IF-FALSE) +# b4_define_flag_if(FLAG) +# ----------------------- +# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the +# value of the Boolean FLAG. +m4_define([b4_define_flag_if], +[_b4_define_flag_if($[1], $[2], [$1])]) + +# _b4_define_flag_if($1, $2, FLAG) +# -------------------------------- +# This macro works around the impossibility to define macros +# inside macros, because issuing `[$1]' is not possible in M4 :(. +# This sucks hard, GNU M4 should really provide M5 like $$1. +m4_define([_b4_define_flag_if], +[m4_if([$1$2], $[1]$[2], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl +m4_define([b4_$3_if], + [b4_flag_if([$3], [$1], [$2])])]) + + +# b4_FLAG_if(IF-TRUE, IF-FALSE) # ----------------------------- -# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise. -m4_define([b4_pure_if], -[m4_if(b4_pure, [1], - [$1], - [$2])]) +# 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([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. @@ -250,9 +261,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($@)], []) ]) @@ -393,8 +405,7 @@ m4_define([b4_c_arg], # b4_syncline(LINE, FILE) # ----------------------- m4_define([b4_syncline], -[m4_if(b4_synclines_flag, 1, - [[#]line $1 $2])]) +[b4_flag_if([synclines], [[#]line $1 $2])]) @@ -436,11 +447,11 @@ m4_define_default([b4_yydestruct_generate], [[const char *yymsg], [yymsg]], [[int yytype], [yytype]], [[YYSTYPE *yyvaluep], [yyvaluep]][]dnl -b4_location_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl +b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { YYUSE (yyvaluep); -]b4_location_if([ YYUSE (yylocationp); +]b4_locations_if([ YYUSE (yylocationp); ])dnl b4_parse_param_use[]dnl [ @@ -474,13 +485,13 @@ m4_define_default([b4_yy_symbol_print_generate], [static void], [[FILE *yyoutput], [yyoutput]], [[int yytype], [yytype]], - [[const YYSTYPE * const yyvaluep], [yyvaluep]][]dnl -b4_location_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) return; -]b4_location_if([ YYUSE (yylocationp); +]b4_locations_if([ YYUSE (yylocationp); ])dnl b4_parse_param_use[]dnl [# ifdef YYPRINT @@ -506,8 +517,8 @@ b4_parse_param_use[]dnl [static void], [[FILE *yyoutput], [yyoutput]], [[int yytype], [yytype]], - [[const YYSTYPE * const yyvaluep], [yyvaluep]][]dnl -b4_location_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) @@ -515,11 +526,11 @@ m4_ifset([b4_parse_param], [, b4_parse_param]))[ else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); -]b4_location_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp); +]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp); YYFPRINTF (yyoutput, ": "); ])dnl [ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl -b4_location_if([, yylocationp])[]b4_user_args[); +b4_locations_if([, yylocationp])[]b4_user_args[); YYFPRINTF (yyoutput, ")"); }]dnl ])