最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【整理】antlr的Exception Handling异常处理中的异常Exception的类型

ANTLR crifan 2716浏览 0评论

【背景】

之前已经折腾了:

【记录】尝试折腾antlr v3的异常处理和错误恢复:VARIABLE的CLASS的值INPUT故意写错为INPUT1

【记录】折腾antlr的异常处理:使得当初错时,输出更详细的错误信息,包含堆栈信息

此处,继续折腾,去研究antlr中的异常的类型。

【折腾过程】

1.之前在:

【记录】尝试折腾antlr v3的异常处理和错误恢复:VARIABLE的CLASS的值INPUT故意写错为INPUT1

已经提及了:

Error Handling and Recovery

但是是针对于antlr v2的。不是我要的,当前主流的,我所用的antlr v3.

2.还是看作者的书:

The Definitive ANTLR Reference.pdf

中整理的比较全。

现提取整理如下:

 

ANTLR v3中的异常Exception的类型

含义

RecognitionException

antlr中所有异常的超类(superclass);

其所记录的内容包含:

  • 输入流(input stream)
  • 遇到错误时,识别器(recognizer)找到的对应的符号(symbol)的索引(index)
  • 错误的符号指针:包含多种类型:整型int,符号Token,对象Object
  • 行号
  • 出错的行内位置
MismatchedTokenException

表明了,解析器,想要在当前输入位置,去找某个特定符号,但是却没有找到;

记录内容:

  • 除了记录普通的域值field
  • 另外也会记录对应的符号类型token type,或者是字符码character code
MismatchedTreeNodeException

表明了树解析器想要找寻某个特定类型的符号的节点,但是却没有找到;

此处是针对于一个符号流解析器,去模拟不匹配的符号异常;

其记录:

  • 所希望匹配到的符号类型;
NoViableAltException

识别器,遇到一个判断节点decision point,但是往前继续匹配时,却没有遇到任何一个,和已有合法输入的内容有匹配的。

即,本来希望有哪几种输入,结果一种都没遇到,所以报错;

其记录:

  • 出错时的,前向DFA(lookahead DFA)内的判断号(decision number)
  • 和状态号(state number)
  • 同时也保存那些ANTLR用其产生此决定的那一堆相关的代码。
EarlyExitException

识别器遇到了,(..)+ EBNF的子规则,即必须有一个可选项存在,但是结果却没有匹配到;

其记录:

判断号(decision number)(但不记录状态号)

因为很明显,其不是处在前向DFA的中间,所以无需记录状态号

且忽略掉整个输入;

FailedPredicateException

一个验证语法预测,结果验证结果是失败false,则会引发此异常;

其记录:

  • 对应的预测结果失败的那个规则rule
  • 同时也记录对应的你的预测部分的语法代码;
MismatchedRangeException

识别器尝试去匹配一个范围的符号,一般都是字符串,结果匹配不到;

其记录:

  • 范围range的最小元素
  • 和最大元素
MismatchedSetException

识别器尝试去匹配一组符号,但是没有匹配到;

其记录:

  • 识别器所关心的,该组的元素;
MismatchedNotSetException

识别器,尝试去匹配一组元素的(用波浪号’~’去)取反的值,结果没有匹配到。

 

注:

1.上述的,记录内容,的意思是:当出现此类的异常,会记录下对应的和出错相关的各种信息。

 

【总结】

总体来说,antlr中的异常处理的分类和架构,还算是比较清晰的。

剩下的,只是自己遇到哪些错误,然后具体考虑如何处理的事情了。

转载请注明:在路上 » 【整理】antlr的Exception Handling异常处理中的异常Exception的类型

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.164 seconds, using 22.07MB memory