2011-06-30 24 views
4

我想做什么,我认为这是一个简单的参数传递给一个规则,ANTLR的3.3:如何CommonTree参数传递给一个ANTLR的规则

grammar rule_params; 


options 
{ 
    output = AST; 
} 

rule_params 
    : outer; 


outer: outer_id '[' inner[$outer_id.tree] ']'; 

inner[CommonTree parent] : inner_id '[' ']'; 


outer_id : '#'! ID; 

inner_id : '$'! ID ; 


ID : ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ; 

所以inner[CommonTree parent]生成以下内容:

inner4=inner((outer_id2!=null?((Object)outer_id2.tree):null)); 

造成此错误:

The method inner(CommonTree) in the type rule_paramsParser is not applicable for the arguments (Object) 

尽我所知,这是确切的SAM Ë作为Antrl书中的实例:

classDefinition[CommonTree mod] 

(Kindle的位置3993) - 对不起,我不知道页码,但它是在书的中间在第9章,节标有“创建节点与任意行动“。

感谢您的任何帮助。

中号

回答

3

如果没有明确指定该树在你的语法使用,.tree(这是短期的getTree())将返回一个java.lang.ObjectCommonTree将用作默认Tree实现。为避免投射,请在您的options { ... }部分设置树的类型:

options 
{ 
    output=AST; 
    ASTLabelType=CommonTree; 
}