流氓MPL在访问中删除子树



如何在访问中替换子树?

在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])

现在红节点真的消失了

最新更新