0

anltr 3.4 树语法属性$text问题

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 

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

4

1 回答 1

2

ANTLR 3 只为规则生成的 AST 的根节点设置开始和停止标记。由于您的additiveExpression规则包含^闭包内的运算符,因此该规则会产生多个根。

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

于 2013-02-27T20:25:09.400 回答