[antlr-interest] Custom AST nodes - attempt #2
Bill Andersen
bill.andersen at mac.com
Thu Jul 22 17:33:00 PDT 2010
Hi Ter
I set ASTLabelType = ASNode in options on the tree grammar
Got runtime cast error
Exception in thread "main" java.lang.ClassCastException: org.antlr.runtime.tree.CommonTree cannot be cast to com.hf.lang.eclif.ltt.ASNode
in generated code:
// /Users/bill/Documents/Eclipse Workspaces/workspace2/OWExperimental/LTT2/com/hf/lang/eclif/ltt/ASPass1.g:21:4: ^( AS_SPEC ( rule )+ )
{
root_0 = (ASNode)adaptor.nil();
I get what's going on in ANTLR - the default adaptor is spitting out CommonTree instances. This seems to imply that one has to supply a custom adaptor. Is this true?
WIth no adaptor and with ASTLabelType = CommonTree the tree grammar works just fine - with no actions.
Now, when I try to access a node in an action in a tree grammar as an ASNode, I can only get it to work with an explicit cast in the semantic action
simple_alt
: AS_TYPE
{ System.out.println( ">>> " + ((ASNode) $AS_TYPE).nodeType ); }
| ^(AS_SUBRULE ID)
;
Is this the verdict? Either write an adaptor that does the right thing or live with the casts?
On Jul 22, 2010, at 16:34 , Terence Parr wrote:
> Hi Bill. try setting ASTLabelType in tree grammar.
> T
> On Jul 22, 2010, at 12:26 PM, Bill Andersen wrote:
>
>> Hi Folks,
>>
>> This is my second attempt at asking this question. Hopefully it is clear. If not, please let me know.
>>
>> I'm interested in using a custom AST node class to carry type information.
>>
>> I do not want to build a custom TreeAdaptor to determine node type based on token id because only a few AST nodes will have to be of the custom class.
>>
>> Here's a sample production from the tree generating grammar.
>>
>> rule
>> : ... match something ...
>> -> ^(NODE<CustomType>[param] ...)
>> ;
>>
>> So far so good. I know how to do this.
>>
>> Let's say CustomType looks like this
>>
>> class CustomType extends CommonTree {
>> public T param;
>> public CustomType(int ttype, T param) { ... }
>> public T getParam() { ... }
>> ...
>> }
>>
>> Now I have another grammar that consumes ASTs from the first grammar. I want to do this:
>>
>> rule
>> : ^(NODE ...)
>> { ... do something with this information ... }
>> ;
>>
>> So, what syntax do I need in the action to get a T-typed param value from this node?
>>
>> Any help appreciated
>>
>> 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