anltr 3.4树语法属性$ text problem
parser grammar:
additiveExpression
: multiplicativeExpression
(
( '+'^
| '-'^
)
multiplicativeExpression
)*
;
tree grammar:
expression
@init
{
$start.setOriginalText($text);//try to record source code
}
: ^('+' e1=expression e2=expression)
{
//do something
}
| ^('-' e1=expression e2=expression)
{
//do something
}
;
示例:
1 + 1 + 1 + 1;
AST:
+ $text=1+1+1+1 correct
+ 1 $text=+ wrong
+ 1 $text=+ wrong
1 1
我只获得根树的正确文本,但没有任何子树。 我该怎么办? 非常感谢你!
答案 0 :(得分:2)
ANTLR 3仅为规则生成的AST的根节点设置启动和停止令牌。由于您的additiveExpression
规则在闭包内包含^
运算符,因此规则会生成多个根。
如果您的语法没有重新排序出现在AST中的节点,那么您可以在整个解析操作返回的根树上调用CommonTree.setUnknownTokenBoundaries()
。此方法将重新计算整个树的开始和停止标记索引,但如果使用重写规则(取决于它们的使用方式),则会产生奇怪的结果。