]> git.saurik.com Git - bison.git/blobdiff - data/c.m4
For associating token numbers with token names for "yacc.c", don't use
[bison.git] / data / c.m4
index 630fdebd118aba45b158e9a2b265da7f01963cc3..46bacfcc3c742c210cc81a87fa1474181c101975 100644 (file)
--- a/data/c.m4
+++ b/data/c.m4
@@ -28,8 +28,9 @@ m4_divert(-1)                                               -*- Autoconf -*-
 m4_define([b4_copyright],
 [/* A Bison parser, made by GNU Bison b4_version.  */
 
-/* $1,
-   Copyright (C) $2 Free Software Foundation, Inc.
+/* $1
+
+m4_text_wrap([Copyright (C) $2 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
@@ -44,7 +45,20 @@ m4_define([b4_copyright],
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */])
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */])
 
 
 # b4_identification
@@ -60,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
@@ -142,7 +156,7 @@ m4_define([b4_int_type],
 
        m4_eval([0 <= $1]),                [1], [unsigned int],
 
-                                              [int])])
+                                              [int])])
 
 
 # b4_int_type_for(NAME)
@@ -157,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_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_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_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.
 
 
 
@@ -228,7 +253,7 @@ m4_define([b4_token_enums],
    enum yytokentype {
 m4_map_sep([     b4_token_enum], [,
 ],
-           [$@])
+          [$@])
    };
 #endif
 ])])
@@ -236,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($@)], [])
 ])
 
 
@@ -259,8 +285,8 @@ m4_define([b4_token_enums_defines],
 # Consider a C++ compiler to be modern if it defines __cplusplus.
 #
 m4_define([b4_c_modern],
-  [[(defined (__STDC__) || defined (__C99__FUNC__) \
-     || defined (__cplusplus) || defined (_MSC_VER))]])
+  [[(defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)]])
 
 # b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 # ----------------------------------------------------------
@@ -290,9 +316,9 @@ $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_map_sep([b4_c_ansi_formal], [, ], [$@])])])
+        [],   [void],
+        [[]], [void],
+              [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
 
 m4_define([b4_c_ansi_formal],
 [$1])
@@ -313,9 +339,9 @@ m4_define([b4_c_knr_formal_name],
 # Output the K&R argument declarations.
 m4_define([b4_c_knr_formal_decls],
 [m4_map_sep([b4_c_knr_formal_decl],
-            [
+           [
 ],
-            [$@])])
+           [$@])])
 
 m4_define([b4_c_knr_formal_decl],
 [    $1;])
@@ -331,7 +357,7 @@ m4_define([b4_c_knr_formal_decl],
 # -----------------------------------------------------------
 # Declare the function NAME.
 m4_define([b4_c_function_decl],
-[#if defined (__STDC__) || defined (__cplusplus)
+[#if defined __STDC__ || defined __cplusplus
 b4_c_ansi_function_decl($@)
 #else
 $2 $1 ();
@@ -379,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])])
 
 
 
@@ -398,9 +423,9 @@ m4_define([b4_symbol_actions],
 m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
       case $4: /* $3 */
 b4_syncline([$2], [$1])
-        $5;
+       $5;
 b4_syncline([@oline@], [@ofile@])
-        break;
+       break;
 m4_popdef([b4_at_dollar])dnl
 m4_popdef([b4_dollar_dollar])dnl
 ])
@@ -422,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
 [
@@ -438,7 +463,7 @@ b4_parse_param_use[]dnl
     {
 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
       default:
-        break;
+       break;
     }
 }]dnl
 ])
@@ -458,26 +483,28 @@ m4_define_default([b4_yy_symbol_print_generate],
 /*ARGSUSED*/
 ]$1([yy_symbol_value_print],
     [static void],
-               [[FILE *yyoutput],                       [yyoutput]],
-               [[int yytype],                           [yytype]],
-               [[const YYSTYPE * const yyvaluep],       [yyvaluep]][]dnl
-b4_location_if([, [[const YYLTYPE * const yylocationp], [yylocationp]]])[]dnl
+              [[FILE *yyoutput],                       [yyoutput]],
+              [[int yytype],                           [yytype]],
+              [[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
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
 # endif
   switch (yytype)
     {
 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 [      default:
-        break;
+       break;
     }
 }
 
@@ -488,10 +515,10 @@ b4_parse_param_use[]dnl
 
 ]$1([yy_symbol_print],
     [static void],
-               [[FILE *yyoutput],                       [yyoutput]],
-               [[int yytype],                           [yytype]],
-               [[const YYSTYPE * const yyvaluep],       [yyvaluep]][]dnl
-b4_location_if([, [[const YYLTYPE * const yylocationp], [yylocationp]]])[]dnl
+              [[FILE *yyoutput],                       [yyoutput]],
+              [[int yytype],                           [yytype]],
+              [[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)
@@ -499,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
 ])