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.

Reply via email to