在我的用例中,我必须使用生成的解析树上的Visitor来将数千个小的独立表达式解析为树表示。 目前,为每个解析操作创建了新的流,词法分析器和解析器实例。
我认为这可能不是最佳的。在这样的设置中可以重用哪些对象实例来利用ANTLR4的预热属性?线程安全怎么样 - 这些实例中的哪一个应该是本地线程?重新使用词法分析器或解析器实例需要重置某种类型吗?
答案 0 :(得分:11)
在ANTLR 4的早期(在其首次发布之前的几个月),自适应DFA缓存是基于每个实例创建的,因此使用Lexer.setInputStream
或Parser.setInputStream
对于取得良好的业绩。
现在已经不是这样了。后台缓存现在在所有解析器实例之间共享,并且是线程安全的。 Lexer
和Parser
类的方法不是线程安全的,因此如果要解析多个线程,则需要创建lexer和解析器的多个实例。