在我的小编译器中,我目前有一个手工制作的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
类,其中可能存在或可能不存在目标,但我想尽可能明确(即使用不同类型的节点),以表达不同的东西,如果可能的话。