我想知道如何在语法文件中定义 AST的节点有“两个父母”。例如,如果第一个树的节点“D”也是节点“A”的子节点,那么我应该使用什么语法,以便节点“D”不会重复出现(我想要像第二个树一样)。
A
|
|
|-------|
B C
|
D
A
/ \
/ |
|----| |
B C |
\ |
D
如果我使用类似的东西:
A B C D -> ^(A B ^(C D) D)
节点“D”将重复出现。
答案 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)})
;