AST重写期间删除节点

时间:2013-08-11 10:05:32

标签: antlr antlr3

假设我有一个像^(Root child1 child2)这样的树节点,child1的根节点可能有几个子节点。问题是,当我使用以下规则重写上述树时,child1的所有子项都将被child2替换,但我希望它们被保留并child2的树被附加到child1的子列表中。我该怎么做?

^(Root ch1=child1 ch2=child2)
  -> ^($ch1 $ch2)

1 个答案:

答案 0 :(得分:0)

$ch1作为^(运算符之后的第一个元素,您已经告诉ANTLR您希望该元素被视为节点而不是像。如果存在,此用法始终会自动丢弃所有子项。要获得您所需的功能,您必须根据其根节点和子树分解child1

^(Root ^(Child1Root (ch1c+=.)*) child2)
  -> ^(Child1Root $ch1c* child2)