【发布时间】:2017-12-13 18:31:42
【问题描述】:
我目前正在规划语言解释器的结构,我意识到我不喜欢专门使用访问者或侦听器树遍历方法的想法。
由于这两种遍历树的方法都有其优点,理想情况下,我想混合使用这两种方法:
- 在遍历任意语言块定义(函数/类定义、类似结构/枚举的定义)时使用侦听器最有意义,尤其是当它们可以嵌套时。
- 访问者似乎很自然地适合诸如表达式评估之类的情况,在这种情况下,上下文更加可预测,并且结果值可以返回到链上。
在两种遍历方法之间切换最“正确”的方法是什么?
到目前为止,我的想法如下:
为解析树的一部分从监听器切换到访问器
说,当监听器到达节点“Foo”时,我想使用访问者更明确地处理它的子节点。我能想到的一种方法是:
- 解析 Tree walker 调用
enterFoo(ctx)- 创建一个 myFooVisitor 的实例
- 显式访问儿童、存储结果等
- 设置
ctx.children = [](或等效项)
- 当
enterFoo()返回时,解析树遍历器会看到该节点没有更多子节点,因此不会不必要地遍历 Foo 的所有子节点
为解析树的一部分从访问者切换到监听者
这对我来说更明显。由于在使用访问者时树的遍历是明确控制的,因此切换似乎很简单。
-
visitFoo()被调用- 创建一个新的解析树遍历器和 myFooListener 的实例
- 照常使用侦听器启动walker。
【问题讨论】: