Tomasz Jastrzebski wrote:
> I agree that
> additiveExpression
> : multiplicativeExpression ('+' | '-') multiplicativeExpression
> | multiplicativeExpression
> ;
> is equiwalent to:
>
> additiveExpression
> : multiplicativeExpression (('+' | '-') multiplicativeExpression)?
> ;
> Why it does not generate the same AST tree I do not know. May be it is a
> bug - I have to investigate.
It should generate the same AST - both are handled by the default tree
rule, and produce a flat list of the tokens. However, if you put the
output rule *inside* the optional subrule, it only applies if the
optional subrule matches. Thus the case where the subrule doesn't match
produces a single node, and where it does it produces the output you
specify.
> Goot point about the "a + b + c" case.
>
> Thanks,
>
> Tomasz
>
> --- On *Fri, 8/7/09, Sam Barnett-Cormack
> /<[email protected]>/* wrote:
>
>
> From: Sam Barnett-Cormack <[email protected]>
> Subject: Re: [antlr-interest] could not even do k=1 for decision xx;
> reason: timed out
> To: "Tomasz Jastrzebski" <[email protected]>
> Cc: "antlr-interest" <[email protected]>
> Date: Friday, August 7, 2009, 6:29 PM
>
> Tomasz Jastrzebski wrote:
> > But this creates a different tree, while what I need is plain and
> simple structure like this:
> > +
> > / \
> > / \
> > a *
> > / \
> > / \
> > c d
>
> No, it does exactly what the one you provided does. The output rule
> is only observed if the subrule matches, otherwise it follows the
> default. It is identical in effect to the rule you provided...
>
> additiveExpression
> : e1=multiplicativeExpression ((o='+'|o='-')
> e2=multiplicativeExpression ->
> BINARY_EXPRESSION<BinaryExpression>[$o.text, $e1.tree, $e2.tree])?
> ;
>
> (I've corrected where it should be a question mark, not * - * would
> accept chained expressions, but the tree rewrite would be awkward)
>
> If the subrule matches, the rewrite (which I don't quite understand)
> applies. If it doesn't, then the default (just emit the token as a
> single node) takes place.
>
> Your grammar doesn't appear to support expressions like
>
> 3 + 4 - 5
> or
> 2 * 3 / 5
>
> Sam
>
> > --- On *Fri, 8/7/09, Sam Barnett-Cormack
> /<[email protected]
>
> <http://us.mc521.mail.yahoo.com/mc/[email protected]>>/*
> wrote:
> >
> >
> > From: Sam Barnett-Cormack <[email protected]
>
> <http://us.mc521.mail.yahoo.com/mc/[email protected]>>
> > Subject: Re: [antlr-interest] could not even do k=1 for
> decision xx;
> > reason: timed out
> > To: "Tomasz Jastrzebski" <[email protected]
> <http://us.mc521.mail.yahoo.com/mc/[email protected]>>
> > Date: Friday, August 7, 2009, 2:30 PM
> >
> > Tomasz Jastrzebski wrote:
> >
> > > But the problem is that I cannot do that since I need to catch
> > reference to each expression and operator to build nice AST tree.
> > The real code looks more like this:
> > > additiveExpression
> > > : e1=multiplicativeExpression (o='+' | o='-')
> > e2=multiplicativeExpression ->
> > BINARY_EXPRESSION<BinaryExpression>[$o.text, $e1.tree, $e2.tree]
> > > | multiplicativeExpression
> > > ;
> >
> > Still left-factor it.
> >
> > additiveExpression
> > : e1=multiplicativeExpression ((o='+'|o='-')
> > e2=multiplicativeExpression ->
> > BINARY_EXPRESSION<BinaryExpression>[$o.text, $e1.tree,
> $e2.tree])*
> > ;
> >
> > This means that the output expression is only considered if the
> > optional subrule matches - otherwise it uses the default output
> > (just e1).
> >
> > -- Sam Barnett-Cormack
> >
> >
>
>
> -- Sam Barnett-Cormack
>
>
--
Sam Barnett-Cormack
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---