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

@@ -160,8 +160,6 @@ m4_if(b4_prefix, [yy], [],
#define yynerrs b4_prefix[]nerrs
b4_locations_if([#define yylloc b4_prefix[]lloc])])[
]b4_token_enums_defines(b4_tokens)[
/* Copy the first part of user declarations. */
]b4_pre_prologue[
@@ -183,9 +181,15 @@ b4_locations_if([#define yylloc b4_prefix[]lloc])])[
# define YYTOKEN_TABLE ]b4_token_table[
#endif
]m4_ifdef([b4_before_definitions],
[[/* Copy the %before-definitions blocks. */
]b4_before_definitions])[]dnl
b4_token_enums_defines(b4_tokens)[
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
]m4_ifdef([b4_stype],
[typedef union b4_union_name
[[typedef union ]b4_union_name
b4_stype
/* Line __line__ of yacc.c. */
b4_syncline([@oline@], [@ofile@])
@@ -207,14 +211,17 @@ typedef struct YYLTYPE
# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif
])[
#endif])
/* Copy the second part of user declarations. */
m4_ifdef([b4_after_definitions],
[[/* Copy the %after-definitions blocks. */
]b4_after_definitions])[]dnl
[/* Copy the second part of user declarations. */
]b4_post_prologue
/* Line __line__ of yacc.c. */
b4_syncline([@oline@], [@ofile@])[
[/* Line __line__ of yacc.c. */
]b4_syncline([@oline@], [@ofile@])[
#ifdef short
# undef short
@@ -1491,22 +1498,26 @@ b4_defines_if(
b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],dnl '
[1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006])
m4_ifdef([b4_before_definitions],
[[/* Copy the %before-definitions blocks. */
]b4_before_definitions])[]dnl
b4_token_enums_defines(b4_tokens)
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
m4_ifdef([b4_stype],
[typedef union b4_union_name
[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name
b4_stype
/* Line __line__ of yacc.c. */
b4_syncline([@oline@], [@ofile@])
YYSTYPE;],
[typedef int YYSTYPE;])
[typedef int YYSTYPE;])[
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
b4_pure_if([],
]b4_pure_if([],
[extern YYSTYPE b4_prefix[]lval;])
b4_locations_if(
@@ -1523,7 +1534,11 @@ typedef struct YYLTYPE
# define YYLTYPE_IS_TRIVIAL 1
#endif
b4_pure_if([],
]b4_pure_if([],
[extern YYLTYPE b4_prefix[]lloc;])
])dnl b4_locations_if
)dnl b4_locations_if
m4_ifdef([b4_after_definitions],
[[/* Copy the %after-definitions blocks. */
]b4_after_definitions])[]dnl
])dnl b4_defines_if