From d61c57b70c64f8df79be329a519ca8e4800dadfa Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 5 Nov 2001 09:12:38 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 +++++++ doc/bison.info-1 | 2 +- doc/bison.texinfo | 23 +++++++++++++---------- doc/stamp-vti | 2 +- doc/version.texi | 2 +- src/reader.c | 16 +++++++++++----- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index c391cafe..cbb8e1cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-11-05 Akim Demaille + + * 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 * src/getargs.c (longopts): Support `--output'. getopt is now diff --git a/doc/bison.info-1 b/doc/bison.info-1 index 894f8032..6f3a9a71 100644 --- a/doc/bison.info-1 +++ b/doc/bison.info-1 @@ -34,7 +34,7 @@ File: bison.info, Node: Top, Next: Introduction, Up: (dir) Bison ***** - This manual documents version 1.30a of Bison, updated 4 November + This manual documents version 1.30a of Bison, updated 5 November 2001. * Menu: diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 73a43d6d..d0a44bb1 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -855,11 +855,12 @@ The C declarations section (@pxref{C Declarations, ,The C Declarations Section}) 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}. @@ -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, 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 @@ -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 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: diff --git a/doc/stamp-vti b/doc/stamp-vti index 5f289e58..2a4a4194 100644 --- a/doc/stamp-vti +++ b/doc/stamp-vti @@ -1,4 +1,4 @@ -@set UPDATED 4 November 2001 +@set UPDATED 5 November 2001 @set UPDATED-MONTH November 2001 @set EDITION 1.30a @set VERSION 1.30a diff --git a/doc/version.texi b/doc/version.texi index 5f289e58..2a4a4194 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -1,4 +1,4 @@ -@set UPDATED 4 November 2001 +@set UPDATED 5 November 2001 @set UPDATED-MONTH November 2001 @set EDITION 1.30a @set VERSION 1.30a diff --git a/src/reader.c b/src/reader.c index 4e84c774..5cfa424b 100644 --- a/src/reader.c +++ b/src/reader.c @@ -711,6 +711,13 @@ parse_union_decl (void) { int c; int count = 0; + 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"); @@ -723,9 +730,9 @@ parse_union_decl (void) else obstack_1grow (&attrs_obstack, '\n'); - obstack_sgrow (&attrs_obstack, "typedef union"); + obstack_sgrow (&attrs_obstack, prologue); if (defines_flag) - obstack_sgrow (&defines_obstack, "typedef union"); + obstack_sgrow (&defines_obstack, prologue); c = getc (finput); @@ -760,9 +767,9 @@ parse_union_decl (void) count--; if (count <= 0) { - obstack_sgrow (&attrs_obstack, " YYSTYPE;\n"); + obstack_sgrow (&attrs_obstack, epilogue); if (defines_flag) - obstack_sgrow (&defines_obstack, " YYSTYPE;\n"); + obstack_sgrow (&defines_obstack, epilogue); /* JF don't choke on trailing semi */ c = skip_white_space (); if (c != ';') @@ -1955,7 +1962,6 @@ reader (void) /* 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\ -- 2.50.0