]> git.saurik.com Git - bison.git/commitdiff
For associating token numbers with token names for "yacc.c", don't use
authorJoel E. Denny <jdenny@ces.clemson.edu>
Sun, 11 Jun 2006 18:27:44 +0000 (18:27 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Sun, 11 Jun 2006 18:27:44 +0000 (18:27 +0000)
#define statements unless `--yacc' is specified; always use enum
yytokentype.  Most important discussions start at:
<http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00053.html>,
<http://lists.gnu.org/archive/html/bison-patches/2005-12/msg00052.html>,
and
<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00043.html>.
* NEWS (2.3+): Mention.
* data/c.m4 (b4_yacc_if): New.
(b4_token_enums_defines): Use b4_yacc_if to decide whether to add the
token #define's.
* doc/bison.texinfo (Bison Options): Describe the effect of `--yacc'
on token name definitions.
* src/getargs.c (usage): Capitalize `Yacc' in English.
* src/output.c (prepare): Define b4_yacc_flag.
* tests/regression.at (Early token definitions): Test that tokens names
are defined before the pre-prologue not just before the post-prologue.
Remove this test case and copy to...
(Early token definitions with --yacc): ... this to test #define's.
(Early token definitions without --yacc): ... and this to test enums.

ChangeLog
NEWS
data/c.m4
doc/bison.texinfo
src/getargs.c
src/output.c
tests/regression.at

index 68088e4d6e1a74f8e3774d237a4c47655227c164..bd43c25a5795e03e178b42d38714b7032a837b6a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2006-06-11  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       For associating token numbers with token names for "yacc.c", don't use
+       #define statements unless `--yacc' is specified; always use enum
+       yytokentype.  Most important discussions start at:
+       <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00053.html>,
+       <http://lists.gnu.org/archive/html/bison-patches/2005-12/msg00052.html>,
+       and
+       <http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00043.html>.
+       * NEWS (2.3+): Mention.
+       * data/c.m4 (b4_yacc_if): New.
+       (b4_token_enums_defines): Use b4_yacc_if to decide whether to add the
+       token #define's.
+       * doc/bison.texinfo (Bison Options): Describe the effect of `--yacc'
+       on token name definitions.
+       * src/getargs.c (usage): Capitalize `Yacc' in English.
+       * src/output.c (prepare): Define b4_yacc_flag.
+       * tests/regression.at (Early token definitions): Test that tokens names
+       are defined before the pre-prologue not just before the post-prologue.
+       Remove this test case and copy to...
+       (Early token definitions with --yacc): ... this to test #define's.
+       (Early token definitions without --yacc): ... and this to test enums.
+
 2006-06-11  Paul Eggert  <eggert@cs.ucla.edu>
 
        * NEWS: Reword the post-2.3 change to not be so optimistic about
diff --git a/NEWS b/NEWS
index 2e757516d3302e29b2e74986a624ba0eab6e743b..a1bf9ae1d0bf14b964b38b9b78a91461d77dcdaf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,12 @@ Bison News
 
 Changes in version 2.3+:
 
+* Except for LALR(1) parsers in C with POSIX Yacc emulation enabled (with `-y',
+  `--yacc', or `%yacc'), Bison no longer generates #define statements for
+  associating token numbers with token names.  Removing the #define statements
+  helps to sanitize the global namespace during preprocessing, but POSIX Yacc
+  requires them.  Bison still generates an enum for token names in all cases.
+
 * The option `--report=look-ahead' has been changed to `--report=lookahead'.
   The old spelling still works, but is not documented and may be removed
   in a future release.
index f10e0901147c137b56d39504295de0bbc0684eca..46bacfcc3c742c210cc81a87fa1474181c101975 100644 (file)
--- a/data/c.m4
+++ b/data/c.m4
@@ -207,6 +207,7 @@ 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.
 
 
 
@@ -260,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($@)], [])
 ])
 
 
index 84a7dee83efe73980ae52419419cf68d1e36ff42..f433b712401fe1bec6f248b1e8a784f1dc1502af 100644 (file)
@@ -6830,9 +6830,12 @@ different diagnostics to be generated, and may change behavior in
 other minor ways.  Most importantly, imitate Yacc's output
 file name conventions, so that the parser output file is called
 @file{y.tab.c}, and the other outputs are called @file{y.output} and
-@file{y.tab.h}.  Thus, the following shell script can substitute
-for Yacc, and the Bison distribution contains such a script for
-compatibility with @acronym{POSIX}:
+@file{y.tab.h}.
+Also, if generating an @acronym{LALR}(1) parser in C, generate @code{#define}
+statements in addition to an @code{enum} to associate token numbers with token
+names.
+Thus, the following shell script can substitute for Yacc, and the Bison
+distribution contains such a script for compatibility with @acronym{POSIX}:
 
 @example
 #! /bin/sh
index ec861eb0541f5adc2471f78df5ea7c4492be0a03..0a7f3727bbf8350aa48724479ba5229d9381a040 100644 (file)
@@ -217,7 +217,7 @@ Operation modes:\n\
   -h, --help                 display this help and exit\n\
   -V, --version              output version information and exit\n\
       --print-localedir      output directory containing locale-dependent data\n\
-  -y, --yacc                 emulate POSIX yacc\n"), stdout);
+  -y, --yacc                 emulate POSIX Yacc\n"), stdout);
       putc ('\n', stdout);
 
       fputs (_("\
index 4e7b5bf3e17991fd21c22a2e87783d9459393db4..0d648770c2a4274700340ebb1e248536b0a0316a 100644 (file)
@@ -590,6 +590,7 @@ prepare (void)
   MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
   MUSCLE_INSERT_BOOL ("pure_flag", pure_parser);
   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
+  MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
 
   /* File names.  */
   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
index 04beccc3298245ebe25ae300441958877d65bf23..bbd007615a189285efbbb4a34587cef3c5ec8033 100644 (file)
@@ -49,12 +49,12 @@ AT_CLEANUP
 
 
 
-## ------------------------- ##
-## Early token definitions.  ##
-## ------------------------- ##
+## ------------------------------------- ##
+## Early token definitions with --yacc.  ##
+## ------------------------------------- ##
 
 
-AT_SETUP([Early token definitions])
+AT_SETUP([Early token definitions with --yacc])
 
 # Found in GCJ: they expect the tokens to be defined before the user
 # prologue, so that they can use the token definitions in it.
@@ -63,17 +63,56 @@ AT_DATA_GRAMMAR([input.y],
 [[%{
 void yyerror (const char *s);
 int yylex (void);
+#ifndef MY_TOKEN
+# error "MY_TOKEN not defined."
+#endif
 %}
 
 %union
 {
   int val;
 };
-%{
-#ifndef MY_TOKEN
-# error "MY_TOKEN not defined."
-#endif
+%token MY_TOKEN
+%%
+exp: MY_TOKEN;
+%%
+]])
+
+AT_CHECK([bison -y -o input.c input.y])
+AT_COMPILE([input.o], [-c input.c])
+
+AT_CLEANUP
+
+
+
+## ---------------------------------------- ##
+## Early token definitions without --yacc.  ##
+## ---------------------------------------- ##
+
+
+AT_SETUP([Early token definitions without --yacc])
+
+# Found in GCJ: they expect the tokens to be defined before the user
+# prologue, so that they can use the token definitions in it.
+
+AT_DATA_GRAMMAR([input.y],
+[[%{
+#include <stdio.h>
+void yyerror (const char *s);
+int yylex (void);
+void print_my_token (void);
+void
+print_my_token (void)
+{
+  enum yytokentype my_token = MY_TOKEN;
+  printf ("%d\n", my_token);
+}
 %}
+
+%union
+{
+  int val;
+};
 %token MY_TOKEN
 %%
 exp: MY_TOKEN;