mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 09:43:03 +00:00
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.
This commit is contained in:
23
ChangeLog
23
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>
|
2006-06-11 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
* NEWS: Reword the post-2.3 change to not be so optimistic about
|
* NEWS: Reword the post-2.3 change to not be so optimistic about
|
||||||
|
|||||||
6
NEWS
6
NEWS
@@ -3,6 +3,12 @@ Bison News
|
|||||||
|
|
||||||
Changes in version 2.3+:
|
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 option `--report=look-ahead' has been changed to `--report=lookahead'.
|
||||||
The old spelling still works, but is not documented and may be removed
|
The old spelling still works, but is not documented and may be removed
|
||||||
in a future release.
|
in a future release.
|
||||||
|
|||||||
@@ -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([error_verbose]) # Wheter error are verbose.
|
||||||
b4_define_flag_if([locations]) # Whether locations are tracked.
|
b4_define_flag_if([locations]) # Whether locations are tracked.
|
||||||
b4_define_flag_if([pure]) # Whether the interface is pure.
|
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)
|
# 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],
|
m4_define([b4_token_enums_defines],
|
||||||
[b4_token_enums($@)b4_token_defines($@)
|
[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6830,9 +6830,12 @@ different diagnostics to be generated, and may change behavior in
|
|||||||
other minor ways. Most importantly, imitate Yacc's output
|
other minor ways. Most importantly, imitate Yacc's output
|
||||||
file name conventions, so that the parser output file is called
|
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.c}, and the other outputs are called @file{y.output} and
|
||||||
@file{y.tab.h}. Thus, the following shell script can substitute
|
@file{y.tab.h}.
|
||||||
for Yacc, and the Bison distribution contains such a script for
|
Also, if generating an @acronym{LALR}(1) parser in C, generate @code{#define}
|
||||||
compatibility with @acronym{POSIX}:
|
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
|
@example
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ Operation modes:\n\
|
|||||||
-h, --help display this help and exit\n\
|
-h, --help display this help and exit\n\
|
||||||
-V, --version output version information and exit\n\
|
-V, --version output version information and exit\n\
|
||||||
--print-localedir output directory containing locale-dependent data\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);
|
putc ('\n', stdout);
|
||||||
|
|
||||||
fputs (_("\
|
fputs (_("\
|
||||||
|
|||||||
@@ -590,6 +590,7 @@ prepare (void)
|
|||||||
MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
|
MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
|
||||||
MUSCLE_INSERT_BOOL ("pure_flag", pure_parser);
|
MUSCLE_INSERT_BOOL ("pure_flag", pure_parser);
|
||||||
MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
|
MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
|
||||||
|
MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
|
||||||
|
|
||||||
/* File names. */
|
/* File names. */
|
||||||
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
|
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
|
||||||
|
|||||||
@@ -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
|
# Found in GCJ: they expect the tokens to be defined before the user
|
||||||
# prologue, so that they can use the token definitions in it.
|
# 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);
|
void yyerror (const char *s);
|
||||||
int yylex (void);
|
int yylex (void);
|
||||||
|
#ifndef MY_TOKEN
|
||||||
|
# error "MY_TOKEN not defined."
|
||||||
|
#endif
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%union
|
%union
|
||||||
{
|
{
|
||||||
int val;
|
int val;
|
||||||
};
|
};
|
||||||
%{
|
%token MY_TOKEN
|
||||||
#ifndef MY_TOKEN
|
%%
|
||||||
# error "MY_TOKEN not defined."
|
exp: MY_TOKEN;
|
||||||
#endif
|
%%
|
||||||
|
]])
|
||||||
|
|
||||||
|
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
|
%token MY_TOKEN
|
||||||
%%
|
%%
|
||||||
exp: MY_TOKEN;
|
exp: MY_TOKEN;
|
||||||
|
|||||||
Reference in New Issue
Block a user