【问题标题】:ANTLR: error recovery and reportingANTLR:错误恢复和报告
【发布时间】:2012-02-23 22:20:38
【问题描述】:

我在使用 ANTLR v3 恢复和重新发布错误时遇到问题。我关注这个链接http://www.antlr.org/blog/antlr3/error.handling.tml,但我没有那个解决方案。 我想做一些报告和恢复 例如在这样的源程序中: 学生输入代码:

FOR(int a=0;a<10;a++){
 b=b*a;
}

程序会这样报告: 程序:“您的意思是关键字 FOR 用于吗?” 学生回答:“是” 之后系统恢复并自动修改源代码。 用 ANTLR v3 怎么做?不可能用 ANTLR 做? 需要帮忙。谢谢大家!

【问题讨论】:

  • 从头开始解析是否可以接受?它可能会简化实现。

标签: java antlr


【解决方案1】:

我认为您需要在生成的解析器类中覆盖org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken

当 ANTLR 检测到无效令牌时调用此函数。因此,在您自己的函数中,您可以询问用户是否需要恢复。

如果需要,您可以致电BaseRecognizer.recoverFromMismatchedToken 执行恢复。如果没有,你可以抛出异常MismatchedTokenException

【讨论】:

  • 你能给我那个例子的链接吗?我只是困惑。但感谢 lex li
  • 我不能给你一个 Java 例子,因为我在 C# 中使用了 ANTLR。 github.com/lextm/sharpsnmplib/blob/… 这是一个用 C# 定义的分部类,最终将与 Smi.g 语法文件中的 ANTLR 生成的 SmiParser.cs 文件合并。 SmiParser 类派生自 ANTLR 的 BaseRecognizer。在这里,我重写了 RecoverFromMismatchedToken 函数以简单地一直抛出异常。在 Java 中,您应该使用类似的方式来覆盖函数,然后实现自己的逻辑。
  • 感谢 lex li 提供的解决方案。对于您的情况,不可能像这样使用 ANTLR 的概念stackoverflow.com/questions/9262195/…
  • @Berto:我认为recoverFromMismatchedToken 会发生在 AST 生成之前。即使采用这种方法,您也应该能够使用 AST。
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多