ANTLR - 链接AST的节点

时间:2014-04-28 13:46:03

标签: antlr abstract-syntax-tree treenode tree-grammar

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

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

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

如果我使用类似的东西:

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

节点“D”将重复出现。

1 个答案:

答案 0 :(得分: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)})
 ;