* src/reader.c (parse_union_decl): Output yystype/YYSTYPE as we do

with yyltype/YYLTYPE.  This allows inclusion of the generated
header within the parser if the compiler, such as GGC, accepts
multiple equivalent #defines.
This commit is contained in:
Akim Demaille
2001-11-05 09:12:38 +00:00
parent ea57e0a3c4
commit d61c57b70c
6 changed files with 34 additions and 18 deletions

View File

@@ -1,3 +1,10 @@
2001-11-05 Akim Demaille <akim@epita.fr>
* src/reader.c (parse_union_decl): Output yystype/YYSTYPE as we do
with yyltype/YYLTYPE. This allows inclusion of the generated
header within the parser if the compiler, such as GGC, accepts
multiple equivalent #defines.
2001-11-04 Akim Demaille <akim@epita.fr> 2001-11-04 Akim Demaille <akim@epita.fr>
* src/getargs.c (longopts): Support `--output'. getopt is now * src/getargs.c (longopts): Support `--output'. getopt is now

View File

@@ -34,7 +34,7 @@ File: bison.info, Node: Top, Next: Introduction, Up: (dir)
Bison Bison
***** *****
This manual documents version 1.30a of Bison, updated 4 November This manual documents version 1.30a of Bison, updated 5 November
2001. 2001.
* Menu: * Menu:

View File

@@ -855,11 +855,12 @@ The C declarations section (@pxref{C Declarations, ,The C Declarations Section})
preprocessor directives. preprocessor directives.
The @code{#define} directive defines the macro @code{YYSTYPE}, thus The @code{#define} directive defines the macro @code{YYSTYPE}, thus
specifying the C data type for semantic values of both tokens and groupings specifying the C data type for semantic values of both tokens and
(@pxref{Value Type, ,Data Types of Semantic Values}). The Bison parser will use whatever type groupings (@pxref{Value Type, ,Data Types of Semantic Values}). The
@code{YYSTYPE} is defined as; if you don't define it, @code{int} is the Bison parser will use whatever type @code{YYSTYPE} is defined as; if you
default. Because we specify @code{double}, each token and each expression don't define it, @code{int} is the default. Because we specify
has an associated value, which is a floating point number. @code{double}, each token and each expression has an associated value,
which is a floating point number.
The @code{#include} directive is used to declare the exponentiation The @code{#include} directive is used to declare the exponentiation
function @code{pow}. function @code{pow}.
@@ -1066,10 +1067,11 @@ token type is an identifier, that identifier is defined by Bison as a C
macro whose definition is the appropriate number. In this example, macro whose definition is the appropriate number. In this example,
therefore, @code{NUM} becomes a macro for @code{yylex} to use. therefore, @code{NUM} becomes a macro for @code{yylex} to use.
The semantic value of the token (if it has one) is stored into the global The semantic value of the token (if it has one) is stored into the
variable @code{yylval}, which is where the Bison parser will look for it. global variable @code{yylval}, which is where the Bison parser will look
(The C data type of @code{yylval} is @code{YYSTYPE}, which was defined for it. (The C data type of @code{yylval} is @code{YYSTYPE}, which was
at the beginning of the grammar; @pxref{Rpcalc Decls, ,Declarations for @code{rpcalc}}.) defined at the beginning of the grammar; @pxref{Rpcalc Decls,
,Declarations for @code{rpcalc}}.)
A token type code of zero is returned if the end-of-file is encountered. A token type code of zero is returned if the end-of-file is encountered.
(Bison recognizes any nonpositive value as indicating the end of the (Bison recognizes any nonpositive value as indicating the end of the
@@ -2374,7 +2376,8 @@ the numbers associated with @var{x} and @var{y}.
In a simple program it may be sufficient to use the same data type for In a simple program it may be sufficient to use the same data type for
the semantic values of all language constructs. This was true in the the semantic values of all language constructs. This was true in the
RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish Notation Calculator}). RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish
Notation Calculator}).
Bison's default is to use type @code{int} for all semantic values. To Bison's default is to use type @code{int} for all semantic values. To
specify some other type, define @code{YYSTYPE} as a macro, like this: specify some other type, define @code{YYSTYPE} as a macro, like this:

View File

@@ -1,4 +1,4 @@
@set UPDATED 4 November 2001 @set UPDATED 5 November 2001
@set UPDATED-MONTH November 2001 @set UPDATED-MONTH November 2001
@set EDITION 1.30a @set EDITION 1.30a
@set VERSION 1.30a @set VERSION 1.30a

View File

@@ -1,4 +1,4 @@
@set UPDATED 4 November 2001 @set UPDATED 5 November 2001
@set UPDATED-MONTH November 2001 @set UPDATED-MONTH November 2001
@set EDITION 1.30a @set EDITION 1.30a
@set VERSION 1.30a @set VERSION 1.30a

View File

@@ -711,6 +711,13 @@ parse_union_decl (void)
{ {
int c; int c;
int count = 0; int count = 0;
const char *prologue = "\
#ifndef YYSTYPE\n\
typedef union";
const char *epilogue = "\
yystype;\n\
# define YYSTYPE yystype\n\
#endif\n";
if (typed) if (typed)
complain (_("multiple %s declarations"), "%union"); complain (_("multiple %s declarations"), "%union");
@@ -723,9 +730,9 @@ parse_union_decl (void)
else else
obstack_1grow (&attrs_obstack, '\n'); obstack_1grow (&attrs_obstack, '\n');
obstack_sgrow (&attrs_obstack, "typedef union"); obstack_sgrow (&attrs_obstack, prologue);
if (defines_flag) if (defines_flag)
obstack_sgrow (&defines_obstack, "typedef union"); obstack_sgrow (&defines_obstack, prologue);
c = getc (finput); c = getc (finput);
@@ -760,9 +767,9 @@ parse_union_decl (void)
count--; count--;
if (count <= 0) if (count <= 0)
{ {
obstack_sgrow (&attrs_obstack, " YYSTYPE;\n"); obstack_sgrow (&attrs_obstack, epilogue);
if (defines_flag) if (defines_flag)
obstack_sgrow (&defines_obstack, " YYSTYPE;\n"); obstack_sgrow (&defines_obstack, epilogue);
/* JF don't choke on trailing semi */ /* JF don't choke on trailing semi */
c = skip_white_space (); c = skip_white_space ();
if (c != ';') if (c != ';')
@@ -1955,7 +1962,6 @@ reader (void)
/* Read the declaration section. Copy %{ ... %} groups to /* Read the declaration section. Copy %{ ... %} groups to
TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left, TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
etc. found there. */ etc. found there. */
obstack_1grow (&table_obstack, '\n');
obstack_fgrow3 (&table_obstack, "\ obstack_fgrow3 (&table_obstack, "\
/* %s, made from %s\n\ /* %s, made from %s\n\
by GNU bison %s. */\n\ by GNU bison %s. */\n\