假设这个抽象语法树:
我想ANTLR将使用递归算法(深度优先遍历)遍历此树。我将多次评估此树(例如,10MM次)。
使用递归算法遍历此树,我可以使用迭代(使用我自己的堆栈)。对于性能的傀儡,我认为迭代算法会表现得更好。 ANTLR真的使用递归遍历吗?这真的是性能问题吗?
谢谢!
答案 0 :(得分:1)
ANTLR 4默认情况下,访问者肯定会使用递归遍历。 ANTLR 4监听器使用walker,ParseTreeWalker.walk
的当前实现也使用递归遍历。
在高性能场景中,侦听器和访问者的设计是为了方便使用,在ANTLR 4解析树转换为其他执行表示时,例如自定义字节码解释器(例如StringTemplate 4),动态代码生成到ECMA- 335或JVM字节码,或JIT / AOT编译到本机代码。这不是一个性能问题,因为解析树只被评估了几次。