如何在ANTLR 2中找到角色位置?

时间:2008-10-07 12:53:44

标签: exception parsing antlr

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

2 个答案:

答案 0 :(得分:2)

自从我玩ANTLR以来已经很久了,但如果我记得很清楚,要做你想做的事情,我必须将解析器子类化,以保留每次发现新标记时增加的字符计数器(当然是令牌长度。)

答案 1 :(得分:2)

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

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

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

根异常类型(RecognitionException)有一些方便的公共字段,您可能需要查看(具体来说:“index”,“line”和“charPositionInLine”)。 “index”字段告诉您找到错误的确切字符位置。 “line”和“charPositionInLine”字段非常明显。这是JavaDoc:

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