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 に答える