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

54
NEWS
View File

@@ -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.