【问题标题】:How do I find character positions in ANTLR 2?如何在 ANTLR 2 中找到字符位置?
【发布时间】:2008-10-07 12:53:43
【问题描述】:

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

【问题讨论】:

    标签: exception parsing antlr


    【解决方案1】:

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

    【讨论】:

      【解决方案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

      【讨论】:

      • 我的目标是 c# - RecognitionException 类有“line”和“column”但没有“index”,它们似乎总是设置为 -1。上面的文档来自 ANTLR 3 站点 - 它是否仍然适用于 ANTLR 2?
      • 嗯嗯嗯嗯。不幸的是,我认为我对你没有任何帮助。对不起:(
      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多