Next: Java Differences, Previous: Java Action Features, Up: Java Parsers [Contents][Index]
(The current push parsing interface is experimental and may evolve. More user feedback will help to stabilize it.)
Normally, Bison generates a pull parser for Java. The following Bison declaration says that you want the parser to be a push parser (see api.push-pull):
%define api.push-pull push
Most of the discussion about the Java pull Parser Interface, (see Java Parser Interface) applies to the push parser interface as well.
When generating a push parser, the method push_parse
is created with
the following signature (depending on if locations are enabled).
The primary difference with respect to a pull parser is that the parser
method push_parse
is invoked repeatedly to parse each token. This
function is available if either the "%define api.push-pull push" or "%define
api.push-pull both" declaration is used (see api.push-pull). The Location
and Position
parameters are available only if location tracking is active.
The value returned by the push_parse
method is one of the following
four constants: YYABORT
, YYACCEPT
, YYERROR
, or
YYPUSH_MORE
. This new value, YYPUSH_MORE
, may be returned if
more input is required to finish parsing the grammar.
If api.push-pull is declared as both
, then the generated parser class
will also implement the parse
method. This method’s body is a loop
that repeatedly invokes the scanner and then passes the values obtained from
the scanner to the push_parse
method.
There is one additional complication. Technically, the push parser does not
need to know about the scanner (i.e. an object implementing the
YYParser.Lexer
interface), but it does need access to the
yyerror
method. Currently, the yyerror
method is defined in
the YYParser.Lexer
interface. Hence, an implementation of that
interface is still required in order to provide an implementation of
yyerror
. The current approach (and subject to change) is to require
the YYParser
constructor to be given an object implementing the
YYParser.Lexer
interface. This object need only implement the
yyerror
method; the other methods can be stubbed since they will
never be invoked. The simplest way to do this is to add a trivial scanner
implementation to your grammar file using whatever implementation of
yyerror
is desired. The following code sample shows a simple way to
accomplish this.
%code lexer { public Object getLVal () {return null;} public int yylex () {return 0;} public void yyerror (String s) {System.err.println(s);} }
Next: Java Differences, Previous: Java Action Features, Up: Java Parsers [Contents][Index]