1

文法ファイルで、AST のノードに「2 つの親」があることを定義する方法を知りたいです。たとえば、最初のツリーのノード「D」がノード「A」の子でもある場合、ノード「D」が繰り返されないようにするには、どの構文を使用すればよいですか (2 番目のツリーのようなものが必要です)。

    A
    |
    |
|-------|
B       C
        |
        D

       A
      / \
     /   |
 |----|  |
 B     C |
       \ |
        D

次のようなものを使用する場合:

A B C D -> ^(A B ^(C D) D)

ノード「D」が繰り返し表示されます。

4

1 に答える 1

1

私の知る限り、そのための便利な API はありません。AST を手動でコピーしてから、書き換えルールに挿入する必要があります。

@parser::members {
  CommonTree copy(CommonTree original) {
    // http://stackoverflow.com/questions/6781019/antlr-duplicate-a-tree
    return copyOfOriginal;
  }
}

rule
 : a b c d -> ^(a b ^(c d) {copy($d.tree)})
 ;
于 2014-04-28T14:38:37.263 に答える