[antlr-interest] Tree construction
Jim Idle
jimi at temporal-wave.com
Tue Dec 15 13:36:47 PST 2009
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]
;
Though there isn’t really a need to change the token types, you can just behave accordingly with PLUS_EQUALS etc.
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
More information about the antlr-interest
mailing list