实际上,这个问题与我之前的问题Catching ANTLR's NoViableAltException in Java and ANTLRWorks Debugger 有关,但由于症状不同,我决定将它们分开。
问题在于提供给 ANTLR 输入文本,其中包含未知标记。例如,考虑到我们的语法对以符号开头的标记一无所知@
。如果我们尝试将此类文本提供给ANTLRWorks
解释器,我们将NoViableAltException
在结果图中收到。
但是如果我们使用 Java 中生成和编译的语法并尝试用它来解析这些无效文本,我们会收到以下结果之一(这取决于我们将放置这个未知标记的位置,即我们将放置它的“深度”成文本):
1)没有错误,并且顶级对象null
中的字段值(提到的问题正是关于这种情况);chidlren
CommonTree
2)java.lang.OutOfMemoryError: Java heap space
错误。
这个问题是关于第二种情况的。我们如何防止ANTLR
解析器的这种行为?例如,在生产环境中,客户端可能会通过向 DSL 解析器提供不正确的字符序列而意外地使系统崩溃。