当前位置: 首页 > 面试题库 >

ANTLR不会在无效输入上引发错误

董高逸
2023-03-14
问题内容

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

我使用ANTLRWorks版本1.4.3生成文件,似乎应该有某种选择使它实际上引发错误而不是打印到控制台,但是我什么都没找到。有谁知道如何让ANTLR实际抛出错误消息?我发现使用较旧版本的ANTLR解决了C#中的同一问题,这是我需要做的吗?

编辑:在巴特指出我在寻找的方向后,我找到了此页面

https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3

其“错误处理”部分的代码可以完全满足我的要求。要更改ANTLR捕获异常的方式,可以在语法文件中这样说:

@rulecatch {
   catch (RecognitionException e) {
    throw e;
   }
}

这迫使ANTLR抛出异常,而不是对其进行处理和恢复。该部分还包含一些有关覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常。


问题答案:

一个简单的解决方法是覆盖您的词法分析器和解析器reportError(...)并抛出您自己的异常,而不是让ANTLR尝试从错误的语法/输入中恢复:

grammar YourGrammar;

// options/header/tokens

@parser::members {
  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException("I quit!\n" + e.getMessage()); 
  }
}

@lexer::members {
  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException("I quit!\n" + e.getMessage()); 
  }
}

// lexer & parser rules

有关错误报告(和恢复)的更多信息:https
:
//theantlrguy.atlassian.net/wiki/display/ANTLR3/Error+reporting+and+recovery



 类似资料:
  • 实际上,这个问题与我之前的问题有关,即在Java和ANTLRWorks调试器中捕获ANTLR的NoViableAltExcema,但由于症状不同,我决定将它们分开。 问题在于如何将输入文本馈送到ANTLR,其中包含未知标记。例如,我们的语法不知道什么是令牌,它从<代码> @ <代码>符号开始。如果我们试图将此类文本提供给解释器,我们将在结果图中收到。 但是,如果我们使用Java生成和编译的语法并尝

  • 我为计算表达式编写了一个非常简单的语法定义: 我尝试了无效表达式by,但它通过了。看起来字符被忽略了。这里有什么问题?

  • 问题内容: 我有这张桌子: 我使用这样的查询,但出现错误: 我想显示这样的表: 如何实现呢? 问题答案: 我想在您的查询的问题是, 是的,你是想选择一个空的()。 您必须解决方法: 更改为(2010,2012 ..将被视为字符串,我不知道是否可以) 放:

  • 问题内容: 我目前有一个简单的react应用程序,无法获得这些onchange事件来激发我的生命。 有趣的是,当我使用时,会触发事件,但函数中的ev变量不正确。 问题答案: 尝试: 要么: 代替:

  • 问题内容: 从未见过这样的错误: 错误[22P02]错误:整数的无效输入语法:“”;执行查询时出错 创建表: 更新代码: 查询看起来完全像这样: 我有很多表在其中运行类似的命令,但从未见过这样的错误。 可能是什么问题? 问题答案: 我建议阅读手册中的“ 常量 ”一章。这是一篇简短且内容丰富的文章。 错误消息的原因是,这是一个 空字符串 ,没有数字类型(如)的表示形式。 @a_horse_with_

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本