[antlr-interest] Tree construction
Jim Idle
jimi at temporal-wave.com
Wed Dec 16 07:46:00 PST 2009
Err well I was just giving the example, not writing the whole thing ;-), just extend the operators in the assignmentOperator rule and it works for as many as you need. That's the way to do it easiest.
Jim
> -----Original Message-----
> From: Marcin Rzeznicki [mailto:marcin.rzeznicki at gmail.com]
> Sent: Wednesday, December 16, 2009 5:44 AM
> To: Jim Idle
> Cc: antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Tree construction
>
> On Tue, Dec 15, 2009 at 10:36 PM, Jim Idle <jimi at temporal-wave.com>
> wrote:
> > You will need to bring the EQUALS up in to the rule and rewrite
> accordingly:
> >
> > expression
> > :
> > ce=conditionalExpression
> > (
> > EQUALS e1=expression -> ^(STORE $ce $e1)
> > | ao=assignmentOperator e2=expression
> > ->^(STORE $ce ^($ao $ce $e2))
> > )?
> > ;
> >
> > assignmentOperator
> > : PLUS_EQUALS ->PLUS[$PLUS_EQUALS]
> > | MINUS_EQUALS ->MINUS[$MINUS_EQUALS]
> > ;
> >
>
> That's unnatural I think. Because assignmentOperator rule, in your
> example, does not cover all possible operators. I was really asking
> whether it was possible to mark in rewrite rule a 'point of
> attachment'.
>
> > Though there isn’t really a need to change the token types, you can
> just behave accordingly with PLUS_EQUALS etc.
> >
>
> I think it is convenient. Because, after these transformations, I can
> encode compound operations like += in simpler terms directly in AST.
> Of course '+' is reused in "standard" addition.
>
> > Jim
> >
> >> -----Original Message-----
> >> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> >> bounces at antlr.org] On Behalf Of Marcin Rzeznicki
> >> Sent: Monday, December 14, 2009 7:17 PM
> >> To: antlr-interest at antlr.org
> >> Subject: [antlr-interest] Tree construction
> >>
> >> Hi to you all dear antlr-interest members,
> >> I am wondering whether it is possible to specify somehow where AST
> >> nodes should be attached. Let me explain my problem on this short
> >> example.
> >> Let's consider expressions like i += 5. I want to build AST that
> >> breaks this up into simple operation, like STORE and MUL in this
> case.
> >> In other words, I want my final AST for this case to be like the one
> >> below:
> >> ^(STORE i ^(MUL i 5)).
> >> Grammar part which is responsible for parsing these expressions:
> >> expression
> >> :
> >> conditionalExpression ( assignmentOperator expression )?
> >> ;
> >>
> >> assignmentOperator
> >> :
> >> EQUALS
> >> | PLUS_EQUALS
> >> | MINUS_EQUALS
> >> ...
> >> ;
> >>
> >> I could not find any clean way to achieve what I wanted. Finally, I
> >> came up with something that works but is utmost ugly:
> >>
> >> expression
> >> :
> >> ( lhs = conditionalExpression
> >> -> $lhs )
> >> (
> >> op = assignmentOperator[$lhs.tree] rhs = expression
> >> -> {$op.start.getType() != EQUALS}?
> >> ^(
> >> STORE[$op.start] $lhs
> >> ^( $op $rhs )
> >> )
> >> ->
> >> ^( STORE[$op.start] $lhs $rhs )
> >> )?
> >> ;
> >>
> >> assignmentOperator[CommonTree leftHand]
> >> :
> >> EQUALS
> >> ->
> >> | op = PLUS_EQUALS
> >> ->
> >> ^( ADD[$op] {$leftHand} )
> >> | op = MINUS_EQUALS
> >> ->
> >> ^( SUB[$op] {$leftHand} )
> >> ///
> >> ;
> >>
> >> I hope you share my pain :-) If I could move the actual tree
> >> generation to assignmentOperator, it would give me much cleaner
> result
> >> - but for now, due to facts that I am not knowing right hand side
> >> expression in advance and I am not able to append it to the correct
> >> place in the resulting tree, I think that this is impossible.
> >> So here comes the question. Can you see any better way to achieve
> the
> >> desired effect? I'll be happy to hear your opinions and share your
> >> experience. Thank you in advance.
> >>
> >> --
> >> Greetings
> >> Marcin Rzeźnicki
> >>
> >> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> >> Unsubscribe: http://www.antlr.org/mailman/options/antlr-
> interest/your-
> >> email-address
> >
> >
> >
> >
> > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > Unsubscribe: http://www.antlr.org/mailman/options/antlr-
> interest/your-email-address
> >
>
>
>
> --
> Pozdrawiam
> Marcin Rzeźnicki
More information about the antlr-interest
mailing list