1

我想知道如何在语法文件中定义AST 的节点有“两个父母”。例如,如果第一棵树的节点“D”也是节点“A”的子节点,我应该使用什么语法以使节点“D”不会重复出现(我想要第二棵树之类的东西)。

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

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

如果我使用类似的东西:

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

节点“D”将重复出现。

4

1 回答 1

1

AFAIK,没有方便的 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 回答