当前位置: 首页 > 知识库问答 >
问题:

分析ANTLR中的错误输入时发生OutOfMemoryError

葛雨华
2023-03-14

实际上,这个问题与我之前的问题有关,即在Java和ANTLRWorks调试器中捕获ANTLR的NoViableAltExcema,但由于症状不同,我决定将它们分开。

问题在于如何将输入文本馈送到ANTLR,其中包含未知标记。例如,我们的语法不知道什么是令牌,它从<代码> @ <代码>符号开始。如果我们试图将此类文本提供给AntlWorks解释器,我们将在结果图中收到NoviableException

但是,如果我们使用Java生成和编译的语法并尝试用它解析这些无效文本,我们可以收到以下结果之一(这取决于我们将把这个未知标记放在哪里,即我们将把它放在文本中的“深度”):

1)没有错误,并且null值在chidlren字段中的顶层通用树对象(所提到的问题正是关于这种情况);

2)java.lang.OutOfMemoryError:Java堆空间错误。

这个问题是关于第二个案例的。我们如何防止ANTLR解析器的这种行为?例如,在生产中,客户端可能会通过向DSL解析器提供不正确的char序列而意外地使系统崩溃。

共有1个答案

施昊然
2023-03-14

当lexer包含可以匹配空字符串的规则时,通常会发生这种情况。例如,考虑以下规则:

WS : (' ' | '\t')*;

此规则可以创建一个WS标记,该标记总共包含0个空格和/或制表符,这意味着在输入中的任何其他标记之间可以有无限多个空格和/或制表符。在某些涉及无效输入的情况下,错误恢复过程可能会被强制进入无限循环,该循环将缓冲令牌,直到Java耗尽内存。

解决这种情况的第一步是检查每一条lexer规则,以确保这种情况不会发生。WS应该这样写,以确保至少使用1个空格和/或制表符。

WS : (' ' | '\t')+;

PS:Antlr4对语法执行静态检查,如果发生这种情况,将生成错误(4.0)或警告(4.0.1)。

 类似资料:
  • 问题内容: 我正在使用ANTLR在我正在编写的Java工具中解析逻辑表达式,并且遇到了问题,因为将无效的输入字符串传递给生成的ANTLR词法分析器和解析器不会引起任何异常。生成的文件没有像我期望的那样抛出RecognitionException,而只是将错误消息打印到控制台并像没有发生错误一样返回,从而导致我的程序稍后运行到空数据时崩溃。 我使用ANTLRWorks版本1.4.3生成文件,似乎应该

  • 问题内容: 我正在构建用于学习的编程laguange的简单语法。 我遇到了奇怪的错误,对我来说毫无意义。 我正在使用此语法的预构建词法分析器和解析器: 我正在解析此Java代码: 最后是我要解析的字符串: 问题答案: 错误消息表示包含值“ void”的预期令牌类型与通过使用输入中的字符串“ void”产生的实际令牌类型不匹配。查看您的词法分析器规则,表明IDENTIFIER规则正在使用输入字符串’

  • 我有一个巨大的csv文件(500MB)和400k条记录 栏目文本由许多信息和句子组成。我想获取此列(“文本”),将所有非字母符号替换为“”,并将其按从“文本”列中最常见的单词到最不常见的单词(限制为1000)的相反顺序排序。这就是它的样子。我正在使用CsvReader库 运行后,我出现内存不足错误,GC超过了该错误。如何做到最好?我不能增加堆大小,我只需要使用默认设置

  • 我正在尝试使用opennlp处理文档分类器。但是我对训练文件有困难。当opennlp读取文件时,我收到以下错误: 我的培训文件如下所示: 我没有得到我可能错过的东西。

  • Im试图使用SQOOP将一个小表从mysql导出到HDFS,该表有两列id(主键)和名称。我可以通过SQOOP列出数据库和表。但在将表导入到HDFS时出现异常。好心的帮助。下面是错误日志。

  • 为了快速地将数据插入到数据库中,我一直在尝试生成一个巨大的SQL(大约200个查询),但由于某种原因,我得到了SQL错误,但不确定是什么导致了它。 错误: SQL错误(1064):您的SQL语法有错误;查看与您的MySQL server版本相对应的手册,以了解在第8行附近使用的正确语法 下面是我的一部分代码: 你可以在Pastebin上找到我的完整SQL。 不知道是什么原因造成的,因为后面的“6”