mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Similar to the recently removed %before-header, add %code-top as the
alternative to the pre-prologue. Mentioned at <http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00063.html>. Also, let the prologue alternatives appear in the grammar section. * src/parse-gram.y (PERCENT_CODE_TOP): New token. (prologue_declaration): Move the existing prologue alternatives to... (grammar_declaration): ... here and add %code-top. * src/scan-gram.l (PERCENT_CODE_TOP): New token. Clean up and extend documentation for the prologue alternatives. * NEWS (2.3a+): Describe prologue alternatives. * doc/bison.texinfo (Prologue): Move discussion of prologue alternatives to... (Prologue Alternatives): ... this new section, and extend it to discuss all 4 directives in detail. (Bison Symbols): Clean up discussion of prologue alternatives and add %code-top.
This commit is contained in:
20
ChangeLog
20
ChangeLog
@@ -1,3 +1,23 @@
|
|||||||
|
2006-10-16 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||||
|
|
||||||
|
Similar to the recently removed %before-header, add %code-top as the
|
||||||
|
alternative to the pre-prologue. Mentioned at
|
||||||
|
<http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00063.html>.
|
||||||
|
Also, let the prologue alternatives appear in the grammar section.
|
||||||
|
* src/parse-gram.y (PERCENT_CODE_TOP): New token.
|
||||||
|
(prologue_declaration): Move the existing prologue alternatives to...
|
||||||
|
(grammar_declaration): ... here and add %code-top.
|
||||||
|
* src/scan-gram.l (PERCENT_CODE_TOP): New token.
|
||||||
|
|
||||||
|
Clean up and extend documentation for the prologue alternatives.
|
||||||
|
* NEWS (2.3a+): Describe prologue alternatives.
|
||||||
|
* doc/bison.texinfo (Prologue): Move discussion of prologue
|
||||||
|
alternatives to...
|
||||||
|
(Prologue Alternatives): ... this new section, and extend it to discuss
|
||||||
|
all 4 directives in detail.
|
||||||
|
(Bison Symbols): Clean up discussion of prologue alternatives and add
|
||||||
|
%code-top.
|
||||||
|
|
||||||
2006-10-16 Juan Manuel Guerrero <juan.guerrero@gmx.de>
|
2006-10-16 Juan Manuel Guerrero <juan.guerrero@gmx.de>
|
||||||
|
|
||||||
DJGPP specific issues.
|
DJGPP specific issues.
|
||||||
|
|||||||
68
NEWS
68
NEWS
@@ -6,6 +6,74 @@ Changes in version 2.3a+ (????-??-??):
|
|||||||
* The -g and --graph options now output graphs in Graphviz DOT format,
|
* The -g and --graph options now output graphs in Graphviz DOT format,
|
||||||
not VCG format.
|
not VCG format.
|
||||||
|
|
||||||
|
* The Yacc prologue alternatives from Bison 2.3a have been rewritten as the
|
||||||
|
following directives:
|
||||||
|
|
||||||
|
1. %code {CODE}
|
||||||
|
|
||||||
|
Other than semantic actions, this is probably the most common place you
|
||||||
|
should write verbatim code for the parser implementation. For C/C++, it
|
||||||
|
replaces the traditional Yacc prologue, `%{CODE%}', for most purposes.
|
||||||
|
For Java, it inserts your CODE into the parser class. Compare with:
|
||||||
|
|
||||||
|
- `%{CODE%}' appearing after the first `%union {CODE}' in a C/C++
|
||||||
|
based grammar file. While Bison will continue to support `%{CODE%}'
|
||||||
|
for backward compatibility, `%code {CODE}' is cleaner as its
|
||||||
|
functionality does not depend on its position in the grammar file
|
||||||
|
relative to any `%union {CODE}'. Specifically, `%code {CODE}'
|
||||||
|
always inserts your CODE into the parser code file after the usual
|
||||||
|
contents of the parser header file.
|
||||||
|
- `%after-header {CODE}', which only Bison 2.3a supported.
|
||||||
|
|
||||||
|
2. %requires {CODE}
|
||||||
|
|
||||||
|
This is the right place to write dependency code for externally exposed
|
||||||
|
definitions required by Bison. For C/C++, such exposed definitions are
|
||||||
|
those usually appearing in the parser header file. Thus, this is the
|
||||||
|
right place to define types referenced in `%union {CODE}' directives,
|
||||||
|
and it is the right place to override Bison's default YYSTYPE and
|
||||||
|
YYLTYPE definitions. For Java, this is the right place to write import
|
||||||
|
directives. Compare with:
|
||||||
|
|
||||||
|
- `%{CODE%}' appearing before the first `%union {CODE}' in a C/C++
|
||||||
|
based grammar file. Unlike `%{CODE%}', `%requires {CODE}' inserts
|
||||||
|
your CODE both into the parser code file and into the parser header
|
||||||
|
file since Bison's required definitions should depend on it in both
|
||||||
|
places.
|
||||||
|
- `%start-header {CODE}', which only Bison 2.3a supported.
|
||||||
|
|
||||||
|
3. %provides {CODE}
|
||||||
|
|
||||||
|
This is the right place to write additional definitions you would like
|
||||||
|
Bison to expose externally. For C/C++, this directive inserts your CODE
|
||||||
|
both into the parser header file and into the parser code file after
|
||||||
|
Bison's required definitions. For Java, it inserts your CODE into the
|
||||||
|
parser java file after the parser class. Compare with:
|
||||||
|
|
||||||
|
- `%end-header {CODE}', which only Bison 2.3a supported.
|
||||||
|
|
||||||
|
4. %code-top {CODE}
|
||||||
|
|
||||||
|
Occasionally for C/C++ it is desirable to insert code near the top of
|
||||||
|
the parser code file. For example:
|
||||||
|
|
||||||
|
%code-top {
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
For Java, `%code-top {CODE}' is currently unused. Compare with:
|
||||||
|
|
||||||
|
- `%{CODE%}' appearing before the first `%union {CODE}' in a C/C++
|
||||||
|
based grammar file. `%code-top {CODE}' is cleaner as its
|
||||||
|
functionality does not depend on its position in the grammar file
|
||||||
|
relative to any `%union {CODE}'.
|
||||||
|
- `%before-header {CODE}', which only Bison 2.3a supported.
|
||||||
|
|
||||||
|
If you have multiple occurrences of any one of the above four directives,
|
||||||
|
Bison will concatenate the contents in the order they appear in the grammar
|
||||||
|
file.
|
||||||
|
|
||||||
Changes in version 2.3a, 2006-09-13:
|
Changes in version 2.3a, 2006-09-13:
|
||||||
|
|
||||||
* Instead of %union, you can define and use your own union type
|
* Instead of %union, you can define and use your own union type
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ Bison Grammar Files
|
|||||||
Outline of a Bison Grammar
|
Outline of a Bison Grammar
|
||||||
|
|
||||||
* Prologue:: Syntax and usage of the prologue.
|
* Prologue:: Syntax and usage of the prologue.
|
||||||
|
* Prologue Alternatives:: Syntax and usage of alternatives to the prologue.
|
||||||
* Bison Declarations:: Syntax and usage of the Bison declarations section.
|
* Bison Declarations:: Syntax and usage of the Bison declarations section.
|
||||||
* Grammar Rules:: Syntax and usage of the grammar rules section.
|
* Grammar Rules:: Syntax and usage of the grammar rules section.
|
||||||
* Epilogue:: Syntax and usage of the epilogue.
|
* Epilogue:: Syntax and usage of the epilogue.
|
||||||
@@ -2616,6 +2617,7 @@ continues until end of line.
|
|||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Prologue:: Syntax and usage of the prologue.
|
* Prologue:: Syntax and usage of the prologue.
|
||||||
|
* Prologue Alternatives:: Syntax and usage of alternatives to the prologue.
|
||||||
* Bison Declarations:: Syntax and usage of the Bison declarations section.
|
* Bison Declarations:: Syntax and usage of the Bison declarations section.
|
||||||
* Grammar Rules:: Syntax and usage of the grammar rules section.
|
* Grammar Rules:: Syntax and usage of the grammar rules section.
|
||||||
* Epilogue:: Syntax and usage of the epilogue.
|
* Epilogue:: Syntax and usage of the epilogue.
|
||||||
@@ -2674,16 +2676,128 @@ of feature test macros like @code{_GNU_SOURCE} or
|
|||||||
feature test macros can affect the behavior of Bison-generated
|
feature test macros can affect the behavior of Bison-generated
|
||||||
@code{#include} directives.
|
@code{#include} directives.
|
||||||
|
|
||||||
@findex %requires
|
@node Prologue Alternatives
|
||||||
|
@subsection Prologue Alternatives
|
||||||
|
@cindex Prologue Alternatives
|
||||||
|
|
||||||
@findex %code
|
@findex %code
|
||||||
If you've instructed Bison to generate a header file (@pxref{Table of Symbols,
|
@findex %requires
|
||||||
,%defines}), you probably want @code{#include "ptypes.h"} to appear
|
@findex %provides
|
||||||
in that header file as well.
|
@findex %code-top
|
||||||
In that case, use @code{%requires}, @code{%provides}, and
|
The functionality of @var{Prologue} sections can often be subtle and
|
||||||
@code{%code} instead of @var{Prologue} sections
|
inflexible.
|
||||||
(@pxref{Table of Symbols, ,%requires}):
|
As an alternative, Bison provides a set of more explicit directives:
|
||||||
|
@code{%code-top}, @code{%requires}, @code{%provides}, and @code{%code}.
|
||||||
|
@xref{Table of Symbols}.
|
||||||
|
|
||||||
|
Look again at the example of the previous section:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
|
%@{
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
#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
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
Notice that there are two @var{Prologue} sections here, but there's a subtle
|
||||||
|
distinction between their functionality.
|
||||||
|
For example, if you decide to override Bison's default definition for
|
||||||
|
@code{YYLTYPE}, in which @var{Prologue} section should you write your new
|
||||||
|
definition?
|
||||||
|
You should write it in the first since Bison will insert that code into the
|
||||||
|
parser code file @emph{before} the default @code{YYLTYPE} definition.
|
||||||
|
In which @var{Prologue} section should you prototype an internal function,
|
||||||
|
@code{trace_token}, that accepts @code{YYLTYPE} and @code{yytokentype} as
|
||||||
|
arguments?
|
||||||
|
You should prototype it in the second since Bison will insert that code
|
||||||
|
@emph{after} the @code{YYLTYPE} and @code{yytokentype} definitions.
|
||||||
|
|
||||||
|
This distinction in functionality between the two @var{Prologue} sections is
|
||||||
|
established by the appearance of the @code{%union} between them.
|
||||||
|
This behavior raises several questions.
|
||||||
|
First, why should the position of a @code{%union} affect definitions related to
|
||||||
|
@code{YYLTYPE} and @code{yytokentype}?
|
||||||
|
Second, what if there is no @code{%union}?
|
||||||
|
In that case, the second kind of @var{Prologue} section is not available.
|
||||||
|
This behavior is not intuitive.
|
||||||
|
|
||||||
|
To avoid this subtle @code{%union} dependency, rewrite the example using
|
||||||
|
@code{%code-top} and @code{%code}.
|
||||||
|
Let's go ahead and add the new @code{YYLTYPE} definition and the
|
||||||
|
@code{trace_token} prototype at the same time:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
%code-top @{
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
/* The following code really belongs in a %requires; see below. */
|
||||||
|
#include "ptypes.h"
|
||||||
|
#define YYLTYPE YYLTYPE
|
||||||
|
typedef struct YYLTYPE
|
||||||
|
@{
|
||||||
|
int first_line;
|
||||||
|
int first_column;
|
||||||
|
int last_line;
|
||||||
|
int last_column;
|
||||||
|
char *filename;
|
||||||
|
@} YYLTYPE;
|
||||||
|
@}
|
||||||
|
|
||||||
|
%union @{
|
||||||
|
long int n;
|
||||||
|
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
||||||
|
@}
|
||||||
|
|
||||||
|
%code @{
|
||||||
|
static void print_token_value (FILE *, int, YYSTYPE);
|
||||||
|
#define YYPRINT(F, N, L) print_token_value (F, N, L)
|
||||||
|
static void trace_token (enum yytokentype token, YYLTYPE loc);
|
||||||
|
@}
|
||||||
|
|
||||||
|
@dots{}
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
In this way, @code{%code-top} and @code{%code} achieve the same functionality
|
||||||
|
as the two kinds of @var{Prologue} sections, but it's always explicit which
|
||||||
|
kind you intend.
|
||||||
|
Moreover, both kinds are always available even in the absence of @code{%union}.
|
||||||
|
|
||||||
|
The first @var{Prologue} section above now logically contains two parts.
|
||||||
|
The first two lines need to appear in the parser code file.
|
||||||
|
The fourth line is required by @code{YYSTYPE} and thus also needs to appear in
|
||||||
|
the parser code file.
|
||||||
|
However, if you've instructed Bison to generate a parser header file
|
||||||
|
(@pxref{Table of Symbols, ,%defines}), you probably want the third line to
|
||||||
|
appear before the @code{YYSTYPE} definition in that header file as well.
|
||||||
|
Also, the @code{YYLTYPE} definition should appear in the parser header file to
|
||||||
|
override the default @code{YYLTYPE} definition there.
|
||||||
|
|
||||||
|
In other words, in the first @var{Prologue} section, all but the first two
|
||||||
|
lines are dependency code for externally exposed definitions (@code{YYSTYPE}
|
||||||
|
and @code{YYLTYPE}) required by Bison.
|
||||||
|
Thus, they belong in one or more @code{%requires}:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
%code-top @{
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
@}
|
||||||
|
|
||||||
%requires @{
|
%requires @{
|
||||||
#include "ptypes.h"
|
#include "ptypes.h"
|
||||||
@}
|
@}
|
||||||
@@ -2692,9 +2806,76 @@ In that case, use @code{%requires}, @code{%provides}, and
|
|||||||
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
||||||
@}
|
@}
|
||||||
|
|
||||||
%code @{
|
%requires @{
|
||||||
#include <stdio.h>
|
#define YYLTYPE YYLTYPE
|
||||||
|
typedef struct YYLTYPE
|
||||||
|
@{
|
||||||
|
int first_line;
|
||||||
|
int first_column;
|
||||||
|
int last_line;
|
||||||
|
int last_column;
|
||||||
|
char *filename;
|
||||||
|
@} YYLTYPE;
|
||||||
|
@}
|
||||||
|
|
||||||
|
%code @{
|
||||||
|
static void print_token_value (FILE *, int, YYSTYPE);
|
||||||
|
#define YYPRINT(F, N, L) print_token_value (F, N, L)
|
||||||
|
static void trace_token (enum yytokentype token, YYLTYPE loc);
|
||||||
|
@}
|
||||||
|
|
||||||
|
@dots{}
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
Now Bison will insert @code{#include "ptypes.h"} and the new @code{YYLTYPE}
|
||||||
|
definition before the Bison-generated @code{YYSTYPE} and @code{YYLTYPE}
|
||||||
|
definitions in both the parser code file and the parser header file.
|
||||||
|
(By the same reasoning, @code{%requires} would also be the appropriate place to
|
||||||
|
write your own definition for @code{YYSTYPE}.)
|
||||||
|
|
||||||
|
At some point while developing your parser, you might decide to provide
|
||||||
|
@code{trace_token} to modules that are external to your parser.
|
||||||
|
Thus, you might wish for Bison to insert the prototype into both the parser
|
||||||
|
header file and the parser code file.
|
||||||
|
Since this function is not a dependency of any Bison-required definition (such
|
||||||
|
as @code{YYSTYPE}), it doesn't make sense to move its prototype to a
|
||||||
|
@code{%requires}.
|
||||||
|
More importantly, since it depends upon @code{YYLTYPE} and @code{yytokentype},
|
||||||
|
@code{%requires} is not sufficient.
|
||||||
|
Instead, move its prototype from the @code{%code} to a @code{%provides}:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
%code-top @{
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
@}
|
||||||
|
|
||||||
|
%requires @{
|
||||||
|
#include "ptypes.h"
|
||||||
|
@}
|
||||||
|
%union @{
|
||||||
|
long int n;
|
||||||
|
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
||||||
|
@}
|
||||||
|
|
||||||
|
%requires @{
|
||||||
|
#define YYLTYPE YYLTYPE
|
||||||
|
typedef struct YYLTYPE
|
||||||
|
@{
|
||||||
|
int first_line;
|
||||||
|
int first_column;
|
||||||
|
int last_line;
|
||||||
|
int last_column;
|
||||||
|
char *filename;
|
||||||
|
@} YYLTYPE;
|
||||||
|
@}
|
||||||
|
|
||||||
|
%provides @{
|
||||||
|
void trace_token (enum yytokentype token, YYLTYPE loc);
|
||||||
|
@}
|
||||||
|
|
||||||
|
%code @{
|
||||||
static void print_token_value (FILE *, int, YYSTYPE);
|
static void print_token_value (FILE *, int, YYSTYPE);
|
||||||
#define YYPRINT(F, N, L) print_token_value (F, N, L)
|
#define YYPRINT(F, N, L) print_token_value (F, N, L)
|
||||||
@}
|
@}
|
||||||
@@ -2702,6 +2883,49 @@ In that case, use @code{%requires}, @code{%provides}, and
|
|||||||
@dots{}
|
@dots{}
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
Bison will insert the @code{trace_token} prototype into both the parser header
|
||||||
|
file and the parser code file after the definitions for @code{yytokentype},
|
||||||
|
@code{YYLTYPE}, and @code{YYSTYPE}.
|
||||||
|
|
||||||
|
The above examples are careful to write directives in an order that reflects
|
||||||
|
the layout of the generated parser code and header files:
|
||||||
|
@code{%code-top}, @code{%requires}, @code{%provides}, and then @code{%code}.
|
||||||
|
While your grammar files will generally be easier to read if you also follow
|
||||||
|
this order, Bison does not require it.
|
||||||
|
Instead, Bison lets you choose an organization that makes sense to you.
|
||||||
|
|
||||||
|
Any of these directives may be declared multiple times in the grammar file.
|
||||||
|
In that case, Bison concatenates the contained code in declaration order.
|
||||||
|
This is the only way in which the position of one of these directives within
|
||||||
|
the grammar file affects its functionality.
|
||||||
|
|
||||||
|
The result of the previous two properties is greater flexibility in how you may
|
||||||
|
organize your grammar file.
|
||||||
|
For example, you may organize semantic-type-related directives by semantic
|
||||||
|
type:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
%requires @{ #include "type1.h" @}
|
||||||
|
%union @{ type1 field1; @}
|
||||||
|
%destructor @{ type1_free ($$); @} <field1>
|
||||||
|
%printer @{ type1_print ($$); @} <field1>
|
||||||
|
|
||||||
|
%requires @{ #include "type2.h" @}
|
||||||
|
%union @{ type2 field2; @}
|
||||||
|
%destructor @{ type2_free ($$); @} <field2>
|
||||||
|
%printer @{ type2_print ($$); @} <field2>
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
You could even place each of the above directive groups in the rules section of
|
||||||
|
the grammar file next to the set of rules that uses the associated semantic
|
||||||
|
type.
|
||||||
|
And you don't have to worry that some directive (like a @code{%union}) in the
|
||||||
|
definitions section is going to adversely affect their functionality in some
|
||||||
|
counter-intuitive manner just because it comes first.
|
||||||
|
Such an organization is not possible using @var{Prologue} sections.
|
||||||
|
|
||||||
@node Bison Declarations
|
@node Bison Declarations
|
||||||
@subsection The Bison Declarations Section
|
@subsection The Bison Declarations Section
|
||||||
@cindex Bison declarations (introduction)
|
@cindex Bison declarations (introduction)
|
||||||
@@ -8306,65 +8530,51 @@ Start-Symbol}. It cannot be used in the grammar.
|
|||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Directive} %code @{@var{code}@}
|
@deffn {Directive} %code @{@var{code}@}
|
||||||
Specifies code to be inserted into the code file after the contents of the
|
Other than semantic actions, this is probably the most common place you should
|
||||||
header file.
|
write verbatim code for the parser implementation.
|
||||||
@xref{Table of Symbols, ,%requires}.
|
For C/C++, it replaces the traditional Yacc prologue,
|
||||||
@end deffn
|
@code{%@{@var{code}%@}}, for most purposes.
|
||||||
|
For Java, it inserts code into the parser class.
|
||||||
@deffn {Directive} %provides @{@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.
|
|
||||||
@xref{Table of Symbols, ,%requires}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@deffn {Directive} %requires @{@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
|
@cindex Prologue
|
||||||
@findex %union
|
@findex %union
|
||||||
@findex %provides
|
Compare with @code{%@{@var{code}%@}} (@pxref{Prologue, ,The Prologue})
|
||||||
@findex %code
|
appearing after the first @code{%union @{@var{code}@}} in a C/C++ based grammar
|
||||||
For example, the following declaration order in the grammar file reflects the
|
file.
|
||||||
order in which Bison will output these code blocks. However, you are free to
|
While Bison will continue to support @code{%@{@var{code}%@}} for backward
|
||||||
declare these code blocks in your grammar file in whatever order is most
|
compatibility, @code{%code @{@var{code}@}} is cleaner as its functionality does
|
||||||
convenient for you:
|
not depend on its position in the grammar file relative to any
|
||||||
|
@code{%union @{@var{code}@}}.
|
||||||
|
Specifically, @code{%code @{@var{code}@}} always inserts your @var{code} into
|
||||||
|
the parser code file after the usual contents of the parser header file.
|
||||||
|
|
||||||
|
@xref{Prologue Alternatives}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Directive} %code-top @{@var{code}@}
|
||||||
|
Occasionally for C/C++ it is desirable to insert code near the top of the
|
||||||
|
parser code file.
|
||||||
|
For example:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
%requires @{
|
%code-top @{
|
||||||
/* Bison inserts this block into both the header file and the code
|
#define _GNU_SOURCE
|
||||||
* file. In both files, the point of insertion is before any
|
#include <stdio.h>
|
||||||
* Bison-generated token, semantic type, location type, and class
|
|
||||||
* definitions. This is a good place to define %union
|
|
||||||
* dependencies, for example. */
|
|
||||||
@}
|
|
||||||
%union @{
|
|
||||||
/* Unlike the traditional Yacc prologue blocks, the output order
|
|
||||||
* for %requires, %provides or %code blocks is not affected by their
|
|
||||||
* declaration position relative to any %union in the grammar file. */
|
|
||||||
@}
|
|
||||||
%provides @{
|
|
||||||
/* Bison inserts this block into both the header file and the code
|
|
||||||
* file. In both files, the point of insertion is after the
|
|
||||||
* Bison-generated definitions. This is a good place to declare or
|
|
||||||
* define public functions or data structures that depend on the
|
|
||||||
* Bison-generated definitions. */
|
|
||||||
@}
|
|
||||||
%code @{
|
|
||||||
/* Bison treats this block like a post-prologue block: it inserts
|
|
||||||
* it into the code file after the contents of the header file. It
|
|
||||||
* does *not* insert it into the header file. This is a good place
|
|
||||||
* to declare or define internal functions or data structures that
|
|
||||||
* depend on the Bison-generated definitions. */
|
|
||||||
@}
|
@}
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
If you have multiple occurrences of any one of the above declarations, Bison
|
@noindent
|
||||||
will concatenate the contents in declaration order.
|
For Java, @code{%code-top @{@var{code}@}} is currently unused.
|
||||||
|
|
||||||
@xref{Prologue, ,The Prologue}.
|
@cindex Prologue
|
||||||
|
@findex %union
|
||||||
|
Compare with @code{%@{@var{code}%@}} appearing before the first
|
||||||
|
@code{%union @{@var{code}@}} in a C/C++ based grammar file.
|
||||||
|
@code{%code-top @{@var{code}@}} is cleaner as its functionality does not depend
|
||||||
|
on its position in the grammar file relative to any
|
||||||
|
@code{%union @{@var{code}@}}.
|
||||||
|
|
||||||
|
@xref{Prologue Alternatives}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Directive} %debug
|
@deffn {Directive} %debug
|
||||||
@@ -8490,6 +8700,18 @@ Bison declaration to assign a precedence to a specific rule.
|
|||||||
@xref{Contextual Precedence, ,Context-Dependent Precedence}.
|
@xref{Contextual Precedence, ,Context-Dependent Precedence}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Directive} %provides @{@var{code}@}
|
||||||
|
This is the right place to write additional definitions you would like Bison to
|
||||||
|
expose externally.
|
||||||
|
For C/C++, this directive inserts your @var{code} both into the parser header
|
||||||
|
file (if generated; @pxref{Table of Symbols, ,%defines}) and into the parser
|
||||||
|
code file after Bison's required definitions.
|
||||||
|
For Java, it inserts your @var{code} into the parser java file after the parser
|
||||||
|
class.
|
||||||
|
|
||||||
|
@xref{Prologue Alternatives}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Directive} %pure-parser
|
@deffn {Directive} %pure-parser
|
||||||
Bison declaration to request a pure (reentrant) parser.
|
Bison declaration to request a pure (reentrant) parser.
|
||||||
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
|
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
|
||||||
@@ -8500,6 +8722,29 @@ Require version @var{version} or higher of Bison. @xref{Require Decl, ,
|
|||||||
Require a Version of Bison}.
|
Require a Version of Bison}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Directive} %requires @{@var{code}@}
|
||||||
|
This is the right place to write dependency code for externally exposed
|
||||||
|
definitions required by Bison.
|
||||||
|
For C/C++, such exposed definitions are those usually appearing in the parser
|
||||||
|
header file.
|
||||||
|
Thus, this is the right place to define types referenced in
|
||||||
|
@code{%union @{@var{code}@}} directives, and it is the right place to override
|
||||||
|
Bison's default @code{YYSTYPE} and @code{YYLTYPE} definitions.
|
||||||
|
For Java, this is the right place to write import directives.
|
||||||
|
|
||||||
|
@cindex Prologue
|
||||||
|
@findex %union
|
||||||
|
Compare with @code{%@{@var{code}%@}} (@pxref{Prologue, ,The Prologue})
|
||||||
|
appearing before the first @code{%union @{@var{code}@}} in a C/C++ based
|
||||||
|
grammar file.
|
||||||
|
Unlike @code{%@{@var{code}%@}}, @code{%requires @{@var{code}@}} inserts your
|
||||||
|
@var{code} both into the parser code file and into the parser header file (if
|
||||||
|
generated; @pxref{Table of Symbols, ,%defines}) since Bison's required
|
||||||
|
definitions should depend on it in both places.
|
||||||
|
|
||||||
|
@xref{Prologue Alternatives}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Directive} %right
|
@deffn {Directive} %right
|
||||||
Bison declaration to assign right associativity to token(s).
|
Bison declaration to assign right associativity to token(s).
|
||||||
@xref{Precedence Decl, ,Operator Precedence}.
|
@xref{Precedence Decl, ,Operator Precedence}.
|
||||||
|
|||||||
975
src/parse-gram.c
975
src/parse-gram.c
File diff suppressed because it is too large
Load Diff
166
src/parse-gram.h
166
src/parse-gram.h
@@ -56,46 +56,47 @@
|
|||||||
PERCENT_DPREC = 270,
|
PERCENT_DPREC = 270,
|
||||||
PERCENT_MERGE = 271,
|
PERCENT_MERGE = 271,
|
||||||
PERCENT_CODE = 272,
|
PERCENT_CODE = 272,
|
||||||
PERCENT_DEBUG = 273,
|
PERCENT_CODE_TOP = 273,
|
||||||
PERCENT_DEFAULT_PREC = 274,
|
PERCENT_DEBUG = 274,
|
||||||
PERCENT_DEFINE = 275,
|
PERCENT_DEFAULT_PREC = 275,
|
||||||
PERCENT_DEFINES = 276,
|
PERCENT_DEFINE = 276,
|
||||||
PERCENT_ERROR_VERBOSE = 277,
|
PERCENT_DEFINES = 277,
|
||||||
PERCENT_EXPECT = 278,
|
PERCENT_ERROR_VERBOSE = 278,
|
||||||
PERCENT_EXPECT_RR = 279,
|
PERCENT_EXPECT = 279,
|
||||||
PERCENT_FILE_PREFIX = 280,
|
PERCENT_EXPECT_RR = 280,
|
||||||
PERCENT_GLR_PARSER = 281,
|
PERCENT_FILE_PREFIX = 281,
|
||||||
PERCENT_INITIAL_ACTION = 282,
|
PERCENT_GLR_PARSER = 282,
|
||||||
PERCENT_LEX_PARAM = 283,
|
PERCENT_INITIAL_ACTION = 283,
|
||||||
PERCENT_LOCATIONS = 284,
|
PERCENT_LEX_PARAM = 284,
|
||||||
PERCENT_NAME_PREFIX = 285,
|
PERCENT_LOCATIONS = 285,
|
||||||
PERCENT_NO_DEFAULT_PREC = 286,
|
PERCENT_NAME_PREFIX = 286,
|
||||||
PERCENT_NO_LINES = 287,
|
PERCENT_NO_DEFAULT_PREC = 287,
|
||||||
PERCENT_NONDETERMINISTIC_PARSER = 288,
|
PERCENT_NO_LINES = 288,
|
||||||
PERCENT_OUTPUT = 289,
|
PERCENT_NONDETERMINISTIC_PARSER = 289,
|
||||||
PERCENT_PARSE_PARAM = 290,
|
PERCENT_OUTPUT = 290,
|
||||||
PERCENT_PROVIDES = 291,
|
PERCENT_PARSE_PARAM = 291,
|
||||||
PERCENT_PURE_PARSER = 292,
|
PERCENT_PROVIDES = 292,
|
||||||
PERCENT_PUSH_PARSER = 293,
|
PERCENT_PURE_PARSER = 293,
|
||||||
PERCENT_REQUIRE = 294,
|
PERCENT_PUSH_PARSER = 294,
|
||||||
PERCENT_REQUIRES = 295,
|
PERCENT_REQUIRE = 295,
|
||||||
PERCENT_SKELETON = 296,
|
PERCENT_REQUIRES = 296,
|
||||||
PERCENT_START = 297,
|
PERCENT_SKELETON = 297,
|
||||||
PERCENT_TOKEN_TABLE = 298,
|
PERCENT_START = 298,
|
||||||
PERCENT_VERBOSE = 299,
|
PERCENT_TOKEN_TABLE = 299,
|
||||||
PERCENT_YACC = 300,
|
PERCENT_VERBOSE = 300,
|
||||||
BRACED_CODE = 301,
|
PERCENT_YACC = 301,
|
||||||
CHAR = 302,
|
BRACED_CODE = 302,
|
||||||
EPILOGUE = 303,
|
CHAR = 303,
|
||||||
EQUAL = 304,
|
EPILOGUE = 304,
|
||||||
ID = 305,
|
EQUAL = 305,
|
||||||
ID_COLON = 306,
|
ID = 306,
|
||||||
PERCENT_PERCENT = 307,
|
ID_COLON = 307,
|
||||||
PIPE = 308,
|
PERCENT_PERCENT = 308,
|
||||||
PROLOGUE = 309,
|
PIPE = 309,
|
||||||
SEMICOLON = 310,
|
PROLOGUE = 310,
|
||||||
TYPE = 311,
|
SEMICOLON = 311,
|
||||||
PERCENT_UNION = 312
|
TYPE = 312,
|
||||||
|
PERCENT_UNION = 313
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/* Tokens. */
|
/* Tokens. */
|
||||||
@@ -115,46 +116,47 @@
|
|||||||
#define PERCENT_DPREC 270
|
#define PERCENT_DPREC 270
|
||||||
#define PERCENT_MERGE 271
|
#define PERCENT_MERGE 271
|
||||||
#define PERCENT_CODE 272
|
#define PERCENT_CODE 272
|
||||||
#define PERCENT_DEBUG 273
|
#define PERCENT_CODE_TOP 273
|
||||||
#define PERCENT_DEFAULT_PREC 274
|
#define PERCENT_DEBUG 274
|
||||||
#define PERCENT_DEFINE 275
|
#define PERCENT_DEFAULT_PREC 275
|
||||||
#define PERCENT_DEFINES 276
|
#define PERCENT_DEFINE 276
|
||||||
#define PERCENT_ERROR_VERBOSE 277
|
#define PERCENT_DEFINES 277
|
||||||
#define PERCENT_EXPECT 278
|
#define PERCENT_ERROR_VERBOSE 278
|
||||||
#define PERCENT_EXPECT_RR 279
|
#define PERCENT_EXPECT 279
|
||||||
#define PERCENT_FILE_PREFIX 280
|
#define PERCENT_EXPECT_RR 280
|
||||||
#define PERCENT_GLR_PARSER 281
|
#define PERCENT_FILE_PREFIX 281
|
||||||
#define PERCENT_INITIAL_ACTION 282
|
#define PERCENT_GLR_PARSER 282
|
||||||
#define PERCENT_LEX_PARAM 283
|
#define PERCENT_INITIAL_ACTION 283
|
||||||
#define PERCENT_LOCATIONS 284
|
#define PERCENT_LEX_PARAM 284
|
||||||
#define PERCENT_NAME_PREFIX 285
|
#define PERCENT_LOCATIONS 285
|
||||||
#define PERCENT_NO_DEFAULT_PREC 286
|
#define PERCENT_NAME_PREFIX 286
|
||||||
#define PERCENT_NO_LINES 287
|
#define PERCENT_NO_DEFAULT_PREC 287
|
||||||
#define PERCENT_NONDETERMINISTIC_PARSER 288
|
#define PERCENT_NO_LINES 288
|
||||||
#define PERCENT_OUTPUT 289
|
#define PERCENT_NONDETERMINISTIC_PARSER 289
|
||||||
#define PERCENT_PARSE_PARAM 290
|
#define PERCENT_OUTPUT 290
|
||||||
#define PERCENT_PROVIDES 291
|
#define PERCENT_PARSE_PARAM 291
|
||||||
#define PERCENT_PURE_PARSER 292
|
#define PERCENT_PROVIDES 292
|
||||||
#define PERCENT_PUSH_PARSER 293
|
#define PERCENT_PURE_PARSER 293
|
||||||
#define PERCENT_REQUIRE 294
|
#define PERCENT_PUSH_PARSER 294
|
||||||
#define PERCENT_REQUIRES 295
|
#define PERCENT_REQUIRE 295
|
||||||
#define PERCENT_SKELETON 296
|
#define PERCENT_REQUIRES 296
|
||||||
#define PERCENT_START 297
|
#define PERCENT_SKELETON 297
|
||||||
#define PERCENT_TOKEN_TABLE 298
|
#define PERCENT_START 298
|
||||||
#define PERCENT_VERBOSE 299
|
#define PERCENT_TOKEN_TABLE 299
|
||||||
#define PERCENT_YACC 300
|
#define PERCENT_VERBOSE 300
|
||||||
#define BRACED_CODE 301
|
#define PERCENT_YACC 301
|
||||||
#define CHAR 302
|
#define BRACED_CODE 302
|
||||||
#define EPILOGUE 303
|
#define CHAR 303
|
||||||
#define EQUAL 304
|
#define EPILOGUE 304
|
||||||
#define ID 305
|
#define EQUAL 305
|
||||||
#define ID_COLON 306
|
#define ID 306
|
||||||
#define PERCENT_PERCENT 307
|
#define ID_COLON 307
|
||||||
#define PIPE 308
|
#define PERCENT_PERCENT 308
|
||||||
#define PROLOGUE 309
|
#define PIPE 309
|
||||||
#define SEMICOLON 310
|
#define PROLOGUE 310
|
||||||
#define TYPE 311
|
#define SEMICOLON 311
|
||||||
#define PERCENT_UNION 312
|
#define TYPE 312
|
||||||
|
#define PERCENT_UNION 313
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -163,7 +165,7 @@
|
|||||||
typedef union YYSTYPE
|
typedef union YYSTYPE
|
||||||
{
|
{
|
||||||
/* Line 1535 of yacc.c */
|
/* Line 1535 of yacc.c */
|
||||||
#line 98 "../../src/parse-gram.y"
|
#line 98 "parse-gram.y"
|
||||||
|
|
||||||
symbol *symbol;
|
symbol *symbol;
|
||||||
symbol_list *list;
|
symbol_list *list;
|
||||||
@@ -175,7 +177,7 @@ typedef union YYSTYPE
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Line 1535 of yacc.c */
|
/* Line 1535 of yacc.c */
|
||||||
#line 179 "../../src/parse-gram.h"
|
#line 181 "parse-gram.h"
|
||||||
YYSTYPE;
|
YYSTYPE;
|
||||||
# define YYSTYPE_IS_TRIVIAL 1
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ static int current_prec = 0;
|
|||||||
|
|
||||||
%token
|
%token
|
||||||
PERCENT_CODE "%code"
|
PERCENT_CODE "%code"
|
||||||
|
PERCENT_CODE_TOP "%code-top"
|
||||||
PERCENT_DEBUG "%debug"
|
PERCENT_DEBUG "%debug"
|
||||||
PERCENT_DEFAULT_PREC "%default-prec"
|
PERCENT_DEFAULT_PREC "%default-prec"
|
||||||
PERCENT_DEFINE "%define"
|
PERCENT_DEFINE "%define"
|
||||||
@@ -221,7 +222,6 @@ prologue_declarations:
|
|||||||
prologue_declaration:
|
prologue_declaration:
|
||||||
grammar_declaration
|
grammar_declaration
|
||||||
| "%{...%}" { prologue_augment (translate_code ($1, @1), @1, union_seen); }
|
| "%{...%}" { prologue_augment (translate_code ($1, @1), @1, union_seen); }
|
||||||
| "%code" braceless { prologue_augment ($2, @2, true); }
|
|
||||||
| "%debug" { debug_flag = true; }
|
| "%debug" { debug_flag = true; }
|
||||||
| "%define" STRING content.opt { muscle_insert ($2, $3); }
|
| "%define" STRING content.opt { muscle_insert ($2, $3); }
|
||||||
| "%defines" { defines_flag = true; }
|
| "%defines" { defines_flag = true; }
|
||||||
@@ -245,11 +245,9 @@ prologue_declaration:
|
|||||||
| "%nondeterministic-parser" { nondeterministic_parser = true; }
|
| "%nondeterministic-parser" { nondeterministic_parser = true; }
|
||||||
| "%output" "=" STRING { spec_outfile = $3; }
|
| "%output" "=" STRING { spec_outfile = $3; }
|
||||||
| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
|
| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
|
||||||
| "%provides" braceless { muscle_code_grow ("provides", $2, @2); }
|
|
||||||
| "%pure-parser" { pure_parser = true; }
|
| "%pure-parser" { pure_parser = true; }
|
||||||
| "%push-parser" { push_parser = true; }
|
| "%push-parser" { push_parser = true; }
|
||||||
| "%require" STRING { version_check (&@2, $2); }
|
| "%require" STRING { version_check (&@2, $2); }
|
||||||
| "%requires" braceless { muscle_code_grow ("requires", $2, @2); }
|
|
||||||
| "%skeleton" STRING { skeleton = $2; }
|
| "%skeleton" STRING { skeleton = $2; }
|
||||||
| "%token-table" { token_table_flag = true; }
|
| "%token-table" { token_table_flag = true; }
|
||||||
| "%verbose" { report_flag = report_states; }
|
| "%verbose" { report_flag = report_states; }
|
||||||
@@ -288,6 +286,10 @@ grammar_declaration:
|
|||||||
{
|
{
|
||||||
default_prec = false;
|
default_prec = false;
|
||||||
}
|
}
|
||||||
|
| "%code" braceless { prologue_augment ($2, @2, true); }
|
||||||
|
| "%code-top" braceless { prologue_augment ($2, @2, false); }
|
||||||
|
| "%provides" braceless { muscle_code_grow ("provides", $2, @2); }
|
||||||
|
| "%requires" braceless { muscle_code_grow ("requires", $2, @2); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ grammar_start_symbol_set (symbol *sym, location loc)
|
|||||||
|
|
||||||
/*---------------------------------------------------------------------.
|
/*---------------------------------------------------------------------.
|
||||||
| There are two prologues: one before the first %union and one after. |
|
| There are two prologues: one before the first %union and one after. |
|
||||||
| Augment the one specified by POST. |
|
| Augment the one specified by POST. |
|
||||||
`---------------------------------------------------------------------*/
|
`---------------------------------------------------------------------*/
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ splice (\\[ \f\t\v]*\n)*
|
|||||||
{
|
{
|
||||||
"%binary" return PERCENT_NONASSOC;
|
"%binary" return PERCENT_NONASSOC;
|
||||||
"%code" return PERCENT_CODE;
|
"%code" return PERCENT_CODE;
|
||||||
|
"%code-top" return PERCENT_CODE_TOP;
|
||||||
"%debug" return PERCENT_DEBUG;
|
"%debug" return PERCENT_DEBUG;
|
||||||
"%default"[-_]"prec" return PERCENT_DEFAULT_PREC;
|
"%default"[-_]"prec" return PERCENT_DEFAULT_PREC;
|
||||||
"%define" return PERCENT_DEFINE;
|
"%define" return PERCENT_DEFINE;
|
||||||
|
|||||||
Reference in New Issue
Block a user