如何让 ANTLR 3.2 在第一次出现错误时退出?

2023-11-23

在第 10.4 节中,权威 ANTLR 参考告诉您,如果您想在第一次解析错误时退出,请覆盖 Mismatch() 和 receiveFromMismatchedSet()。但是,至少在ANTLR 3.2中,似乎没有mismatch()方法,并且recoverFromMismatchedSet()文档说它是“当前未使用”。自这本书出版以来,情况似乎发生了变化。

我应该怎么做才能在 ANTLR 3.2 中出现第一个解析错误时退出?


我将这个问题发布到 anltr-interest,Andrew Haritonkin 回答了。巴特·K 说对了一半。您需要重写recoverFromMismatchedSet(),但也需要重写recoverFromMismatchedToken()。

如果您还希望词法分析器在出现第一个错误时退出,有一个 wiki 页面解释了该怎么做:

http://www.antlr.org/wiki/pages/viewpage.action?pageId=5341217

简而言之,它指出:

  1. 如果你想抛出 RecognitionException (或任何继承自 Exception 的东西),那么你必须使用一些偷偷摸摸的 java 技巧,因为相关方法不会声明任何异常
  2. 如果可以抛出 RuntimeException 或 Error,那么您可以重写 nextToken() 以抛出异常,而不是调用recoverError(),或者您可以重写recoverError()。抛出异常。

以下是在出现第一个词法分析器或解析器错误时退出的示例语法:

grammar Test;

@parser::members {

  public static void main(String[] args) throws Exception {
    String text = args[0];
    ANTLRStringStream in = new ANTLRStringStream(text);
    TestLexer lexer = new TestLexer(in);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    System.out.println(new TestParser(tokens).mainRule());
  }

  @Override
  protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) throws RecognitionException {
    throw new MismatchedTokenException(ttype, input);
  }

  @Override
  public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
    throw e;
  }

}

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

@lexer::members {
    @Override
    public void reportError(RecognitionException e) {
        throw new RuntimeException(e);
    }

}    

mainRule returns [List<String> words]
    @init{$words = new ArrayList<String>();}
  :  w=Atom {$words.add($w.text);} (',' w=Atom {$words.add($w.text);} )* EOF
  ;


Atom: '0' | '1';

WS  :  ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;

示例输出:

C:\Users\dan\workspace\antlrtest>java -cp .;antlr-3.2.jar TestParser "1,0" 
[1, 0]

C:\Users\dan\workspace\antlrtest>java -cp .;antlr-3.2.jar TestParser "1,,0"
Exception in thread "main" MismatchedTokenException(6!=4)
        at TestParser.recoverFromMismatchedToken(TestParser.java:45)
        at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:115)
        at TestParser.mainRule(TestParser.java:86)
        at TestParser.main(TestParser.java:40)

C:\Users\dan\workspace\antlrtest>java -cp .;antlr-3.2.jar TestParser "1,+0"   
Exception in thread "main" java.lang.RuntimeException: NoViableAltException('+@[])                                                                
        at TestLexer.reportError(TestLexer.java:16)                           
        at org.antlr.runtime.Lexer.nextToken(Lexer.java:94)                   
        at org.antlr.runtime.CommonTokenStream.fillBuffer(CommonTokenStream.java:119)                             at org.antlr.runtime.CommonTokenStream.LT(CommonTokenStream.java:238) 
        at org.antlr.runtime.Parser.getCurrentInputSymbol(Parser.java:54)     
        at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:104)    
        at TestParser.mainRule(TestParser.java:68)                            
        at TestParser.main(TestParser.java:40)                                
Caused by: NoViableAltException('+'@[])                                       
        at TestLexer.mTokens(TestLexer.java:165)                              
        at org.antlr.runtime.Lexer.nextToken(Lexer.java:84)
        ... 6 more              
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 ANTLR 3.2 在第一次出现错误时退出? 的相关文章

  • 如何使用加密的 DLQ 将重新驱动策略添加到 SNS

    我有一个 SNS 用 KMS 加密 由两个 lambda 订阅 我正在尝试向其中一项订阅添加重新驱动策略 相关 DLQ 已加密 添加重新驱动策略会出现错误 无法检查 Amazon SQS 队列权限 确保队列存在并且您的帐户有权读取队列的属性
  • VBA Excel 简单错误处理

    我尽可能多地上网查看 除了微软支持网站 该网站由于某种原因在工作中被屏蔽 我试图简单地跳过一个错误 我在这里编写的代码经过简化 但应该以相同的方式工作 我的代码应该做什么 我的一名潜艇在循环中创建形状并命名它们 btn 1 btn 2 等
  • javascript node.js 在 try catch 中获取行号?

    我在 node js 脚本上使用 try catch try catch err console log err 我得到这样的输出 stack Getter Setter arguments undefined type called no
  • 忽略 shell 脚本中的特定错误

    我有一小段 shell 脚本 它可能会引发许多错误 我当前将脚本设置为在出现所有错误时全局停止 不过我希望这个小部分略有不同 这是片段 recover database using backup controlfile until canc
  • 如何使用 .NET 2.0 捕获 using 块中的异常?

    这些天 当我有一个实现 IDisposable 的对象时 我尝试越来越多地利用 using 块 但我还没有弄清楚的一件事是如何像在正常的 try catch finally 中一样捕获异常 有任何代码示例可以为我指明正确的方向吗 编辑 阅读
  • 输入不是数字时输出错误。 C++

    我正在创建一个函数 它从用户的输入中获取一个数字并找到它的绝对值 如果用户输入数字以外的任何内容 我想让它返回错误 我该怎么做呢 我知道这对很多人来说可能是一个简单的问题 但我正在上第一堂 C 编程课 所以我知之甚少 任何帮助将不胜感激 如
  • 容器“Android 依赖项”引用不存在的库 appcompat_v7.jar”

    我知道这个问题已被问过很多次 但不幸的是找不到任何解决方案 所以这里是 The container Android Dependencies references non existing library C Users Zain ul a
  • SecurityException:无法找到 dex.jar android 的字段

    昨天晚上我升级到ADT 21并重新启动 Eclipse 然后eclipse说需要将android tool更新到21版本 我下载了window installer21并将其安装在我之前安装 window installer 的同一位置 所以
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 执行错误日志记录的简单方法?

    我创建了一个小型 C winforms 应用程序 作为一项附加功能 我正在考虑向其中添加某种形式的错误日志记录 有人对解决这个问题有什么好的建议吗 这是我从未考虑过添加到以前的项目中的功能 因此我愿意接受有更多经验的开发人员的建议 我正在考
  • 如何在 shell 函数中获得“set -e”的效果和用处?

    set e 或以 bin sh e 对于出现问题时自动轰炸非常有用 它使我不必对每个可能失败的命令进行错误检查 如何在函数内获得与此等效的内容 例如 我有以下脚本 该脚本在出现错误时立即退出 并显示错误退出状态 bin sh e echo
  • 如何实现一个“更好”的Finally Rx操作符?

    最近我意识到 RxFinally https learn microsoft com en us previous versions dotnet reactive extensions hh212133 v vs 103 操作符的行为方式
  • Go 中的格式错误 - %s %v 或 %w

    s v and w可用于格式化 Go 中的错误 将它们转换为字符串 fmt Errorf 它们在 Go 自己的工具中的使用方式似乎有所不同 In cmd go internal get path go https github com go
  • Jena tdb 中的事务发生错误?

    我正在尝试将属性写入模型 然后查询它 我的代码的这一部分 String directory EMAILADDRESS create the dataset for the tdb store Dataset ds TDBFactory cr
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 是否存在应明确跟踪或忽略的事件?

    在做研究解决问题的同时如何在处理程序之后自动重新引发异常 https stackoverflow com q 56084252 216356 开发了一个异常类 具有在处理后自动再次抛出自身的能力 受到ThreadAbortException
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 在 ANTLR4 中如何检查行的第一个字符是否为“*”?

    我正在尝试为一种相对简单但特殊的语言编写一个解析器 简单地说 规则之一是注释行用星号表示only如果该星号是该行的第一个字符 我如何在 ANTLR4 中正式化这样的规则 我考虑过使用 START LINE COMMENT n n gt sk
  • 调试断言失败。表达式(流!=NULL)

    我收到以下错误 调试断言失败 表达式 流 NULL 文件 f dd vctools crty bld self x86 crt src fwrite c 创建 4 个线程时 CPU 使用率 100 该代码最初运行良好一段时间 然后给出此错误

随机推荐

  • 将包含美元符号的字符串传递给 -Replace Variable

    我正在尝试使用 powershell 替换 config 文件中的句子 c Web config c Web config replace BASE PATH Test bin Test TYPE WebTest dll c program
  • 如何使用react-router-dom创建受保护的路由?

    如何创建受保护的路由react router dom并将响应存储在 localStorage 中 以便用户下次尝试打开时可以再次查看其详细信息 登录后 他们应该重定向到仪表板页面 所有功能都添加到 ContextApi 中 代码沙箱链接 C
  • SqlParameter名称前是否需要加@?

    在我们的一个应用程序中 参数以这种方式传递给存储过程 Dim parm As New SqlParameter searchText SqlDbType VarChar parm Direction ParameterDirection I
  • setSize 不影响按钮的大小

    我有一个示例代码 import java awt import javax swing import javax swing border BevelBorder public class AWT extends JFrame public
  • 按固定宽度将字符串拆分为子字符串

    我有数据看起来像这样 1 TESTAAA SERNUM A DESCRIPTION 2 TESTBBB ANOTHR ANOTHER DESCRIPTION 3 TESTXXX BLAHBL 我的问题是 将这些数据分割成更小的子字符串的最有
  • 解析 JavaScript 中的相对 URL

    我正在构建一个 JS 库 它需要查看 form action 和 a href 值并将它们解析为绝对 URL 例如 我在 http a b c d p q 上遇到 href 值 g 假设没有 元素 生成的绝对值将是 http a b g 有
  • Postman 向 Binance API 发出 GET 请求

    我正在尝试发送GET向 Binance 的 API 请求 但我不知道该怎么做 这是文档页面 https github com binance exchange binance official api docs blob master re
  • 如何在IOS SDK 8.0中获取当前位置经纬度

    如何获取当前位置的纬度和经度 我已经尝试过这个 使用 Xcode 6 01 和 IOS SDK 8 0 CLLocationCoordinate2D getLocation locationManager CLLocationManager
  • getResultSet()“每个结果应该只调用一次”

    根据文档 for getResultSet in java sql Statement 它说 以 ResultSet 对象的形式检索当前结果 这个方法应该 每个结果仅被调用一次 使用一些测试代码 我跑了executeQuery 并多次致电g
  • 我的业务逻辑应该如何与数据层交互?

    所以我正在起草我的计划草案 这是我的计划 GUI Business Logic Data 您应该能够更换GUI or the Data层没有问题 每一层都在观察自己 所以GUI将从中调用方法Business logic这些方法将始终返回状态
  • 如何让单个组件同时支持VCL和FMX?

    我有一个TComponent它控制一些 UI 该组件旨在通过使用条件来支持 VCL 和 Firemonkey 此类条件指示我的组件是接受 VCL 控件还是 FMX 控件 目前预计该条件是在应用程序级别定义的 以指示运行时的组件是否要管理 V
  • 为什么在解析二进制数据时memcpy比reinterpret_cast慢?

    TLDR 我忘记启用编译器优化 启用优化后 性能 几乎 相同 原帖 当从二进制数据读取整数时 我注意到 memcpy 比转换解决方案慢 版本 1 reinterpret cast 由于潜在的对齐问题而有臭味 但也更快 int get int
  • 屏幕旋转上的片段

    我已将 viewpager 添加到包含两个页面的活动中 在活动的 onCreate 中 我将片段添加到fragmentAdapter public void onCreate Bundle savedInstanceState Fragme
  • 使用 ThreadPoolExecutor 的活动任务数

    我正在使用 ThreadPoolExecutor 在 Java 应用程序中执行任务 我有一个要求 我想获取执行程序队列中任何时间点队列中活动任务的数量 我抬头看了看javadoc对于ThreadPoolExecutor 找到了两个相关的方法
  • SQLite Blob 插入 C++

    在访问了数十个包含 SQLite 信息的网站后 我仍然找不到解决方案来修复绑定 blob 时的错误 这是表减角 CREATE TABLE ONE ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL N
  • Angular2:没有延迟加载的路由器“loadChildren”相当于什么

    我正在尝试 插入 一个子 ngModule 功能模块 其中包含路由配置 从RouterModule forChild 到父 ngModule 中 当使用延迟加载时 指定 插入 子模块的位置是使用loadChildrenkey 在父模块路由配
  • Bootstrap 弹出窗口内的 html 表单不起作用

    我正在尝试在引导弹出窗口中使用表单 一些基本的 html 可以工作 文本样式 按钮 但表单却不能 onclick javascript 操作也不会 我尝试了多种选择 但在网上找不到任何解决方案
  • 通过字符串导入从模块导入*

    我知道我可以使用importlib通过字符串导入模块 我怎样才能重新创建import 使用这个库的功能 基本上 我想要这样的东西 importlib import module path to module 我不为导入的属性设置命名空间的原
  • 处理 LINQtoSQL 中的 SQLite 自动增量列映射

    我有以下实体 Table Name Users public sealed class UserDB private Int64 id 1 private string username string Empty public UserDB
  • 如何让 ANTLR 3.2 在第一次出现错误时退出?

    在第 10 4 节中 权威 ANTLR 参考告诉您 如果您想在第一次解析错误时退出 请覆盖 Mismatch 和 receiveFromMismatchedSet 但是 至少在ANTLR 3 2中 似乎没有mismatch 方法 并且rec