From 258cddbc3695f2095cbfbc9ff95309b28733f7d2 Mon Sep 17 00:00:00 2001
From: Akim Demaille <akim@lrde.epita.fr>
Date: Mon, 25 Jun 2012 16:52:30 +0200
Subject: [PATCH] c++: do not export YYTOKEN_TABLE and YYERROR_VERBOSE.

* src/output.c (prepare_symbols): Do not define b4_token_table.
(prepare): Define b4_token_table_flag.
* data/bison.m4 (b4_token_table_if): New.
Arm it when error-verbose.
* data/glr.c, data/yacc.c (YYTOKEN_TABLE): Remove.
Use m4.
* data/lalr1.cc: Likewise.
(YYERROR_VERBOSE): Remove.
* NEWS, doc/bison.texi: Document this.
---
 NEWS           | 26 +++++++++++++++++---------
 data/bison.m4  | 22 +++++++++++++---------
 data/glr.c     |  7 +------
 data/lalr1.cc  | 30 +++++++-----------------------
 data/yacc.c    |  7 +------
 doc/bison.texi |  3 ++-
 src/output.c   |  2 +-
 7 files changed, 42 insertions(+), 55 deletions(-)

diff --git a/NEWS b/NEWS
index 10829f54..7eebe910 100644
--- a/NEWS
+++ b/NEWS
@@ -13,14 +13,16 @@ GNU Bison NEWS
   generated for C supprt ISO C90, and are tested with ISO C99 and ISO C11
   compilers.
 
-*** Deprecated features
+*** Features deprecated since Bison 1.875
 
-  The definitions of yystype and yyltype will be removed, as announced since
-  Bison 1.875.  Use YYSTYPE and YYLTYPE only.
+  The definitions of yystype and yyltype will be removed; use YYSTYPE and
+  YYLTYPE.
 
-  YYPARSE_PARAM and YYLEX_PARAM, which were deprecated in favor of
-  %parse-param and %lex-param (introduced in Bison 1.875), will no longer be
-  supported.
+  YYPARSE_PARAM and YYLEX_PARAM, deprecated in favor of %parse-param and
+  %lex-param, will no longer be supported.
+
+  Support for the preprocessor symbol YYERROR_VERBOSE will be removed, use
+  %error-verbose.
 
 *** The generated header will be included (yacc.c)
 
@@ -30,9 +32,9 @@ GNU Bison NEWS
   because existing versions of ylwrap (e.g., Automake 1.12.1) do not support
   it.
 
-** Headers (yacc.c, glr.c, glr.cc)
+** Headers
 
-*** Guards
+*** Guards (yacc.c, glr.c, glr.cc)
 
   The generated headers are now guarded, as is already the case for C++
   parsers (lalr1.cc).  For intance, with --defines=foo.h:
@@ -42,7 +44,7 @@ GNU Bison NEWS
     ...
     #endif /* !YY_FOO_H  */
 
-*** New declarations
+*** New declarations (yacc.c, glr.c)
 
   The generated header now declares yydebug and yyparse.  Both honor
   --name-prefix=bar_, and yield
@@ -57,6 +59,12 @@ GNU Bison NEWS
   in order to facilitate the inclusion of several parser headers inside a
   single compilation unit.
 
+*** Exported symbols in C++
+
+  The symbols YYTOKEN_TABLE and YYERROR_VERBOSE, which were defined in the
+  header, are removed, as they prevent the possibility of including several
+  generated headers from a single compilation unit.
+
 * Noteworthy changes in release 2.5.1 (2012-06-05) [stable]
 
 ** Future changes:
diff --git a/data/bison.m4 b/data/bison.m4
index 6688c06b..a5c1ee73 100644
--- a/data/bison.m4
+++ b/data/bison.m4
@@ -233,9 +233,9 @@ m4_define([b4_define_flag_if],
 
 # _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.
+# Work around the impossibility to define macros inside macros,
+# because issuing `[$1]' is not possible in M4.  GNU M4 should provide
+# $$1 a la M5/TeX.
 m4_define([_b4_define_flag_if],
 [m4_if([$1$2], $[1]$[2], [],
        [m4_fatal([$0: Invalid arguments: $@])])dnl
@@ -246,12 +246,16 @@ m4_define([b4_$3_if],
 # b4_FLAG_if(IF-TRUE, IF-FALSE)
 # -----------------------------
 # 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])	# Whether error are verbose.
-b4_define_flag_if([glr])		# Whether a GLR parser is requested.
-b4_define_flag_if([locations])	        # Whether locations are tracked.
-b4_define_flag_if([nondeterministic])	# Whether conflicts should be handled.
-b4_define_flag_if([yacc])	        # Whether POSIX Yacc is emulated.
+b4_define_flag_if([defines])            # Whether headers are requested.
+b4_define_flag_if([error_verbose])      # Whether error are verbose.
+b4_define_flag_if([glr])                # Whether a GLR parser is requested.
+b4_define_flag_if([locations])          # Whether locations are tracked.
+b4_define_flag_if([nondeterministic])   # Whether conflicts should be handled.
+b4_define_flag_if([token_table])        # Whether yytoken_table is demanded.
+b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
+
+# yytoken_table is needed to support verbose errors.
+b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 
 
 ## ------------------------- ##
diff --git a/data/glr.c b/data/glr.c
index 4d0a1bcb..699d7304 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -215,11 +215,6 @@ b4_percent_code_get([[top]])[
 # define YYERROR_VERBOSE ]b4_error_verbose_flag[
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
 /* Default (constant) value used for initialization for null
    right-hand sides.  Unlike the standard yacc.c template,
    here we set the default value of $$ to a zeroed-out value.
@@ -367,7 +362,7 @@ static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 4f0b2688..e82e654f 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -62,19 +62,6 @@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
 # define YYDEBUG ]b4_debug_flag[
 #endif
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_flag[
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
 ]b4_namespace_open[
 
   /// A Bison parser.
@@ -211,17 +198,15 @@ b4_user_stype
     /// For a rule, its LHS.
     static const ]b4_int_type_for([b4_r1])[ yyr1_[];
     /// For a rule, its RHS length.
-    static const ]b4_int_type_for([b4_r2])[ yyr2_[];
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-    /// For a symbol, its name in clear.
-    static const char* const yytname_[];
-#endif]b4_error_verbose_if([
+    static const ]b4_int_type_for([b4_r2])[ yyr2_[]; ]b4_error_verbose_if([
 
     /// Convert the symbol name \a n to a form suitable for a diagnostic.
     static std::string yytnamerr_ (const char *n);])[
 
-#if YYDEBUG
+]b4_token_table_if([], [[#if YYDEBUG]])[
+    /// For a symbol, its name in clear.
+    static const char* const yytname_[];
+]b4_token_table_if([[#if YYDEBUG]])[
     /// A type to store symbol numbers and -1.
     typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
     /// A `-1'-separated list of the rules' RHS.
@@ -1051,7 +1036,7 @@ b4_error_verbose_if([int yystate, int yytoken],
     ]b4_r2[
   };
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+]b4_token_table_if([], [[#if YYDEBUG]])[
   /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
      First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
   const char*
@@ -1059,9 +1044,8 @@ b4_error_verbose_if([int yystate, int yytoken],
   {
     ]b4_tname[
   };
-#endif
 
-#if YYDEBUG
+]b4_token_table_if([[#if YYDEBUG]])[
   /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
   const ]b4_parser_class_name[::rhs_number_type
   ]b4_parser_class_name[::yyrhs_[] =
diff --git a/data/yacc.c b/data/yacc.c
index 57f3dace..7cf088b2 100644
--- a/data/yacc.c
+++ b/data/yacc.c
@@ -336,11 +336,6 @@ m4_if(b4_prefix, [yy], [],
 # define YYERROR_VERBOSE ]b4_error_verbose_flag[
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE ]b4_token_table[
-#endif
-
 /* In a future release of Bison, this section will be replaced
    by #include "@basename(]b4_spec_defines_file[@)".  */
 ]b4_shared_declarations[
@@ -607,7 +602,7 @@ static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
diff --git a/doc/bison.texi b/doc/bison.texi
index 4f2e1c62..b1631665 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -11216,7 +11216,8 @@ Reporting Function @code{yyerror}}.
 An obsolete macro that you define with @code{#define} in the prologue
 to request verbose, specific error message strings
 when @code{yyerror} is called.  It doesn't matter what definition you
-use for @code{YYERROR_VERBOSE}, just whether you define it.  Using
+use for @code{YYERROR_VERBOSE}, just whether you define it.
+Supported by the C skeletons only; using
 @code{%error-verbose} is preferred.  @xref{Error Reporting}.
 @end deffn
 
diff --git a/src/output.c b/src/output.c
index e0d6ed3a..29e9ba84 100644
--- a/src/output.c
+++ b/src/output.c
@@ -142,7 +142,6 @@ escaped_output (FILE *out, char const *string)
 static void
 prepare_symbols (void)
 {
-  MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
   MUSCLE_INSERT_INT ("tokens_number", ntokens);
   MUSCLE_INSERT_INT ("nterms_number", nvars);
   MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
@@ -624,6 +623,7 @@ prepare (void)
   MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
   MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
+  MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag);
   MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
   MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
 
-- 
2.45.2