如何在访问中替换子树?
在Pattern With Action中,我们看到
case red(l, r) => green(l, r)
用绿色节点替换所有红色节点。比如
case red(l, r) => []
删除所有红色节点。这可能吗?
有趣的问题。所以如果抽象语法是这样的:
data MyNode
= green(MyNode l, MyNode r)
| red(MyNode l, MyNode r)
| black()
| white()
;
任何visit
不允许更改它所替换的节点的类型。所以一个红节点可以变成绿色、黑色或白色,但不会"什么都没有"。您可以添加nothing的定义:
data MyNode = nothing();
然后将所有红节点重写为nothing
:
case red(_,_) => nothing()
所以这不是真的没有:-)
然而,更常见的情况是从列表中删除元素。在编程语言的抽象语法树中,这种情况经常发生:
data MyNode = nodes(list[MyNode] elements);
例如if-then-else语句的语句列表,等等
现在你可以在列表上匹配删除元素:
case nodes([*prefix, red(_,_), *postfix)]) => nodes([*prefix, *postfix])
现在红节点真的消失了