Java 是否可以在不生成解析树的情况下使用ANTLR4侦听器?

Java 是否可以在不生成解析树的情况下使用ANTLR4侦听器?,java,parsing,antlr4,large-files,Java,Parsing,Antlr4,Large Files,我开发了一个成功的翻译器,它使用ANTLR4语法和解析树侦听器。我很高兴使用这个项目的ANTLR快速成功,并且刚刚开始比较我的基于ANTLR4的二进制输出与传统的C++代码体的较慢。(我的解决方案以速度为目标,所以即使是用Java实现的,也可以更快) 然而,当我开始用更大的110Mb输入ASCII文件测试它时,我发现堆已经用完了。这在AntlInputStream实例化期间发生。 我相信我可以用无缓冲的CHAR/令牌流解决这个问题。这也表明应该关闭解析树生成,因为解析树会消耗大量内存 如果我关闭

我开发了一个成功的翻译器,它使用ANTLR4语法和解析树侦听器。我很高兴使用这个项目的ANTLR快速成功,并且刚刚开始比较我的基于ANTLR4的二进制输出与传统的C++代码体的较慢。(我的解决方案以速度为目标,所以即使是用Java实现的,也可以更快)

然而,当我开始用更大的110Mb输入ASCII文件测试它时,我发现堆已经用完了。这在AntlInputStream实例化期间发生。 我相信我可以用无缓冲的CHAR/令牌流解决这个问题。这也表明应该关闭解析树生成,因为解析树会消耗大量内存

如果我关闭解析树生成,我的解析树侦听器将不会被调用。至少我是这样理解的。我怀疑我无法在启用解析树侦听器生成的情况下翻译1Gb文件。解决办法是什么


如果可以的话,我希望避免将我的ParseTreeListener代码移动到语法文件中。

阅读此Google Groups线程:。它引用了ANTLR4书中关于这个主题的一节(广义地说),您为JVM分配了多少内存?指定
-Xmx8g
应该足以同时处理1G的源文件。你能解释一下为什么需要将所有源代码解析成一棵解析树吗?@GRosenberg谢谢!作为一个新手,我正在建造一棵大树!正在寻找管理/修剪树的方法,但是你的文章让我看到我可以改变语法/解析器(可能)来分析块……我需要考虑这个问题。可能需要ANTLR之外的一些递归行为。我将寻找构建/解析较小树的示例。也许是在我的书中,我错过了。但我想我可以根据这些思路想出一些解决办法。周五晚些时候我在考虑这个问题。在ANTLR4源代码中找到了tree/prune标志,认为这可能也有用,但我更喜欢树限制。