antlr4解析器重用和预热

antlr4解析器重用和预热,antlr4,Antlr4,在我的用例中,我必须在生成的解析树上使用访问者将数千个小的独立表达式解析成一个树表示。 目前,为每个解析操作创建了新的流、lexer和解析器实例 我认为这可能不是最优的。在这样的设置中,哪些对象实例可以重复使用以利用ANTLR4的预热属性?线程安全性如何?这些实例中哪些应该是线程本地的?重复使用lexer或parser实例是否需要某种重置?在ANTLR 4的早期(最初发布之前的几个月),自适应DFA缓存是基于每个实例创建的,因此使用lexer.setInputStream或parser.setI

在我的用例中,我必须在生成的解析树上使用访问者将数千个小的独立表达式解析成一个树表示。 目前,为每个解析操作创建了新的流、lexer和解析器实例


我认为这可能不是最优的。在这样的设置中,哪些对象实例可以重复使用以利用ANTLR4的预热属性?线程安全性如何?这些实例中哪些应该是线程本地的?重复使用lexer或parser实例是否需要某种重置?

在ANTLR 4的早期(最初发布之前的几个月),自适应DFA缓存是基于每个实例创建的,因此使用
lexer.setInputStream
parser.setInputStream
对于实现良好性能至关重要


现在已经不是这样了。后台缓存现在在所有解析器实例之间共享,并且是线程安全的。
Lexer
Parser
类的方法不是线程安全的,因此如果要在多个线程上解析,则需要创建Lexer和Parser的多个实例。

这是否也包括所有运行时和目标?