X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/c0828abf9d81ce665d5dc9b5a2b2062e267d4114..45fdfd8108084c2c3505d584d8dcc7e534ae77a2:/data/c.m4 diff --git a/data/c.m4 b/data/c.m4 index 64f68fec..fd2203eb 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -17,6 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +m4_include(b4_pkgdatadir/[c-like.m4]) # b4_tocpp(STRING) # ---------------- @@ -29,19 +30,21 @@ m4_define([b4_tocpp], # ------------------ # A valid C macro name to use as a CPP header guard for FILE. m4_define([b4_cpp_guard], -[b4_tocpp(m4_defn([b4_prefix])/[$1])]) +[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]]) # b4_cpp_guard_open(FILE) # b4_cpp_guard_close(FILE) # ------------------------ -# Open/close CPP inclusion guards for FILE. +# If FILE does not expand to nothing, open/close CPP inclusion guards for FILE. m4_define([b4_cpp_guard_open], +[m4_ifval(m4_quote($1), [#ifndef b4_cpp_guard([$1]) -# define b4_cpp_guard([$1])]) +# define b4_cpp_guard([$1])])]) m4_define([b4_cpp_guard_close], -[#endif b4_comment([!b4_cpp_guard([$1])])]) +[m4_ifval(m4_quote($1), +[#endif b4_comment([!b4_cpp_guard([$1])])])]) ## ---------------- ## @@ -77,9 +80,6 @@ m4_define([b4_identification], /* Pull parsers. */ #define YYPULL ]b4_pull_flag])[ - -/* Using locations. */ -#define YYLSP_NEEDED ]b4_locations_flag[ ]]) @@ -87,11 +87,24 @@ m4_define([b4_identification], ## Default values. ## ## ---------------- ## +# b4_api_prefix, b4_api_PREFIX +# ---------------------------- +# Corresponds to %define api.prefix +b4_percent_define_default([[api.prefix]], [[yy]]) +m4_define([b4_api_prefix], +[b4_percent_define_get([[api.prefix]])]) +m4_define([b4_api_PREFIX], +[m4_toupper(b4_api_prefix)]) + + +# b4_prefix +# --------- +# If the %name-prefix is not given, it is api.prefix. +m4_define_default([b4_prefix], [b4_api_prefix]) + # If the %union is not named, its name is YYSTYPE. -m4_define_default([b4_union_name], [YYSTYPE]) +m4_define_default([b4_union_name], [b4_api_PREFIX[]STYPE]) -# If the %name-prefix is not given, it is yy. -m4_define_default([b4_prefix], [yy]) ## ------------------------ ## ## Pure/impure interfaces. ## @@ -235,18 +248,18 @@ m4_define([b4_token_enum], # Output the definition of the tokens (if there are) as enums. m4_define([b4_token_enums], [m4_if([$#$1], [1], [], -[/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE +[[/* Tokens. */ +#ifndef ]b4_api_PREFIX[TOKENTYPE +# define ]b4_api_PREFIX[TOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ - enum yytokentype { -m4_map_sep([ b4_token_enum], [, + enum ]b4_api_prefix[tokentype { +]m4_map_sep([ b4_token_enum], [, ], - [$@]) + [$@])[ }; #endif -])]) +]])]) # b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) @@ -411,17 +424,18 @@ $2 # SYMBOL-TAG, SYMBOL-NUM, # SYMBOL-ACTION, SYMBOL-TYPENAME) # ------------------------------------------------- +# Issue the code for a symbol action (e.g., %printer). +# +# Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are +# invoked where $$ and @$ were specified by the user. m4_define([b4_symbol_actions], -[m4_pushdef([b4_dollar_dollar], - [m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])dnl -m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl +[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl case $4: /* $3 */ b4_syncline([$2], [$1]) $5; b4_syncline([@oline@], [@ofile@]) break; -m4_popdef([b4_at_dollar])dnl -m4_popdef([b4_dollar_dollar])dnl +b4_dollar_popdef[]dnl ]) @@ -536,34 +550,96 @@ b4_locations_if([, yylocationp])[]b4_user_args[); ## -------------- ## # b4_declare_yylstype -# ------------------ -# Declaration that might either go into the header (if --defines) -# or open coded in the parser body. Declare YYSTYPE and YYLTYPE. +# ------------------- +# Declarations that might either go into the header (if --defines) or +# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc. m4_define([b4_declare_yylstype], -[[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED ]m4_ifdef([b4_stype], [[typedef union ]b4_union_name[ { ]b4_user_stype[ -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]], +} ]b4_api_PREFIX[STYPE; +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]], [m4_if(b4_tag_seen_flag, 0, -[[typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]])])[ -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 +[[typedef int ]b4_api_PREFIX[STYPE; +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[ +# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */ +# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1 #endif]b4_locations_if([[ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE +#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED +typedef struct ]b4_api_PREFIX[LTYPE { int first_line; int first_column; int last_line; int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 +} ]b4_api_PREFIX[LTYPE; +# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */ +# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1 +# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1 #endif]]) + +b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval; +]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl ]) + +# b4_YYDEBUG_define +# ------------------ +m4_define([b4_YYDEBUG_define], +[[/* Enabling traces. */ +]m4_if(b4_api_prefix, [yy], +[[#ifndef YYDEBUG +# define YYDEBUG ]b4_debug_flag[ +#endif]], +[[#ifndef ]b4_api_PREFIX[DEBUG +# if defined YYDEBUG +# if YYDEBUG +# define ]b4_api_PREFIX[DEBUG 1 +# else +# define ]b4_api_PREFIX[DEBUG 0 +# endif +# else /* ! defined YYDEBUG */ +# define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[ +# endif /* ! defined ]b4_api_PREFIX[DEBUG */ +#endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl +]) + +# b4_declare_yydebug +# ------------------ +m4_define([b4_declare_yydebug], +[b4_YYDEBUG_define[ +#if ]b4_api_PREFIX[DEBUG +extern int ]b4_prefix[debug; +#endif][]dnl +]) + +# b4_yylloc_default_define +# ------------------------ +# Define YYLLOC_DEFAULT. +m4_define([b4_yylloc_default_define], +[[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif +]])