访客的节点不适合被访客取代?

时间:2012-02-10 10:33:26

标签: c# java design-patterns visitor-pattern

在我的小编译器中,我目前有一个手工制作的AST。

我正在考虑让访问者关注特定类型X的节点并将其替换为类型为X'的节点。麻烦的是,似乎用访问者模式实现起来并不容易。

我能看到做这项工作的唯一方法是对所有类型的节点都有visit()方法,这些节点可能有一个X类型的节点作为子节点,并把我的节点替换为逻辑,但是可能有很多这样的节点。另外,如果我后来决定添加一种新节点,我会冒这个访问者不记得检查新特殊情况的风险。

我想解决的问题是什么:

对于当前的情况,我在FunctionCall类型的树节点中只传达操作的名称及其参数。

我想用MethodInvocation替换那些带有适当OOish转换的人:

m(A, B) -> A.m(B)
m(n(A, B), C) -> (A.n(B)).m(C)

当然,这可以通过千种不同的方式完成,最简单的方法就是只考虑一个Call类,其中可能存在或可能不存在目标,但我想尽可能明确(即使用不同类型的节点),以表达不同的东西,如果可能的话。

0 个答案:

没有答案