X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/1b818f33ad29193a8ccd1deb2bfec3f6d406d41a..4f82b42a9d5ce6f0baa70714f25346ba9303be73:/data/c.m4?ds=inline diff --git a/data/c.m4 b/data/c.m4 index 945ab2b9..97c80d3d 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -76,12 +76,14 @@ m4_define([b4_identification], /* Pure parsers. */ [#]define YYPURE b4_pure_flag +/* Push parsers. */ +[#]define YYPUSH b4_push_flag + /* Using locations. */ [#]define YYLSP_NEEDED b4_locations_flag ]) - ## ---------------- ## ## Default values. ## ## ---------------- ## @@ -91,11 +93,15 @@ 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], @@ -132,11 +138,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. @@ -168,6 +174,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. ## ## ------------------ ## @@ -205,12 +222,21 @@ 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. +# b4_push_if(IF-TRUE, IF-FALSE) +# ----------------------------- +# Expand IF-TRUE, if %push-parser, IF-FALSE otherwise. +m4_define([b4_push_if], +[m4_if(b4_push_flag, [1], + [$1], + [$2])]) + + ## ------------------------- ## ## Assigning token numbers. ## @@ -403,17 +429,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)