1

我有一个简单的语法,并使用 antlr 2.7.7 生成了一对 c# 类。当解析器发现带有令牌的错误时,它会抛出异常;我想找出令牌来的解析流中有多少字符。我怎么做?

4

2 回答 2

2

您应该阅读 Terrence Parr 的书“The Definitive ANTLR Reference”中的第 10 章(“错误报告和恢复”)。

不知道您使用的是哪种目标语言,很难确切地告诉您该做什么。但我假设您使用的是 Java 目标,如果我错了,您可以纠正我。

当 ANTLR 识别器无法匹配输入字符串时,它会根据失败上下文抛出一个非常具体的异常。(有九种不同的异常,RecognitionException 是根类型,它自己有八个子类:MismatchedTokenException、MismatchedTreeNodeException、NoViableAltException、EarlyExitException、FailedPredicateException、MismatchedRangeException、MismatchedSetException、MismatchedNotSetException)。

根异常类型 (RecognitionException) 有一些方便的公共字段,您可能想看看它们(特别是:“index”、“line”和“charPositionInLine”)。“索引”字段告诉您发现错误的确切字符位置。“line”和“charPositionInLine”字段是不言自明的。这是JavaDoc:

http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html

于 2008-10-07T13:27:24.560 回答
2

自从我玩 ANTLR 以来已经很久了,但是如果我没记错的话,为了做你想做的事,我必须对解析器进行子类化,以保持一个字符计数器,每次找到新令牌时都会递增(使用令牌当然长度)。

于 2008-10-07T13:06:08.380 回答