我想知道如何在语法文件中定义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)})
;