1

私は奇妙な現象に悩まされています:

結果の AST では、 の最初の だけxz: x | '<'! y? '>'発生y: x (','! x)*します。ただし、Maven リポジトリにデプロイされた Antlr3 を使用してコードをコンパイルした場合に限ります。AntlrWorks を使用すると、正しいツリーが表示されます。

b: a a*; c: d b? d;意味的に間違っていますか?私は何を間違っていますか?それとも、単に Antlr にエラーがあるのでしょうか?

より完全な例が必要な場合 (私の問題は、try_ の $v2 で発生します):

variables
    : annotatedVariable
        -> ^(VARIABLES annotatedVariable)
    | v='<' annotatedVariableList? '>'
        -> ^(VARIABLES[$v] annotatedVariableList?)
    ;

annotatedVariableList
    : annotatedVariable (','! annotatedVariable)*
    ;

try_
    : v='try' e1=expression 'of' v1=variables '->' e2=expression
      'catch' v2=variables '->' e3=expression
        -> ^(TRY[$v] $e1 $v1 $e2 $v2 $e3)
    ;

(完全なソースと入力ファイルの例: https://gist.github.com/1004329。ツリーには in catch の T のみが存在しますが、AntlrWorks には T と R の両方が表示されます。)

4

1 に答える 1

1

ケイ さんが書きました:

z の x の最初のもののみ: x | '<'! え?'>' (ここで y: x (','! x)*) は、結果の AST で発生します。ただし、Maven リポジトリにデプロイされた Antlr3 を使用してコードをコンパイルした場合に限ります。AntlrWorks を使用すると、正しいツリーが表示されます。

ANTLRWorks は、パーサー ルールが生成する AST ではなく、解析ツリーを生成します (ANTLRWorks のインタープリターについて話していると仮定して)。

簡単なテストでは、すべてが正常に機能することが示されています (ANTLR v3 でテスト済み)。

grammar T;

options {
  output=AST;
}

z : x 
  | '<'! y? '>'!
  ;

y : x (','! x)*
    ;

x : X
  ;

X : 'A'..'Z'
  ;

入力を解析します:

<X,Y,Z>

次の AST に変換します。

ここに画像の説明を入力

自分でテストできるように:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("<X,Y,Z>"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    CommonTree tree = (CommonTree)parser.z().getTree();
    DOTTreeGenerator gen = new DOTTreeGenerator();
    StringTemplate st = gen.toDOT(tree);
    System.out.println(st);
  }
}

ケイ さんが書きました:

b: aa*; c:デブ?d; 意味的に間違っていますか?

いいえ。しかし、この質問はあなたのz: x | '<'! y? '>'規則に関連していますか? 申し訳ありませんが、あなたは少し曖昧です。

ケイ さんが書きました:

私は何を間違っていますか?

知らない。私が投稿したように、短い自己完結型の例を SO に投稿する必要があります。外部リンクをたどったり、何百行ものコードを調べたりするのは好きではありません。申し訳ありません。

于 2011-06-06T14:22:48.460 に答える