树语法属性$ text无效

时间:2013-02-27 09:13:27

标签: tree antlr grammar

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 

我只获得根树的正确文本,但没有任何子树。 我该怎么办? 非常感谢你!

1 个答案:

答案 0 :(得分:2)

ANTLR 3仅为规则生成的AST的根节点设置启动和停止令牌。由于您的additiveExpression规则在闭包内包含^运算符,因此规则会生成多个根。

如果您的语法没有重新排序出现在AST中的节点,那么您可以在整个解析操作返回的根树上调用CommonTree.setUnknownTokenBoundaries()。此方法将重新计算整个树的开始和停止标记索引,但如果使用重写规则(取决于它们的使用方式),则会产生奇怪的结果。