前言

不要让用户被那些“专业术语”吓住!
用心设计的提示和反馈信息是软件设计者的“职业良心”。
 
内容
1 存在哪些错误?
2 美化错误提示
3 错误恢复策略
 
1 存在哪些错误?
在DSL语言开发周期内,首先需要设计文法,根据文法生成翻译器,然后输入语言样本测试翻译器的效果,以及根据存在的翻译问题调整翻译策略。这其中就可能存在两类错误:文法错误语言样本错误
在Parr将一些错误拉出来游街,以及盛赞ANTLR在错误提示和恢复方面的优异表现的描述中,可以观察到一些错误提示和恢复的策略和惯例:
(1)错误恢复是从语言样本中的语法错误中恢复过程,常通过修改输入符号或吃掉一些符号直到解析器到达识别了一个确定性的规则状态;
(2)应该极力避免级联错误提示信息,即每个语法错误只给出一条错误提示信息。
 
2 美化错误提示
打开ANTLR的-dfa选项,可以通过查看生成的DFA,了解识别器的决策和状态信息。
 
为实现美化的错误提示,在文法中覆盖BaseRecognizer的getErrorMesage()和getTokenErrorDisplay()方法。(文中要求覆盖displayRecognitionError()而不是getErrorMesage(),其实查看生成的代码可以产出前者会调用后者)。
 
一些内建的异常类
异常 说明
RecognitionException 识别异常。ANTLR生成的识别器抛出异常的基类。记录错误发生时的输入流信息:识别器当前看到的符号(字符、Token或树节点)的索引,错误符号的指针、当前行、行内位置。
MismatchedTokenException Token不匹配异常。指出解析器预期的特定符号当前未找到。记录额外的Token类型信息。
MismatchedTreeNodeException 树节点不匹配异常。 与上一异常类似,指出树解析器预期的特定token类型节点未找到。
NoViableAltException 无可行选项异常。识别器达到决策点,但向前看符号与所有选项均不一致。记录向前看DFA中决策号和状态号,同时记录做出此决策的一块文法。
EarlyExitException 过早退出异常。识别(...)+ EBNF子规则时,只少匹配一个,但该规则没有匹配任何符号。记录DFA中决策号。
FailedPredicateException 失败的谓词异常。语义谓词求值为false。记录规则名称和谓词文本。
MismatchedRangeException 范围不匹配异常。范围如[a..z],未匹配范围中任何符号。记录范围中最小和最大元素。
MismatchedSetException 集合不匹配异常。集合如{'a','b'},未匹配集合中任何符号。记录集合中所有符号。
MismatchedNostSetException 非集合不匹配异常。非集合指用~操作符表示的集合的拟。与上一个异常类似。
 
ANTLR识别器不用字符串信息创建异常对象,只跟踪和记录必要的用于生成错误的现场信息。
基识别器类BaseRecognizer中多个报告错误方法可以生成本地的错误信息,不要指望从上面的异常类中getMessage()方法返回什么异常信息。
 
除异常信息外,可以在文法中用自定义动作提供错误信息。
一个重要的错误信息提示是指出发生错误时所用的解析规则(栈),一般方法是在文法@members中定义个错误信息栈,在对用户意义最清晰的规则中的@init/@after动作中分别执行入栈和出栈操作,同时在@memebers动作中覆盖getErrorMessage()方法,它使用该错误信息栈的peek()获取当前现场的提示信息。
 
错误零容忍:遇到第一个错误立即退出
需要在文法@members动作中覆盖mismatch()、recoverFromMismatchedSet()方法以及覆盖默认的@rulecatch。
 
覆盖@rulecatch动作会对所有规则产生影响,可以采用细粒度的规则级catch动作来执行手动恢复操作。
 
词法和树文法的错误与一般文法类似,区别仅在于处理的是字符和树节点。
 
3 错误恢复策略
站在巨人的肩膀上
ANTLR的错误恢复机制参考了Nikalaus Wirth的"Algorithms + Data Structures = Programs"(八卦一下:好像他靠这句话拿到图灵奖)、Rodney Topor的"递归下降解析器中错误恢复记录"和一些Josef Grosch在CoCo解析器生成器的一些思路。
 
本质上的思路是,识别器在遇到不匹配的符号错误时,先尽可能的尝试单个符号插入删除是否可以恢复,如果不能,再吞掉一些符号直到向前看符号属于一个重新同步集(resynchronization set)后退出该规则。
 
重新同步集是输入符号的集合,这些符号可以合法的在当前规则和当前规则调用链中出现。

ANTLR3完全参考指南读书笔记[08]的更多相关文章

  1. ANTLR3完全参考指南读书笔记[01]

    引用 Terence Parr. The Definitive ANTLR Reference, Building Domain Specific Languages(antlr3 version). ...

  2. ANTLR3完全参考指南读书笔记[06]

    前言 这段时间在公司忙的跟狗似的,但忙的是没多少技术含量的活儿. 终于将AST IR和tree grammar过了一遍,计划明天写完这部分的读书笔记.   内容 1 内部表示AST构建 2 树文法   ...

  3. ANTLR3完全参考指南读书笔记[02]

    前言 程序语言是什么? 用wiki上的描述,程序语言是一种人工设计的语言,用于通过指令与机器交互:程序语言是编程程序的标记,而程序是一种计算或算法的描述.详细介绍和背景信息参考: Programmin ...

  4. ANTLR3完全参考指南读书笔记[07]

    前言 真正意义上的程序员都很懒,懒的连多余的一行代码也不写. 如果能将底层满手油污的活儿都可以交给别人去做,自己就扮演个智囊团成员的角色,生活会比想象中的还要惬意. 严格的按照指令执行长时间不知疲倦的 ...

  5. ANTLR3完全参考指南读书笔记[05]

    前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...

  6. ANTLR3完全参考指南读书笔记[04]

    前言 学习框架或第三方库的方法是什么 (1)少量的浏览manual或tutoral,只关注程序所需的特征,再完善其详细内容和特征的认识? (2)花大量的时间研究详细内容,再考虑程序实现? 这是个先有鸡 ...

  7. ANTLR3完全参考指南读书笔记[03]

    前言 文中第4章内容有点多,有点枯燥,但不坚持一下,之前所做的工作就白做了. 再次确认一下总体目标: protege4编辑器中Class Definition中语法解析和错误提示: Java虚拟机规范 ...

  8. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  9. css权威指南读书笔记

    今天翻手机,翻到了许久之前看css权威指南时的笔记,遂移到博客中来. 1.属性选择器p.one class名为one的p元素p[class][name] 含有class和name属性的p元素p[cla ...

随机推荐

  1. java之socket

    socket系java中网络编程的内容. 1客户端: package com.wtd.socket; import java.io.BufferedReader; import java.io.IOE ...

  2. 线程系列3---ThreadLocal类研究

    2013-12-23 17:44:44 Java为线程安全提供了一些工具类,如ThreadLocal类,它代表一个线程局部变量,通过把数据放在ThreadLocal中就可以让每个线程创建一个该变量的副 ...

  3. [vijos P1112] 小胖的奇偶

    第一次看到这题怎么也不会想到是并查集题目…星期五第一次看到这题,到今天做出来,实在是废了好多功夫.看了很多人的解题都有same和diff数组,我也写了,后来发现不对啊两个数组的话find函数怎么写呢? ...

  4. Codeforces Round #327 (Div. 2)-Wizards' Duel

    题意: 在一条长度为l的走廊,两个人站在走廊的左右两端分别以p,q的速度走来,问他们相遇时离左端的距离是多少? 思路: 非常简单的暴力题,不解释. 代码如下: #include <iostrea ...

  5. AS3事件流机制

    事件流: 显示对象,深度 MouseEnabled,MouseChildren:显示对象,同层次(父容器为同一对象)遮挡问题

  6. DotNetBar v14.0.0.3 Fully Cracked

    更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=14.0.0.3 如果遇到破解问题可以与我 ...

  7. APP store 上架过程中碰到的那些坑&被拒的各种奇葩原因整理&审核指南中文版

    苹果官方发布的十大常见被拒原因 1.崩溃次数和Bug数量.苹果要求开发者在将应用提交给App Store之前彻查自己的应用,以尽量避免Bug的存在. 2.链或错误的链接.应用中所有的链接必须是真实且有 ...

  8. 记录一些容易忘记的属性 -- UIButton

    //设置按钮文字字体(这个只在自定义button时有效)    btn1.titleLabel.font = [UIFont systemFontOfSize:30]; showsTouchWhenH ...

  9. Windows Azure 实操 —— 迁移本地SharePoint服务器到Azure

    博客地址 http://blog.csdn.net/foxdave 注意:如果你是第二代虚拟机,那就别看这个了,老老实实在Azure上重新创建吧,Azure不支持第二代虚拟机. 写在之前,对Azure ...

  10. 统计一段文字中出现频率最高的10个单词(c语言)

    注:这次使用C语言做的这个程序.个别不懂的地方和算法部分是请教的其他同学,交流并吸收,所以收获颇多! 在程序中每一个地方我都做了注释,方便同学之间交流.也让老师容易看.程序也有很多不足的地方,但限于本 ...