mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-12 22:03:02 +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:
54
NEWS
54
NEWS
@@ -9,6 +9,60 @@ Changes in version 2.3+:
|
||||
helps to sanitize the global namespace during preprocessing, but POSIX Yacc
|
||||
requires them. Bison still generates an enum for token names in all cases.
|
||||
|
||||
* Handling of prologue blocks is now more consistent but potentially backward
|
||||
incompatible.
|
||||
|
||||
As before, you declare prologue blocks in your grammar file with the
|
||||
`%{ ... %}' syntax. To generate the pre-prologue, Bison concatenates all
|
||||
prologue blocks that you've declared before any %union. If you've declared a
|
||||
%union, Bison concatenates all prologue blocks that you've declared after it
|
||||
to generate the post-prologue. (The new %before-definitions and
|
||||
%after-definitions have a similar effect as %union on the prologues. See
|
||||
below.)
|
||||
|
||||
Previous versions of Bison inserted the pre-prologue into both the header
|
||||
file and the code file in all cases except for LALR(1) parsers in C. In the
|
||||
latter case, Bison inserted it only into the code file. For parsers in C++,
|
||||
the point of insertion was before any token definitions (which associate
|
||||
token numbers with names). For parsers in C, the point of insertion was
|
||||
after the token definitions.
|
||||
|
||||
Now, Bison never inserts the pre-prologue into the header file. In the code
|
||||
file, it always inserts it before the token definitions.
|
||||
|
||||
* Bison now provides the %before-definitions and %after-definitions directives.
|
||||
|
||||
For example, in your grammar file:
|
||||
|
||||
%{
|
||||
/* A pre-prologue block. For Yacc portability, Bison no longer puts 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 {
|
||||
/* With previous versions of Bison, the first %union in your grammar file
|
||||
* separated the pre-prologue blocks from the post-prologue blocks. Now,
|
||||
* the first %union, %before-definitions, or %after-definitions does
|
||||
* that. */
|
||||
}
|
||||
%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. */
|
||||
%}
|
||||
|
||||
* The option `--report=look-ahead' has been changed to `--report=lookahead'.
|
||||
The old spelling still works, but is not documented and may be removed
|
||||
in a future release.
|
||||
|
||||
Reference in New Issue
Block a user