我正在尝试做我认为是一个简单的参数传递给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章标题为“使用任意操作创建节点”一节的书中间。
感谢您的帮助。
中号
答案 0 :(得分:3)
如果您没有明确指定要在语法中使用的树,.tree
(getTree()
的缩写)将返回java.lang.Object
和CommonTree
将用作默认Tree
实现。为避免投射,请在options { ... }
部分设置树的类型:
options
{
output=AST;
ASTLabelType=CommonTree;
}