ANTLR-链接AST的节点

ANTLR-链接AST的节点,antlr,abstract-syntax-tree,treenode,tree-grammar,Antlr,Abstract Syntax Tree,Treenode,Tree Grammar,我想知道如何在语法文件中定义AST的节点具有“双亲”。例如,如果第一棵树的节点“D”也是节点“A”的子节点,我应该使用什么语法以使节点“D”看起来不重复(我想要类似于第二棵树的东西) 如果我使用类似于: A B C D -> ^(A B ^(C D) D) 节点“D”将重复出现。好的,没有方便的API。您必须手动复制AST,然后将其插入您的重写规则: @parser::members { CommonTree copy(CommonTree original) { // ht

我想知道如何在语法文件中定义AST的节点具有“双亲”。例如,如果第一棵树的节点“D”也是节点“A”的子节点,我应该使用什么语法以使节点“D”看起来不重复(我想要类似于第二棵树的东西)

如果我使用类似于:

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

节点“D”将重复出现。

好的,没有方便的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)})
 ;

所以基本上你要的是一张图而不是一棵树?我不认为ANTLR有这样的东西。
@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)})
 ;