抽象语法树-ANTLR-链接AST的节点



我想知道如何在语法文件中定义AST的节点有"两个父节点"。例如,如果第一棵树的节点"D"也是节点"A"的子节点,那么我应该使用什么语法才能使节点"D’看起来不重复(我想要类似于第二棵树的东西)。

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

如果我使用类似的东西

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

节点"D"将重复出现。

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)})
 ;

最新更新