mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-15 15:23:02 +00:00
Consolidate the 4 prologue alternative directives (%code, %requires,
%provides, and %code-top) into a single %code directive with an optional qualifier field. Discussed at <http://lists.gnu.org/archive/html/bison-patches/2007-01/msg00012.html>. * NEWS (2.3a+): Rewrite the existing entry for the prologue alternatives. * doc/bison.texinfo (Prologue Alternatives): Update. (Decl Summary): Update to %code "requires" and %code "provides". (Calc++ Parser): Update to %code "requires". (Bison Symbols): Remove entries for %requires, %provides, and %code-top. Rewrite %code entry, and add a %code "QUALIFIER" entry. * data/bison.m4 (b4_user_provides, b4_user_requires): Remove as these are replaced by b4_percent_code_provides and b4_percent_code_requires, which are skeleton-specific. (b4_check_percent_code_qualifiers): New. A skeleton can use this to declare what %code qualifiers it supports and to complain if any other qualifiers were used in the grammar. * data/glr.cc: Update to use b4_user_code([b4_percent_code_requires]) and b4_user_code([b4_percent_code_provides]) in place of b4_user_requires and b4_user_provides. * data/glr.c, data/lalr1.cc, data/push.c, data/yacc.c: Likewise. Add b4_user_code([b4_percent_code_top]) and b4_user_code([b4_percent_code]). Invoke b4_check_percent_code_qualifiers. * src/parse-gram.y (PERCENT_CODE_TOP, PERCENT_PROVIDES, PERCENT_REQUIRES): Remove. (grammar_declaration): Remove RHS's for %code-top, %provides, and %requires. Rewrite the %code RHS as the unqualified form defining the muscle b4_percent_code. Add another RHS for the qualified %code form, which defines muscles of the form b4_percent_code_QUALIFIER and the b4_used_percent_code_qualifiers muscle. * src/scan-gram.l (PERCENT_CODE_TOP, PERCENT_PROVIDES, PERCENT_REQUIRES): Remove. * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Update to use %code "requires" and %code "provides". * tests/input.at (Reject bad %code qualifiers): New.
This commit is contained in:
@@ -2681,17 +2681,20 @@ feature test macros can affect the behavior of Bison-generated
|
||||
@cindex Prologue Alternatives
|
||||
|
||||
@findex %code
|
||||
@findex %requires
|
||||
@findex %provides
|
||||
@findex %code-top
|
||||
@findex %code "requires"
|
||||
@findex %code "provides"
|
||||
@findex %code "top"
|
||||
(The prologue alternatives described here are experimental.
|
||||
More user feedback will help to determine whether they should become permanent
|
||||
features.)
|
||||
|
||||
The functionality of @var{Prologue} sections can often be subtle and
|
||||
inflexible.
|
||||
As an alternative, Bison provides a set of more explicit directives:
|
||||
@code{%code}, @code{%requires}, @code{%provides}, and @code{%code-top}.
|
||||
As an alternative, Bison provides a %code directive with an explicit qualifier
|
||||
field, which identifies the purpose of the code and thus the location(s) where
|
||||
Bison should generate it.
|
||||
For C/C++, the qualifier can be omitted for the default location, or it can be
|
||||
"requires", "provides", or "top".
|
||||
@xref{Table of Symbols,,Bison Symbols}.
|
||||
|
||||
Look again at the example of the previous section:
|
||||
@@ -2723,7 +2726,7 @@ 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.
|
||||
parser source 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?
|
||||
@@ -2739,16 +2742,19 @@ 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}.
|
||||
To avoid this subtle @code{%union} dependency, rewrite the example using a
|
||||
@code{%code "top"} and an unqualified @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 @{
|
||||
%code "top" @{
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
/* The following code really belongs in a %requires; see below. */
|
||||
|
||||
/* WARNING: The following code really belongs
|
||||
* in a %code "requires"; see below. */
|
||||
|
||||
#include "ptypes.h"
|
||||
#define YYLTYPE YYLTYPE
|
||||
typedef struct YYLTYPE
|
||||
@@ -2776,33 +2782,34 @@ Let's go ahead and add the new @code{YYLTYPE} definition and the
|
||||
@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.
|
||||
In this way, @code{%code "top"} and the unqualified @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 @code{%code-top} block above 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.
|
||||
The @code{%code "top"} block above logically contains two parts.
|
||||
The first two lines before the warning need to appear near the top of the
|
||||
parser source code file.
|
||||
The first line after the warning is required by @code{YYSTYPE} and thus also
|
||||
needs to appear in the parser source code file.
|
||||
However, if you've instructed Bison to generate a parser header file
|
||||
(@pxref{Table of Symbols, ,%defines}), you probably want the fourth 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
|
||||
(@pxref{Table of Symbols, ,%defines}), you probably want that line to appear
|
||||
before the @code{YYSTYPE} definition in that header file as well.
|
||||
The @code{YYLTYPE} definition should also appear in the parser header file to
|
||||
override the default @code{YYLTYPE} definition there.
|
||||
|
||||
In other words, in the @code{%code-top} block above, 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}:
|
||||
In other words, in the @code{%code "top"} block above, all but the first two
|
||||
lines are dependency code required by the @code{YYSTYPE} and @code{YYLTYPE}
|
||||
definitions.
|
||||
Thus, they belong in one or more @code{%code "requires"}:
|
||||
|
||||
@smallexample
|
||||
%code-top @{
|
||||
%code "top" @{
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
@}
|
||||
|
||||
%requires @{
|
||||
%code "requires" @{
|
||||
#include "ptypes.h"
|
||||
@}
|
||||
%union @{
|
||||
@@ -2810,7 +2817,7 @@ Thus, they belong in one or more @code{%requires}:
|
||||
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
||||
@}
|
||||
|
||||
%requires @{
|
||||
%code "requires" @{
|
||||
#define YYLTYPE YYLTYPE
|
||||
typedef struct YYLTYPE
|
||||
@{
|
||||
@@ -2834,40 +2841,41 @@ Thus, they belong in one or more @code{%requires}:
|
||||
@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}.)
|
||||
definitions in both the parser source code file and the parser header file.
|
||||
(By the same reasoning, @code{%code "requires"} would also be the appropriate
|
||||
place to write your own definition for @code{YYSTYPE}.)
|
||||
|
||||
When you are writing dependency code for @code{YYSTYPE} and @code{YYLTYPE}, you
|
||||
should prefer @code{%requires} over @code{%code-top} regardless of whether you
|
||||
instruct Bison to generate a parser header file.
|
||||
should prefer @code{%code "requires"} over @code{%code "top"} regardless of
|
||||
whether you instruct Bison to generate a parser header file.
|
||||
When you are writing code that you need Bison to insert only into the parser
|
||||
code file and that has no special need to appear at the top of the code file,
|
||||
you should prefer @code{%code} over @code{%code-top}.
|
||||
source code file and that has no special need to appear at the top of that
|
||||
file, you should prefer the unqualified @code{%code} over @code{%code "top"}.
|
||||
These practices will make the purpose of each block of your code explicit to
|
||||
Bison and to other developers reading your grammar file.
|
||||
Following these practices, we expect @code{%code} and @code{%requires} to be
|
||||
the most important of the four @var{Prologue} alternative directives discussed
|
||||
in this section.
|
||||
Following these practices, we expect the unqualified @code{%code} and
|
||||
@code{%code "requires"} to be the most important of the four @var{Prologue}
|
||||
alternatives discussed in this section.
|
||||
|
||||
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}.
|
||||
header file and the parser source code file.
|
||||
Since this function is not a dependency required by @code{YYSTYPE} or
|
||||
@code{YYLTYPE}, it doesn't make sense to move its prototype to a
|
||||
@code{%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}:
|
||||
@code{%code "requires"} is not sufficient.
|
||||
Instead, move its prototype from the unqualified @code{%code} to a
|
||||
@code{%code "provides"}:
|
||||
|
||||
@smallexample
|
||||
%code-top @{
|
||||
%code "top" @{
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
@}
|
||||
|
||||
%requires @{
|
||||
%code "requires" @{
|
||||
#include "ptypes.h"
|
||||
@}
|
||||
%union @{
|
||||
@@ -2875,7 +2883,7 @@ Instead, move its prototype from the @code{%code} to a @code{%provides}:
|
||||
tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */
|
||||
@}
|
||||
|
||||
%requires @{
|
||||
%code "requires" @{
|
||||
#define YYLTYPE YYLTYPE
|
||||
typedef struct YYLTYPE
|
||||
@{
|
||||
@@ -2887,7 +2895,7 @@ Instead, move its prototype from the @code{%code} to a @code{%provides}:
|
||||
@} YYLTYPE;
|
||||
@}
|
||||
|
||||
%provides @{
|
||||
%code "provides" @{
|
||||
void trace_token (enum yytokentype token, YYLTYPE loc);
|
||||
@}
|
||||
|
||||
@@ -2901,12 +2909,13 @@ Instead, move its prototype from the @code{%code} to a @code{%provides}:
|
||||
|
||||
@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}.
|
||||
file and the parser source 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}.
|
||||
the layout of the generated parser source code and header files:
|
||||
@code{%code "top"}, @code{%code "requires"}, @code{%code "provides"}, and then
|
||||
@code{%code}.
|
||||
While your grammar files may 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.
|
||||
@@ -2922,12 +2931,12 @@ For example, you may organize semantic-type-related directives by semantic
|
||||
type:
|
||||
|
||||
@smallexample
|
||||
%requires @{ #include "type1.h" @}
|
||||
%code "requires" @{ #include "type1.h" @}
|
||||
%union @{ type1 field1; @}
|
||||
%destructor @{ type1_free ($$); @} <field1>
|
||||
%printer @{ type1_print ($$); @} <field1>
|
||||
|
||||
%requires @{ #include "type2.h" @}
|
||||
%code "requires" @{ #include "type2.h" @}
|
||||
%union @{ type2 field2; @}
|
||||
%destructor @{ type2_free ($$); @} <field2>
|
||||
%printer @{ type2_print ($$); @} <field2>
|
||||
@@ -2943,13 +2952,14 @@ counter-intuitive manner just because it comes first.
|
||||
Such an organization is not possible using @var{Prologue} sections.
|
||||
|
||||
This section has been concerned with explaining the advantages of the four
|
||||
@var{Prologue} alternative directives over the original Yacc @var{Prologue}.
|
||||
@var{Prologue} alternatives over the original Yacc @var{Prologue}.
|
||||
However, in most cases when using these directives, you shouldn't need to
|
||||
think about all the low-level ordering issues discussed here.
|
||||
Instead, you should simply use these directives to label each block of your
|
||||
code according to its purpose and let Bison handle the ordering.
|
||||
@code{%code} is the most generic label.
|
||||
Move code to @code{%requires}, @code{%provides}, or @code{%code-top} as needed.
|
||||
Move code to @code{%code "requires"}, @code{%code "provides"}, or
|
||||
@code{%code "top"} as needed.
|
||||
|
||||
@node Bison Declarations
|
||||
@subsection The Bison Declarations Section
|
||||
@@ -4598,11 +4608,11 @@ 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 %requires
|
||||
@findex %provides
|
||||
If you have declared @code{%requires} or @code{%provides}, the output
|
||||
header also contains their code.
|
||||
@xref{Table of Symbols, ,%requires}.
|
||||
@findex %code "requires"
|
||||
@findex %code "provides"
|
||||
If you have declared @code{%code "requires"} or @code{%code "provides"}, the
|
||||
output header also contains their code.
|
||||
@xref{Table of Symbols, ,%code}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %defines @var{defines-file}
|
||||
@@ -7863,18 +7873,18 @@ the grammar for.
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@findex %requires
|
||||
@findex %code "requires"
|
||||
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, ,%requires}.
|
||||
@xref{Table of Symbols, ,%code}.
|
||||
|
||||
@comment file: calc++-parser.yy
|
||||
@example
|
||||
%requires @{
|
||||
%code "requires" @{
|
||||
# include <string>
|
||||
class calcxx_driver;
|
||||
@}
|
||||
@@ -8634,63 +8644,109 @@ Start-Symbol}. It cannot be used in the grammar.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %code @{@var{code}@}
|
||||
Other than semantic actions, this is probably the most common place you should
|
||||
write verbatim code for the parser implementation.
|
||||
It replaces the traditional Yacc prologue,
|
||||
@comment For C/C++, it replaces the traditional Yacc prologue,
|
||||
@code{%@{@var{code}%@}}, for most purposes.
|
||||
@comment For Java, it inserts code into the parser class.
|
||||
@findex %code
|
||||
This is the unqualified form of the @code{%code} directive.
|
||||
It inserts @var{code} verbatim at the default location in the output.
|
||||
That default location is determined by the selected target language and/or
|
||||
parser skeleton.
|
||||
|
||||
@cindex Prologue
|
||||
@findex %union
|
||||
Compare with @code{%@{@var{code}%@}} (@pxref{Prologue, ,The Prologue})
|
||||
appearing after the first @code{%union @{@var{code}@}} in a C/C++ based grammar
|
||||
file.
|
||||
While Bison will continue to support @code{%@{@var{code}%@}} for backward
|
||||
compatibility, @code{%code @{@var{code}@}} is cleaner as its functionality does
|
||||
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.
|
||||
For the current C/C++ skeletons, the default location is the parser source code
|
||||
file after the usual contents of the parser header file.
|
||||
Thus, @code{%code} replaces the traditional Yacc prologue,
|
||||
@code{%@{@var{code}%@}}, for most purposes.
|
||||
For a detailed discussion, see @ref{Prologue Alternatives}.
|
||||
|
||||
(Like all the Yacc prologue alternative directives, this directive is
|
||||
experimental.
|
||||
@comment For Java, the default location is inside the parser class.
|
||||
|
||||
(Like all the Yacc prologue alternatives, this directive is experimental.
|
||||
More user feedback will help to determine whether it should become a permanent
|
||||
feature.)
|
||||
|
||||
@xref{Prologue Alternatives}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %code-top @{@var{code}@}
|
||||
Occasionally it is desirable to insert code near the top of the
|
||||
@comment Occasionally for C/C++ it is desirable to insert code near the top of the
|
||||
parser code file.
|
||||
@deffn {Directive} %code "@var{qualifier}" @{@var{code}@}
|
||||
This is the qualified form of the @code{%code} directive.
|
||||
If you need to specify location-sensitive verbatim @var{code} that does not
|
||||
belong at the default location selected by the unqualified @code{%code} form,
|
||||
use this form instead.
|
||||
|
||||
@var{qualifier} identifies the purpose of @var{code} and thus the location(s)
|
||||
where Bison should generate it.
|
||||
Not all values of @var{qualifier} are available for all target languages:
|
||||
|
||||
@itemize @bullet
|
||||
@findex %code "requires"
|
||||
@item "requires"
|
||||
|
||||
@itemize @bullet
|
||||
@item Language(s): C, C++
|
||||
|
||||
@item Purpose: This is the best place to write dependency code required for
|
||||
@code{YYSTYPE} and @code{YYLTYPE}.
|
||||
In other words, it's the best place to define types referenced in @code{%union}
|
||||
directives, and it's the best place to override Bison's default @code{YYSTYPE}
|
||||
and @code{YYLTYPE} definitions.
|
||||
|
||||
@item Location(s): The parser header file and the parser source code file
|
||||
before the Bison-generated @code{YYSTYPE} and @code{YYLTYPE} definitions.
|
||||
@end itemize
|
||||
|
||||
@item "provides"
|
||||
@findex %code "provides"
|
||||
|
||||
@itemize @bullet
|
||||
@item Language(s): C, C++
|
||||
|
||||
@item Purpose: This is the best place to write additional definitions and
|
||||
declarations that should be provided to other modules.
|
||||
|
||||
@item Location(s): The parser header file and the parser source code file after
|
||||
the Bison-generated @code{YYSTYPE}, @code{YYLTYPE}, and token definitions.
|
||||
@end itemize
|
||||
|
||||
@item "top"
|
||||
@findex %code "top"
|
||||
|
||||
@itemize @bullet
|
||||
@item Language(s): C, C++
|
||||
|
||||
@item Purpose: The unqualified @code{%code} or @code{%code "requires"} should
|
||||
usually be more appropriate than @code{%code "top"}.
|
||||
However, occasionally it is necessary to insert code much nearer the top of the
|
||||
parser source code file.
|
||||
For example:
|
||||
|
||||
@smallexample
|
||||
%code-top @{
|
||||
%code "top" @{
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@comment @noindent
|
||||
@comment For Java, @code{%code-top @{@var{code}@}} is currently unused.
|
||||
@item Location(s): Near the top of the parser source code file.
|
||||
@end itemize
|
||||
@ignore
|
||||
@item "imports"
|
||||
@findex %code "imports"
|
||||
|
||||
@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}@}}.
|
||||
@itemize @bullet
|
||||
@item Language(s): Java
|
||||
|
||||
(Like all the Yacc prologue alternative directives, this directive is
|
||||
experimental.
|
||||
@item Purpose: This is the best place to write Java import directives.
|
||||
|
||||
@item Location(s): The parser Java file after any Java package directive and
|
||||
before any class definitions.
|
||||
@end itemize
|
||||
@end ignore
|
||||
@end itemize
|
||||
|
||||
(Like all the Yacc prologue alternatives, this directive is experimental.
|
||||
More user feedback will help to determine whether it should become a permanent
|
||||
feature.)
|
||||
|
||||
@xref{Prologue Alternatives}.
|
||||
@cindex Prologue
|
||||
For a detailed discussion of how to use @code{%code} in place of the
|
||||
traditional Yacc prologue for C/C++, see @ref{Prologue Alternatives}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %debug
|
||||
@@ -8826,24 +8882,6 @@ Bison declaration to assign a precedence to a specific rule.
|
||||
@xref{Contextual Precedence, ,Context-Dependent Precedence}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %provides @{@var{code}@}
|
||||
This is the right place to write additional definitions you would like Bison to
|
||||
expose externally.
|
||||
That is, this directive inserts your @var{code} both into the parser header
|
||||
@comment 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.
|
||||
@comment For Java, it inserts your @var{code} into the parser java file after the parser
|
||||
@comment class.
|
||||
|
||||
(Like all the Yacc prologue alternative directives, this directive is
|
||||
experimental.
|
||||
More user feedback will help to determine whether it should become a permanent
|
||||
feature.)
|
||||
|
||||
@xref{Prologue Alternatives}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %pure-parser
|
||||
Bison declaration to request a pure (reentrant) parser.
|
||||
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
|
||||
@@ -8854,35 +8892,6 @@ Require version @var{version} or higher of Bison. @xref{Require Decl, ,
|
||||
Require a Version of Bison}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %requires @{@var{code}@}
|
||||
This is the right place to write dependency code for externally exposed
|
||||
definitions required by Bison.
|
||||
Such exposed definitions are those usually appearing in the parser
|
||||
@comment 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.
|
||||
@comment 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.
|
||||
|
||||
(Like all the Yacc prologue alternative directives, this directive is
|
||||
experimental.
|
||||
More user feedback will help to determine whether it should become a permanent
|
||||
feature.)
|
||||
|
||||
@xref{Prologue Alternatives}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %right
|
||||
Bison declaration to assign right associativity to token(s).
|
||||
@xref{Precedence Decl, ,Operator Precedence}.
|
||||
|
||||
Reference in New Issue
Block a user