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-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>
* src/getargs.c (longopts): Support `--output'. getopt is now
2001-11-04 Akim Demaille <akim@epita.fr>
* src/getargs.c (longopts): Support `--output'. getopt is now
- This manual documents version 1.30a of Bison, updated 4 November
+ This manual documents version 1.30a of Bison, updated 5 November
preprocessor directives.
The @code{#define} directive defines the macro @code{YYSTYPE}, thus
preprocessor directives.
The @code{#define} directive defines the macro @code{YYSTYPE}, thus
-specifying the C data type for semantic values of both tokens and groupings
-(@pxref{Value Type, ,Data Types of Semantic Values}). The Bison parser will use whatever type
-@code{YYSTYPE} is defined as; if you don't define it, @code{int} is the
-default. Because we specify @code{double}, each token and each expression
-has an associated value, which is a floating point number.
+specifying the C data type for semantic values of both tokens and
+groupings (@pxref{Value Type, ,Data Types of Semantic Values}). The
+Bison parser will use whatever type @code{YYSTYPE} is defined as; if you
+don't define it, @code{int} is the default. Because we specify
+@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
function @code{pow}.
The @code{#include} directive is used to declare the exponentiation
function @code{pow}.
macro whose definition is the appropriate number. In this example,
therefore, @code{NUM} becomes a macro for @code{yylex} to use.
macro whose definition is the appropriate number. In this example,
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
-variable @code{yylval}, which is where the Bison parser will look for it.
-(The C data type of @code{yylval} is @code{YYSTYPE}, which was defined
-at the beginning of the grammar; @pxref{Rpcalc Decls, ,Declarations for @code{rpcalc}}.)
+The semantic value of the token (if it has one) is stored into the
+global variable @code{yylval}, which is where the Bison parser will look
+for it. (The C data type of @code{yylval} is @code{YYSTYPE}, which was
+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.
(Bison recognizes any nonpositive value as indicating the end of the
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
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
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
-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
specify some other type, define @code{YYSTYPE} as a macro, like this:
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:
-@set UPDATED 4 November 2001
+@set UPDATED 5 November 2001
@set UPDATED-MONTH November 2001
@set EDITION 1.30a
@set VERSION 1.30a
@set UPDATED-MONTH November 2001
@set EDITION 1.30a
@set VERSION 1.30a
-@set UPDATED 4 November 2001
+@set UPDATED 5 November 2001
@set UPDATED-MONTH November 2001
@set EDITION 1.30a
@set VERSION 1.30a
@set UPDATED-MONTH November 2001
@set EDITION 1.30a
@set VERSION 1.30a
+ const char *prologue = "\
+#ifndef YYSTYPE\n\
+typedef union";
+ const char *epilogue = "\
+ yystype;\n\
+# define YYSTYPE yystype\n\
+#endif\n";
if (typed)
complain (_("multiple %s declarations"), "%union");
if (typed)
complain (_("multiple %s declarations"), "%union");
else
obstack_1grow (&attrs_obstack, '\n');
else
obstack_1grow (&attrs_obstack, '\n');
- obstack_sgrow (&attrs_obstack, "typedef union");
+ obstack_sgrow (&attrs_obstack, prologue);
- obstack_sgrow (&defines_obstack, "typedef union");
+ obstack_sgrow (&defines_obstack, prologue);
count--;
if (count <= 0)
{
count--;
if (count <= 0)
{
- obstack_sgrow (&attrs_obstack, " YYSTYPE;\n");
+ obstack_sgrow (&attrs_obstack, epilogue);
- obstack_sgrow (&defines_obstack, " YYSTYPE;\n");
+ obstack_sgrow (&defines_obstack, epilogue);
/* JF don't choke on trailing semi */
c = skip_white_space ();
if (c != ';')
/* JF don't choke on trailing semi */
c = skip_white_space ();
if (c != ';')
/* Read the declaration section. Copy %{ ... %} groups to
TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
etc. found there. */
/* Read the declaration section. Copy %{ ... %} groups to
TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left,
etc. found there. */
- obstack_1grow (&table_obstack, '\n');
obstack_fgrow3 (&table_obstack, "\
/* %s, made from %s\n\
by GNU bison %s. */\n\
obstack_fgrow3 (&table_obstack, "\
/* %s, made from %s\n\
by GNU bison %s. */\n\