如何将CommonTree参数传递给Antlr规则

时间:2011-06-30 02:26:07

标签: antlr

我正在尝试做我认为是一个简单的参数传递给Antlr 3.3中的规则:

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)

我可以说,这与Antrl书中的示例完全相同:

classDefinition[CommonTree mod]

(Kindle Location 3993) - 抱歉,我不知道页码,但它位于第9章标题为“使用任意操作创建节点”一节的书中间。

感谢您的帮助。

中号

1 个答案:

答案 0 :(得分:3)

如果您没有明确指定要在语法中使用的树,.treegetTree()的缩写)将返回java.lang.ObjectCommonTree将用作默认Tree实现。为避免投射,请在options { ... }部分设置树的类型:

options
{
    output=AST;
    ASTLabelType=CommonTree;
}