Don't put the pre-prologue in the header file. For the yacc.c code

file and the glr.c header and code files, move the pre-prologue before
the token definitions.  Add new %before-definitions and
%after-definitions to declare code that will go in both the header file
and code file.  Discussed at
<http://lists.gnu.org/archive/html/bison-patches/2005-12/msg00000.html>,
<http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00016.html>,
and
<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00055.html>.
* NEWS (2.3+): Describe these changes.
* data/glr.c (b4_pre_prologue): Move from within to before...
(b4_shared_declarations): ... this.
Add new b4_before_definitions before b4_token_enums.
Add new b4_after_definitions at the end.
* data/glr.cc (b4_pre_prologue): Replace with...
(b4_before_definitions): ... this in the header file.
(b4_after_definitions): New near the end of the header file.
* data/lalr1.cc (b4_pre_prologue): Move from the header file to the
code file right before including the header file.
(b4_before_definitions): New in the previous position of
b4_pre_prologue in the header file.
(b4_after_definitions): New near the end of the header file.
* data/yacc.c: Clean up some m4 quoting especially in the header file.
(b4_token_enums_defines): In the code file, move to right before
YYSTYPE for consistency with the header file.
(b4_before_definitions): New right before b4_token_enums_defines in
both the header and code file.
(b4_after_definitions): New right after YYLTYPE and yylloc in both the
header and code file.
* doc/bison.texinfo (Prologue): Show use of %before-definitions instead
of prologues for %union dependencies.
(Bison Declaration Summary): In %defines description, mention the
effect of %before-definitions and %after-definitions on the header
file.
(Calc++ Parser): Forward declare driver in a %before-definitions rather
than in the pre-prologue so that make check succeeds.
(Bison Symbols): Add entries for %before-definitions and
%after-definitions.
* src/parse-gram.y (PERCENT_BEFORE_DEFINITIONS): New token for
%before-definitions.
(PERCENT_AFTER_DEFINITIONS): New token for %after-definitions.
(declaration): Parse those declarations and append to
b4_before_definitions and b4_after_definitions, respectively.
* src/reader.c (before_definitions, after_definitions): New bools to
track whether those declarations have been seen.
(prologue_augment): Add to the post-prologue if %union,
%before-definitions, or %after-definitions has been seen.
* src/reader.h (before_definitions, after_definitions): New extern's.
* src/scan-gram.l: Scan the new declarations.
* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Place the second
prologue block in a %before-definitions or a %after-definitions based
on whether the %union is declared.
* tests/regression.at (Early token definitions with --yacc, Early token
definitions without --yacc): Move tests for token definitions into the
post-prologue since token names are no longer defined in the
pre-prologue.
This commit is contained in:
Joel E. Denny
2006-06-21 01:37:01 +00:00
parent 203b927414
commit 9bc0dd679f
15 changed files with 903 additions and 590 deletions

View File

@@ -2664,6 +2664,34 @@ can be done with two @var{Prologue} blocks, one before and one after the
@dots{}
@end smallexample
@findex %before-definitions
If you've instructed Bison to generate a header file (@pxref{Table of Symbols,
,%defines}), you probably want @code{#include "ptypes.h"} to appear
in that header file as well.
In that case, use @code{%before-definitions} instead of a @var{Prologue}
section (@pxref{Table of Symbols, ,%before-definitions}):
@smallexample
%@{
#include <stdio.h>
%@}
%before-definitions @{
#include "ptypes.h"
@}
%union @{
long int n;
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
@}
%@{
static void print_token_value (FILE *, int, YYSTYPE);
#define YYPRINT(F, N, L) print_token_value (F, N, L)
%@}
@dots{}
@end smallexample
@node Bison Declarations
@subsection The Bison Declarations Section
@cindex Bison declarations (introduction)
@@ -4199,6 +4227,12 @@ of @code{yylex} in a separate source file, because @code{yylex}
typically needs to be able to refer to the above-mentioned declarations
and to the token type codes. @xref{Token Values, ,Semantic Values of
Tokens}.
@findex %before-definitions
@findex %after-definitions
If you have declared @code{%before-definitions} or @code{%after-definitions},
the output header also contains their code.
@xref{Table of Symbols, ,%before-definitions}.
@end deffn
@deffn {Directive} %destructor
@@ -7428,19 +7462,21 @@ the grammar for.
@end example
@noindent
@findex %before-definitions
Then come the declarations/inclusions needed to define the
@code{%union}. Because the parser uses the parsing driver and
reciprocally, both cannot include the header of the other. Because the
driver's header needs detailed knowledge about the parser class (in
particular its inner types), it is the parser's header which will simply
use a forward declaration of the driver.
@xref{Table of Symbols, ,%before-definitions}.
@comment file: calc++-parser.yy
@example
%@{
%before-definitions @{
# include <string>
class calcxx_driver;
%@}
@}
@end example
@noindent
@@ -8172,6 +8208,61 @@ $end}, where @var{start} is the start symbol. @xref{Start Decl, , The
Start-Symbol}. It cannot be used in the grammar.
@end deffn
@deffn {Directive} %after-definitions @{@var{code}@}
Specifies code to be inserted both into the header file (if generated;
@pxref{Table of Symbols, ,%defines}) and into the code file after any
Bison-generated definitions.
For details, @xref{Table of Symbols, ,%before-definitions}.
@end deffn
@deffn {Directive} %before-definitions @{@var{code}@}
Specifies code to be inserted both into the header file (if generated;
@pxref{Table of Symbols, ,%defines}) and into the code file before any
Bison-generated definitions.
@cindex Prologue
@findex %after-definitions
@findex %union
For example, in your grammar file:
@smallexample
%@{
/* A pre-prologue block. For Yacc portability, Bison does not put
* this in the header file. In the code file, Bison inserts it
* before any %before-definitions blocks. */
%@}
%before-definitions @{
/* Bison inserts this into both the header file and code file. In
* both files, the point of insertion is before any Bison-generated
* token, semantic type, location type, and class definitions.
* This is a good place to define %union dependencies, for
* example. */
@}
%union @{
/* The first %union, %before-definitions, or %after-definitions
* in your grammar file separates the pre-prologue blocks from the
* post-prologue blocks. */
@}
%after-definitions @{
/* If you want something in the header file and in the code file
* and it depends on any of the Bison-generated definitions in the
* header file, put it here. */
@}
%@{
/* A post-prologue block. If you want something in the code file
* but not in the header file and it depends on Bison-generated
* definitions, put it here. In the code file, Bison inserts it
* after any %after-definitions blocks. */
%@}
@end smallexample
@xref{Prologue, ,The Prologue}.
@end deffn
@deffn {Directive} %debug
Equip the parser for debugging. @xref{Decl Summary}.
@end deffn
@deffn {Directive} %debug
Equip the parser for debugging. @xref{Decl Summary}.
@end deffn