@subsection A Push Parser
@cindex push parser
@cindex push parser
-@findex %push-parser
+@findex %define 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
a requirement of a GUI, when the main event loop needs to be triggered
within a certain time period.
-Normally, Bison generates a pull parser. The Bison declaration
-@code{%push-parser} says that you want the parser to be a push parser.
-It looks like this:
+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}):
@example
-%push-parser
+%define push_pull "push"
@end example
In almost all cases, you want to ensure that your push parser is also
@example
%pure-parser
-%push-parser
+%define push_pull "push"
@end example
There is a major notable functional difference between the pure push parser
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{%push-parser} declaration with the
-@code{%push-pull-parser} declaration. Doing this will create all of the
+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}
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{%push-pull-parser}
-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
+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{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
and then @code{yypull_parse} the rest of the input stream. If you would like
to switch back and forth between between parsing styles, you would have to
@end example
Adding the @code{%pure-parser} declaration does exactly the same thing to the
-generated parser with @code{%push-pull-parser} as it did for
-@code{%push-parser}.
+generated parser with @code{%define push_pull "both"} as it did for
+@code{%define push_pull "push"}.
@node Decl Summary
@subsection Bison Declaration Summary
@end enumerate
@end deffn
+@deffn {Directive} %define push_pull "@var{value}"
+Bison declaration to request a @code{"pull"} parser, a @code{"push"} parser, or
+@code{"both"}.
+The default @code{"@var{value}"} is @code{"pull"}.
+This directive is currently only available for LALR(1) parsers in C.
+@xref{Push Decl, ,A Push Parser}.
+@end deffn
+
@deffn {Directive} %defines
Write a header file containing macro definitions for the token type
names defined in the grammar as well as a few other declarations.
(Reentrant) Parser}).
@end deffn
-@deffn {Directive} %push-parser
-Bison declaration to request a push parser.
-@xref{Push Decl, ,A Push Parser}.
-@end deffn
-
-@deffn {Directive} %push-pull-parser
-Bison declaration to request a push and a pull parser.
-@xref{Push Decl, ,A Push Parser}.
-@end deffn
-
@deffn {Directive} %require "@var{version}"
Require version @var{version} or higher of Bison. @xref{Require Decl, ,
Require a Version of Bison}.
@findex yypush_parse
You call the function @code{yypush_parse} to parse a single token. This
-function is available if either the @code{%push-parser} or
-@code{%push-pull-parser} declaration is used.
+function is available if either the @code{%define push_pull "push"} or
+@code{%define push_pull "both"} declaration is used.
@xref{Push Decl, ,A Push Parser}.
@deftypefun int yypush_parse (yypstate *yyps)
@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{%push-pull-parser}
+stream. This function is available if the @code{%define push_pull "both"}
declaration is used.
@xref{Push Decl, ,A Push Parser}.
@findex yypstate_new
You call the function @code{yypstate_new} to create a new parser instance.
-This function is available if either the @code{%push-parser} or
-@code{%push-pull-parser} declaration is used.
+This function is available if either the @code{%define push_pull "push"} or
+@code{%define push_pull "both"} declaration is used.
@xref{Push Decl, ,A Push Parser}.
@deftypefun yypstate *yypstate_new (void)
@findex yypstate_delete
You call the function @code{yypstate_delete} to delete a parser instance.
-This function is available if either the @code{%push-parser} or
-@code{%push-pull-parser} declaration is used.
+function is available if either the @code{%define push_pull "push"} or
+@code{%define push_pull "both"} declaration is used.
@xref{Push Decl, ,A Push Parser}.
@deftypefun void yypstate_delete (yypstate *yyps)
@xref{Decl Summary,,%define}.
@end deffn
+@deffn {Directive} %define push_pull "@var{value}"
+Bison declaration to request a @code{"pull"} parser, a @code{"push"} parser, or
+@code{"both"}.
+@xref{Decl Summary,,%define push_pull}.
+@end deffn
+
@deffn {Directive} %defines
Bison declaration to create a header file meant for the scanner.
@xref{Decl Summary}.
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
@end deffn
-@deffn {Directive} %push-parser
-Bison declaration to request a push parser.
-@xref{Push Decl, ,A Push Parser}.
-@end deffn
-
-@deffn {Directive} %push-pull-parser
-Bison declaration to request a push and a pull parser.
-@xref{Push Decl, ,A Push Parser}.
-@end deffn
-
@deffn {Directive} %require "@var{version}"
Require version @var{version} or higher of Bison. @xref{Require Decl, ,
Require a Version of Bison}.