mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
%define push_pull -> %define api.push_pull. Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00005.html>. * data/push.c: Expect the new name. * data/yacc.c: Likewise. * doc/bison.texinfo (Push Decl): Update. (Decl Summary): Update %define entry. (Push Parser Function): Update. (Pull Parser Function): Update. (Parser Create Function): Update. (Parser Delete Function): Update. * tests/calc.at (Simple LALR Calculator): Update. * tests/input.at (%define enum variables): Update. * tests/push.at (Push Parsing: Memory Leak for Early Deletion): Update. (Push Parsing: Multiple impure instances): Update. (Push Parsing: Unsupported Skeletons): Update. * tests/torture.at (Exploding the Stack Size with Alloca): Update. (Exploding the Stack Size with Malloc): Update. * NEWS (2.3a+): Add an entry for the push parser, and clean up the other entries some.
This commit is contained in:
23
ChangeLog
23
ChangeLog
@@ -1,3 +1,26 @@
|
||||
2007-10-28 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||
|
||||
%define push_pull -> %define api.push_pull. Discussed starting at
|
||||
<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00005.html>.
|
||||
* data/push.c: Expect the new name.
|
||||
* data/yacc.c: Likewise.
|
||||
* doc/bison.texinfo (Push Decl): Update.
|
||||
(Decl Summary): Update %define entry.
|
||||
(Push Parser Function): Update.
|
||||
(Pull Parser Function): Update.
|
||||
(Parser Create Function): Update.
|
||||
(Parser Delete Function): Update.
|
||||
* tests/calc.at (Simple LALR Calculator): Update.
|
||||
* tests/input.at (%define enum variables): Update.
|
||||
* tests/push.at (Push Parsing: Memory Leak for Early Deletion): Update.
|
||||
(Push Parsing: Multiple impure instances): Update.
|
||||
(Push Parsing: Unsupported Skeletons): Update.
|
||||
* tests/torture.at (Exploding the Stack Size with Alloca): Update.
|
||||
(Exploding the Stack Size with Malloc): Update.
|
||||
|
||||
* NEWS (2.3a+): Add an entry for the push parser, and clean up the
|
||||
other entries some.
|
||||
|
||||
2007-10-27 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||
|
||||
For the XML output's terminal element, rename @number to @token-number,
|
||||
|
||||
55
NEWS
55
NEWS
@@ -3,7 +3,35 @@ Bison News
|
||||
|
||||
Changes in version 2.3a+ (????-??-??):
|
||||
|
||||
* Previously, Bison sometimes generated parser tables containing unreachable
|
||||
* Push Parsing
|
||||
|
||||
Bison can now generate an LALR(1) parser in C with a push interface. That
|
||||
is, instead of invoking yyparse, which pulls tokens from `yylex', you can
|
||||
push one token at a time to the parser using `yypush_parse', which will
|
||||
return to the caller after processing each token. By default, the push
|
||||
interface is disabled. Either of the following directives will enable it:
|
||||
|
||||
%define api.push_pull "push" // Just push; does not require yylex.
|
||||
%define api.push_pull "both" // Push and pull; requires yylex.
|
||||
|
||||
See the new section `A Push Parser' in the Bison manual for details.
|
||||
|
||||
* The -g and --graph options now output graphs in Graphviz DOT format,
|
||||
not VCG format.
|
||||
|
||||
* An experimental directive %language specifies the language of the
|
||||
generated parser, which can be C (the default) or C++. This
|
||||
directive affects the skeleton used, and the names of the generated
|
||||
files if the grammar file's name ends in ".y".
|
||||
|
||||
* The grammar file may now specify the name of the parser header file using
|
||||
%defines. For example:
|
||||
|
||||
%defines "parser.h"
|
||||
|
||||
* Unreachable State Removal
|
||||
|
||||
Previously, Bison sometimes generated parser tables containing unreachable
|
||||
states. A state can become unreachable during conflict resolution if Bison
|
||||
disables a shift action leading to it from a predecessor state. Bison now:
|
||||
|
||||
@@ -23,7 +51,9 @@ Changes in version 2.3a+ (????-??-??):
|
||||
See the %define entry in the `Bison Declaration Summary' in the Bison manual
|
||||
for further discussion.
|
||||
|
||||
* When instructed to generate a `.output' file including lookahead sets
|
||||
* Lookahead Set Correction in the `.output' Report
|
||||
|
||||
When instructed to generate a `.output' file including lookahead sets
|
||||
(using `--report=lookahead', for example), Bison now prints each reduction's
|
||||
lookahead set only next to the associated state's one item that (1) is
|
||||
associated with the same rule as the reduction and (2) has its dot at the end
|
||||
@@ -32,19 +62,6 @@ Changes in version 2.3a+ (????-??-??):
|
||||
bug affected only the `.output' file and not the generated parser source
|
||||
code.
|
||||
|
||||
* The -g and --graph options now output graphs in Graphviz DOT format,
|
||||
not VCG format.
|
||||
|
||||
* An experimental directive %language specifies the language of the
|
||||
generated parser, which can be C (the default) or C++. This
|
||||
directive affects the skeleton used, and the names of the generated
|
||||
files if the grammar file's name ends in ".y".
|
||||
|
||||
* The grammar file may now specify the name of the parser header file using
|
||||
%defines. For example:
|
||||
|
||||
%defines "parser.h"
|
||||
|
||||
* The `=' that used to be required in the following directives is now
|
||||
deprecated:
|
||||
|
||||
@@ -57,7 +74,9 @@ Changes in version 2.3a+ (????-??-??):
|
||||
|
||||
%define NAME "VALUE"
|
||||
|
||||
* Bison 2.3a provided a new set of directives as a more flexible alternative to
|
||||
* An Alternative to `%{...%}' -- `%code QUALIFIER {CODE}'
|
||||
|
||||
Bison 2.3a provided a new set of directives as a more flexible alternative to
|
||||
the traditional Yacc prologue blocks. Those have now been consolidated into
|
||||
a single %code directive with an optional qualifier field, which identifies
|
||||
the purpose of the code and thus the location(s) where Bison should generate
|
||||
@@ -96,7 +115,9 @@ Changes in version 2.3a+ (????-??-??):
|
||||
To enable these warnings, specify the flag `--warnings=midrule-values' or
|
||||
`-W', which is a synonym for `--warnings=all'.
|
||||
|
||||
* Bison now recognizes two separate kinds of default %destructor's and
|
||||
* Default %destructor or %printer with `<*>' or `<>'
|
||||
|
||||
Bison now recognizes two separate kinds of default %destructor's and
|
||||
%printer's:
|
||||
|
||||
1. Place `<*>' in a %destructor/%printer symbol list to define a default
|
||||
|
||||
@@ -18,12 +18,13 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Check the value of %define push_pull.
|
||||
b4_percent_define_default([[push_pull]], [[pull]])
|
||||
b4_percent_define_check_values([[[[push_pull]], [[pull]], [[push]], [[both]]]])
|
||||
# Check the value of %define api.push_pull.
|
||||
b4_percent_define_default([[api.push_pull]], [[pull]])
|
||||
b4_percent_define_check_values([[[[api.push_pull]],
|
||||
[[pull]], [[push]], [[both]]]])
|
||||
b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
|
||||
b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
|
||||
m4_case(b4_percent_define_get([[push_pull]]),
|
||||
m4_case(b4_percent_define_get([[api.push_pull]]),
|
||||
[pull], [m4_define([b4_push_flag], [[0]])],
|
||||
[push], [m4_define([b4_pull_flag], [[0]])])
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# This hack will go away when we mv push.c yacc.c.
|
||||
m4_ifndef([b4_percent_define(push_pull)],
|
||||
m4_ifndef([b4_percent_define(api.push_pull)],
|
||||
[m4_if(b4_use_push_for_pull_flag, [0], [
|
||||
|
||||
m4_include(b4_pkgdatadir/[c.m4])
|
||||
|
||||
@@ -4528,7 +4528,7 @@ valid grammar.
|
||||
@subsection A Push Parser
|
||||
@cindex push parser
|
||||
@cindex push parser
|
||||
@findex %define push_pull
|
||||
@findex %define api.push_pull
|
||||
|
||||
A pull parser is called once and it takes control until all its input
|
||||
is completely parsed. A push parser, on the other hand, is called
|
||||
@@ -4541,10 +4541,10 @@ within a certain time period.
|
||||
|
||||
Normally, Bison generates a pull parser.
|
||||
The following Bison declaration says that you want the parser to be a push
|
||||
parser (@pxref{Decl Summary,,%define push_pull}):
|
||||
parser (@pxref{Decl Summary,,%define api.push_pull}):
|
||||
|
||||
@example
|
||||
%define push_pull "push"
|
||||
%define api.push_pull "push"
|
||||
@end example
|
||||
|
||||
In almost all cases, you want to ensure that your push parser is also
|
||||
@@ -4555,7 +4555,7 @@ what you are doing, your declarations should look like this:
|
||||
|
||||
@example
|
||||
%pure-parser
|
||||
%define push_pull "push"
|
||||
%define api.push_pull "push"
|
||||
@end example
|
||||
|
||||
There is a major notable functional difference between the pure push parser
|
||||
@@ -4604,14 +4604,14 @@ for use by the next invocation of the @code{yypush_parse} function.
|
||||
|
||||
Bison also supports both the push parser interface along with the pull parser
|
||||
interface in the same generated parser. In order to get this functionality,
|
||||
you should replace the @code{%define push_pull "push"} declaration with the
|
||||
@code{%define push_pull "both"} declaration. Doing this will create all of the
|
||||
symbols mentioned earlier along with the two extra symbols, @code{yyparse}
|
||||
you should replace the @code{%define api.push_pull "push"} declaration with the
|
||||
@code{%define api.push_pull "both"} declaration. Doing this will create all of
|
||||
the symbols mentioned earlier along with the two extra symbols, @code{yyparse}
|
||||
and @code{yypull_parse}. @code{yyparse} can be used exactly as it normally
|
||||
would be used. However, the user should note that it is implemented in the
|
||||
generated parser by calling @code{yypull_parse}.
|
||||
This makes the @code{yyparse} function that is generated with the
|
||||
@code{%define push_pull "both"} declaration slower than the normal
|
||||
@code{%define api.push_pull "both"} declaration slower than the normal
|
||||
@code{yyparse} function. If the user
|
||||
calls the @code{yypull_parse} function it will parse the rest of the input
|
||||
stream. It is possible to @code{yypush_parse} tokens to select a subgrammar
|
||||
@@ -4628,8 +4628,8 @@ yypstate_delete (ps);
|
||||
@end example
|
||||
|
||||
Adding the @code{%pure-parser} declaration does exactly the same thing to the
|
||||
generated parser with @code{%define push_pull "both"} as it did for
|
||||
@code{%define push_pull "push"}.
|
||||
generated parser with @code{%define api.push_pull "both"} as it did for
|
||||
@code{%define api.push_pull "push"}.
|
||||
|
||||
@node Decl Summary
|
||||
@subsection Bison Declaration Summary
|
||||
@@ -4837,8 +4837,8 @@ target language and/or parser skeleton.
|
||||
Some of the accepted @var{variable}s are:
|
||||
|
||||
@itemize @bullet
|
||||
@item push_pull
|
||||
@findex %define push_pull
|
||||
@item api.push_pull
|
||||
@findex %define api.push_pull
|
||||
|
||||
@itemize @bullet
|
||||
@item Language(s): C (LALR(1) only)
|
||||
@@ -5267,8 +5267,8 @@ exp: @dots{} @{ @dots{}; *randomness += 1; @dots{} @}
|
||||
@findex yypush_parse
|
||||
|
||||
You call the function @code{yypush_parse} to parse a single token. This
|
||||
function is available if either the @code{%define push_pull "push"} or
|
||||
@code{%define push_pull "both"} declaration is used.
|
||||
function is available if either the @code{%define api.push_pull "push"} or
|
||||
@code{%define api.push_pull "both"} declaration is used.
|
||||
@xref{Push Decl, ,A Push Parser}.
|
||||
|
||||
@deftypefun int yypush_parse (yypstate *yyps)
|
||||
@@ -5282,7 +5282,7 @@ is required to finish parsing the grammar.
|
||||
@findex yypull_parse
|
||||
|
||||
You call the function @code{yypull_parse} to parse the rest of the input
|
||||
stream. This function is available if the @code{%define push_pull "both"}
|
||||
stream. This function is available if the @code{%define api.push_pull "both"}
|
||||
declaration is used.
|
||||
@xref{Push Decl, ,A Push Parser}.
|
||||
|
||||
@@ -5295,8 +5295,8 @@ The value returned by @code{yypull_parse} is the same as for @code{yyparse}.
|
||||
@findex yypstate_new
|
||||
|
||||
You call the function @code{yypstate_new} to create a new parser instance.
|
||||
This function is available if either the @code{%define push_pull "push"} or
|
||||
@code{%define push_pull "both"} declaration is used.
|
||||
This function is available if either the @code{%define api.push_pull "push"} or
|
||||
@code{%define api.push_pull "both"} declaration is used.
|
||||
@xref{Push Decl, ,A Push Parser}.
|
||||
|
||||
@deftypefun yypstate *yypstate_new (void)
|
||||
@@ -5309,8 +5309,8 @@ or NULL if no memory was available.
|
||||
@findex yypstate_delete
|
||||
|
||||
You call the function @code{yypstate_delete} to delete a parser instance.
|
||||
function is available if either the @code{%define push_pull "push"} or
|
||||
@code{%define push_pull "both"} declaration is used.
|
||||
function is available if either the @code{%define api.push_pull "push"} or
|
||||
@code{%define api.push_pull "both"} declaration is used.
|
||||
@xref{Push Decl, ,A Push Parser}.
|
||||
|
||||
@deftypefun void yypstate_delete (yypstate *yyps)
|
||||
|
||||
@@ -560,7 +560,7 @@ AT_CHECK_CALC_LALR([%yacc])
|
||||
AT_CHECK_CALC_LALR([%error-verbose])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %locations])
|
||||
AT_CHECK_CALC_LALR([%define push_pull "both" %pure-parser %locations])
|
||||
AT_CHECK_CALC_LALR([%define api.push_pull "both" %pure-parser %locations])
|
||||
AT_CHECK_CALC_LALR([%error-verbose %locations])
|
||||
|
||||
AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
@@ -569,7 +569,7 @@ AT_CHECK_CALC_LALR([%debug])
|
||||
AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
AT_CHECK_CALC_LALR([%define push_pull "both" %pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
AT_CHECK_CALC_LALR([%define api.push_pull "both" %pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
|
||||
|
||||
|
||||
@@ -848,13 +848,13 @@ AT_CLEANUP
|
||||
AT_SETUP([[%define enum variables]])
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%define push_pull "neither"
|
||||
[[%define api.push_pull "neither"
|
||||
%%
|
||||
start: ;
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison input.y]], [1], [],
|
||||
[[input.y:1.9-17: invalid value for %define variable `push_pull': `neither'
|
||||
[[input.y:1.9-21: invalid value for %define variable `api.push_pull': `neither'
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -33,7 +33,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
void yyerror (char const *msg);
|
||||
%}
|
||||
|
||||
%pure-parser %define push_pull "push"
|
||||
%pure-parser %define api.push_pull "push"
|
||||
|
||||
%%
|
||||
|
||||
@@ -92,7 +92,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
int yylex (void);
|
||||
%}
|
||||
|
||||
%define push_pull "both"
|
||||
%define api.push_pull "both"
|
||||
|
||||
%%
|
||||
|
||||
@@ -158,13 +158,13 @@ AT_SETUP([[Push Parsing: Unsupported Skeletons]])
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%glr-parser
|
||||
%define push_pull "push"
|
||||
%define api.push_pull "push"
|
||||
%%
|
||||
start: ;
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison input.y]], [0], [],
|
||||
[[input.y:2.9-17: warning: %define variable `push_pull' is not used
|
||||
[[input.y:2.9-21: warning: %define variable `api.push_pull' is not used
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -496,7 +496,7 @@ AT_PARSER_CHECK([./input 10000], 2, [], [ignore],
|
||||
# just helps guarantee we don't let the YYSTACK_USE_ALLOCA feature affect
|
||||
# push parsers.
|
||||
AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
|
||||
[[%define push_pull "both"
|
||||
[[%define api.push_pull "both"
|
||||
]])
|
||||
AT_PARSER_CHECK([./input 20], 0, [], [ignore],
|
||||
[[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
|
||||
@@ -534,7 +534,7 @@ AT_PARSER_CHECK([./input 10000], 2, [], [ignore],
|
||||
[[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
|
||||
|
||||
AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
|
||||
[[%define push_pull "both"
|
||||
[[%define api.push_pull "both"
|
||||
]])
|
||||
AT_PARSER_CHECK([./input 20], 0, [], [ignore],
|
||||
[[VALGRIND_OPTS="$VALGRIND_OPTS --log-fd=1"]])
|
||||
|
||||
Reference in New Issue
Block a user