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

如果出现错误,则查找下一个预期令牌ANTLR 3

龚伯寅
2023-03-14

我正在使用ANTLR3,我有一个问题是,如果输入中出现任何错误,我如何找到下一个预期的令牌。我试图重写解析器的getErrorMessage(RecognitionException e,String[]tokenNames),我可以得到错误,但不能得到下一个预期的令牌。如果有人能帮忙。提前谢了。

共有1个答案

白学
2023-03-14

那不像听起来那么容易。而且通常情况下,这种信息是不可用的。

例如,您的语法可以匹配以下括号表达式:(1+2)

如果解析器现在尝试解析“(1+2”),将抛出MismatchedTokenException,其expected属性的类型为')'。所以,这是一个简单的问题。

但是,当它试图解析“1+2)”时,会再次抛出MismatchedTokenException,但是现在解析器会抱怨它需要EOF,因为它只需要解析像1+2这样的表达式。它不会告诉您在“过去”的某个地方,您忘记了一个'('

因此,只有几种情况允许您从解析器引发的异常中提取预期的令牌。在大多数情况下,您将需要做(大量艰苦的)工作来提取这些信息自己。在解析器中创建有意义的错误消息并不是一项简单的任务!(至少,不是简单地为一门不太复杂的语言写语法)

我建议查看ANTLR的API文档,以查看ANTLR抛出了哪些异常,并为解析器提供无效输入,并在解析器中重写reporderor(...)以查看抛出了哪些异常:

@parser::members {

  @Override
  public void reportError(RecognitionException e) {
    // inspect 'e' and handle/report it
  }
}
 类似资料:
  • 使用Java OAuth2客户端库:scribe 1.2.0(https://github.com/scribejava/scribejava) 我可以从授权码中获取刷新令牌(即,通过向https://accounts.google.com/o/oauth2/token使用客户机id、客户机机密、代码、范围、授权类型(授权代码)、重定向uri参数)。我将刷新令牌保存在DB中。我们还支持驱动器和日历

  • 以下是场景: 我使用的是Spring Security 4.0.1,它默认启用了CSRF,直到昨天一切都正常。 昨天,我添加了Spring Security标签,登录(和其他表单工作正常),但一个特殊表单停止工作。 此表单是多部分的,因为上载了两个文件,此表单具有CSRF参数,但服务器正在返回: HTTP状态403-未找到预期的CSRF令牌。您的会话是否已过期? 基本上是这样的: 当然,这是一个完

  • 我正在使用Ionic,我需要发送令牌来获取api数据。下面的代码工作正常 但当尝试从本地存储读取数据时,却无法获取api数据。显示授权错误。我试过的代码是 当console.log((localStorage.get项目('令牌')))尝试打印相同的令牌-"d5213668d34013c9087273a5efab6d39d6d8bfb9"检查两者的类型都给出字符串

  • 我是按照Spring Blog(https://spring.io/guides/tutorials/spring-security-and-angular-js/)的教程来的。但是我从一个现有的Spring应用程序开始,因此我不使用Spring Boot开始,我必须找到一种方法来实现XML和Java配置混合风格的组件。 这是我的CORS过滤器: 这是我的CsrfHeaderFilter.java

  • 当我试图在访问令牌过期之前使用刷新令牌生成访问令牌时,系统会生成一个新令牌,并且一切正常。但是如果访问令牌过期,则请求返回。 中的方法不是使用我从以前的访问令牌中存储在字典中的标识生成访问令牌吗? 如果上一个更新令牌尚未过期,如何阻止客户端使用相同的刷新令牌请求新的访问令牌? oauthProvider.cs: RefreshTokenProvider.cs: 对不起,英语不好,希望你能理解!

  • 问题内容: 我在解析简单的JSON字符串时遇到问题。我已经在JSONLint上检查了它们,它表明它们是有效的。但是当我尝试使用jQuery替代方法解析它们时,出现了以下错误: 注意:我正在使用PHP 对字符串进行编码。 问题答案: 您的数据已经是一个对象。无需解析。javascript解释器已经为您解析了它。