help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: push parser


From: Joel E. Denny
Subject: Re: push parser
Date: Mon, 2 Jul 2007 10:16:13 -0400 (EDT)

On Mon, 2 Jul 2007, Bob Rossi wrote:

> OK. I don't even know what push-pull-parser does. When I submitted the
> patch, I only had support for push-parser and pure-parser didn't effect 
> it at all. You did some improvements to the patch, and we ended up
> with push-pull-parser as well. My question is, is push-parser still
> the same idea as what I committed? If so, what is push-pull-parser?
>
> With out knowing what it is, the name seems odd to me. You can have a
> push parser, and you can have a pull parser, but what's a
> push-pull-parser? :)

It's both.

%push-parser defines yypush_parse.  When combined with %pure-parser, it's 
close to your original form.

%push-pull-parser adds yypull_parse, which is a wrapper around 
yypush_parse that invokes yylex in a loop.  For example, one can 
yypush_parse tokens to select a subgrammar and then yypull_parse the rest 
of the input stream.

%push-pull-parser also defines yyparse, which is a wrapper around 
yypull_parse.  This yyparse has the same interface as the yyparse 
generated when neither %push-* directive is specified.

yypull_parse and yyparse are not defined for %push-parser because that 
would require the user to define yylex even when he doesn't want to.

To see some of these interfaces, you might try generating a few example 
parsers.  It's probably easiest to look at the generated header file.

Again, the following seems more intuitive to me now:

  %define push_pull "pull" // default
  %define push_pull "push"
  %define push_pull "both"

> > You can use %pure-parser in combination with either %push-parser or 
> > %push-pull-parser.
> 
> OK, I remember this. What was the benefit of providing this
> functionality to the user? How would I describe the tradeoffs to the
> user in the manual? My original patch only provided the pure version.

The impure version is for compatibility with non-push mode.  That is, when 
%push-pull-parser is declared, regardless of whether %pure-parser is 
declared, the yyparse and yylex interfaces are the same as when neither 
%push-* directive is declared.  I found this very helpful so I could reuse 
existing tests in the test suite.  I'm guessing some users might find it 
helpful as well when evolving old code.  In general, I like the 
consistency.

Nevertheless, as with non-push mode, the user should probably be 
encouraged to use the pure version for new parsers.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]