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:[email protected]] > Sent: Wednesday, December 16, 2009 5:44 AM > To: Jim Idle > Cc: [email protected] > Subject: Re: [antlr-interest] Tree construction > > On Tue, Dec 15, 2009 at 10:36 PM, Jim Idle <[email protected]> > 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: [email protected] [mailto:antlr-interest- > >> [email protected]] On Behalf Of Marcin Rzeznicki > >> Sent: Monday, December 14, 2009 7:17 PM > >> To: [email protected] > >> 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 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.
