mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user