I believe the following works, duplicating the CALL and ID nodes as it iterates in parallel over the tokens returned by '.' and trees returned by withRHS.
withStatement : 'With' ID (dot+='.' rhs+=withRHS)+ -> ^(CALL ID $dot $rhs)+; Sam -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Graham Mer Sent: Wednesday, April 13, 2011 4:29 AM To: [email protected] Subject: [antlr-interest] Previous rule element reference in a scope Hello list, I have a grammar that includes a "With" statement like the following: With anObject .method1() .method2() which is semantically equivalent to the following fragment: anObject.method1() anObject.method2() During AST construction, I want to distribute 'anObject' to its subordinate method calls, so that I get a tree like the following: ^(CALL anObject.method1) ^(CALL anObject.method2) This is a natural fit for a scope, but I'm not sure how to capture the 'anObject' reference in a scope. If I have a recognizer grammar with the following rules, how do I capture the withStatement ID in a scope, and how do I insert that reference into the AST generated by memberCallStatement? withStatement scope{ // what do I store here to save my ID? } : 'With' ID ; memberCallStatement : '.' ID '()' // how do i insert $scope::ID in my AST? ; Also, are there any special precautions I need to take to avoid inserting loops in the AST, for example, do I need to make a new instance of the with object every time I duplicate it in the AST, or can I just re-use it? Is it best to use a String or my own Java object, or can I capture the thing that the recognizer generates directly? I wish I could do essentially the following: withStatement scope{ Object id; } : 'With'! id=ID! ; memberCallStatement : '.' ID '()' -> ^(CALL $withStatement::id '.' $ID) ; I know that will give ANTLR a sad, but I hope it illustrates what I want to produce. Thanks. 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 -- 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.
