X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d9df47b656fd1757f1f36c8f3d823ca9ca5bfe91..56ca3d8fce0c9db2f2829d7a7a07a9ad06cdf6a8:/data/c.m4 diff --git a/data/c.m4 b/data/c.m4 index dbec53c6..78b12325 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -1,7 +1,8 @@ -*- Autoconf -*- # C M4 Macros for Bison. -# Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + +# Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,6 +17,33 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . + +# b4_tocpp(STRING) +# ---------------- +# Convert STRING into a valid C macro name. +m4_define([b4_tocpp], +[m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))]) + + +# b4_cpp_guard(FILE) +# ------------------ +# 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])]) + + +# b4_cpp_guard_open(FILE) +# b4_cpp_guard_close(FILE) +# ------------------------ +# Open/close CPP inclusion guards for FILE. +m4_define([b4_cpp_guard_open], +[#ifndef b4_cpp_guard([$1]) +# define b4_cpp_guard([$1])]) + +m4_define([b4_cpp_guard_close], +[#endif b4_comment([!b4_cpp_guard([$1])])]) + + ## ---------------- ## ## Identification. ## ## ---------------- ## @@ -30,7 +58,7 @@ m4_define([b4_comment], [/* m4_bpatsubst([$1], [ # ----------------- # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or # b4_pull_flag if they use the values of the %define variables api.pure or -# api.push_pull. +# api.push-pull. m4_define([b4_identification], [[/* Identify Bison output. */ #define YYBISON 1 @@ -89,7 +117,7 @@ b4_parse_param) # the formal name to FORMAL, and evaluating the BODY. m4_define([b4_parse_param_for], [m4_foreach([$1_$2], m4_defn([b4_parse_param]), -[m4_pushdef([$1], m4_fst($1_$2))dnl +[m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl m4_pushdef([$2], m4_shift($1_$2))dnl $3[]dnl m4_popdef([$2])dnl @@ -132,15 +160,45 @@ m4_define([b4_int_type], m4_define([b4_int_type_for], [b4_int_type($1_min, $1_max)]) + +# b4_table_value_equals(TABLE, VALUE, LITERAL) +# -------------------------------------------- +# Without inducing a comparison warning from the compiler, check if the +# literal value LITERAL equals VALUE from table TABLE, which must have +# TABLE_min and TABLE_max defined. YYID must be defined as an identity +# function that suppresses warnings about constant conditions. +m4_define([b4_table_value_equals], +[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min]) + || m4_indir([b4_]$1[_max]) < $3), [1], + [[YYID (0)]], + [[((]$2[) == (]$3[))]])]) + + ## ---------## ## Values. ## ## ---------## + +# b4_null_define +# -------------- +# Portability issues: define a YY_NULL appropriate for the current +# language (C, C++98, or C++11). +m4_define([b4_null_define], +[# ifndef YY_NULL +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULL nullptr +# else +# define YY_NULL 0 +# endif +# endif[]dnl +]) + + # 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]) +# ------- +# Return a null pointer constant. +m4_define([b4_null], [YY_NULL]) + ## ------------------------- ## @@ -159,7 +217,7 @@ m4_define([b4_token_define], # ------------------------------------------------------- # Output the definition of the tokens (if there are) as #defines. m4_define([b4_token_defines], -[m4_if([$@], [[]], [], +[m4_if([$#$1], [1], [], [/* Tokens. */ m4_map([b4_token_define], [$@])]) ]) @@ -176,7 +234,7 @@ m4_define([b4_token_enum], # ----------------------------------------------------- # Output the definition of the tokens (if there are) as enums. m4_define([b4_token_enums], -[m4_if([$@], [[]], [], +[m4_if([$#$1], [1], [], [/* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE @@ -228,8 +286,8 @@ m4_define([b4_c_function_def], b4_c_ansi_function_def($@) #else $2 -$1 (b4_c_knr_formal_names(m4_shiftn(2, $@))) -b4_c_knr_formal_decls(m4_shiftn(2, $@)) +$1 (b4_c_knr_formal_names(m4_shift2($@))) +b4_c_knr_formal_decls(m4_shift2($@)) #endif[]dnl ]) @@ -239,7 +297,7 @@ b4_c_knr_formal_decls(m4_shiftn(2, $@)) # Declare the function NAME in ANSI. m4_define([b4_c_ansi_function_def], [$2 -$1 (b4_c_ansi_formals(m4_shiftn(2, $@)))[]dnl +$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl ]) @@ -247,9 +305,8 @@ $1 (b4_c_ansi_formals(m4_shiftn(2, $@)))[]dnl # -------------------------------------- # Output the arguments ANSI-C definition. m4_define([b4_c_ansi_formals], -[m4_case([$@], - [], [void], - [[]], [void], +[m4_if([$#], [0], [void], + [$#$1], [1], [void], [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) m4_define([b4_c_ansi_formal], @@ -301,7 +358,7 @@ $2 $1 (); # ---------------------------------------------------------------- # Declare the function NAME. m4_define([b4_c_ansi_function_decl], -[$2 $1 (b4_c_ansi_formals(m4_shiftn(2, $@)));[]dnl +[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl ]) @@ -316,7 +373,7 @@ m4_define([b4_c_ansi_function_decl], # ----------------------------------------------------------- # Call the function NAME with arguments NAME1, NAME2 etc. m4_define([b4_c_function_call], -[$1 (b4_c_args(m4_shiftn(2, $@)))[]dnl +[$1 (b4_c_args(m4_shift2($@)))[]dnl ]) @@ -426,6 +483,8 @@ m4_define_default([b4_yy_symbol_print_generate], b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { + FILE *yyo = yyoutput; + YYUSE (yyo); if (!yyvaluep) return; ]b4_locations_if([ YYUSE (yylocationp); @@ -471,3 +530,52 @@ b4_locations_if([, yylocationp])[]b4_user_args[); YYFPRINTF (yyoutput, ")"); }]dnl ]) + +## -------------- ## +## Declarations. ## +## -------------- ## + +# b4_declare_yylstype +# ------------------ +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. Declare YYSTYPE and YYLTYPE. +m4_define([b4_declare_yylstype], +[[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +]m4_ifdef([b4_stype], +[[typedef union ]b4_union_name[ +{ +]b4_user_stype[ +} YYSTYPE; +# define YYSTYPE_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 +#endif]b4_locations_if([[ + +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE +{ + 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 +#endif]]) +]) + +# b4_declare_yydebug +# ------------------ +m4_define([b4_declare_yydebug], +[[/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG ]b4_debug_flag[ +#endif +#if YYDEBUG +extern int ]b4_prefix[debug; +#endif][]dnl +])