【问题标题】:Error reporting and recovery in parser generators解析器生成器中的错误报告和恢复
【发布时间】:2014-02-22 06:28:02
【问题描述】:

我认为解析器生成器是您的编程工具包中的一个非常好的工具,所以在玩了一些之后,我编写了自己的工具,只是为了更好地理解事情,结果比我预期的要好,所以我坚持使用它.

最近困扰我的一件事是错误报告和恢复。我做的不是很好。我知道一种方法是令牌同步,但线索似乎停在那里。除了滚动您自己的递归下降解析器并包含各种启发式方法之外,还有哪些通用方法可以在解析器生成器中处理错误报告和错误恢复?

【问题讨论】:

  • 你写了什么类型的解析器生成器?
  • @Apalala:PEG 与一些 OMeta 位用于语义动作和谓词。

标签: parsing error-handling parser-generator error-recovery


【解决方案1】:

使用自上而下的 PEG,您可以自动或手动实现“剪切”功能,这样您就可以在尽可能接近源头的地方报告错误。请参阅Grako 和引用的article by Kota Mizushima。在输入中看到某些标记后,“cut”会使替代方案无效,因此解析器可以知道如何及早失败。

一般来说,我不喜欢错误恢复,因为在第一个错误之后报告的错误往往是令人讨厌的,正如 Turbo Pascal 曾经证明的那样。

恢复的一般策略是对输入序列执行重写、插入或删除,以便解析器可以继续。有关仅基于删除的简单恢复策略(跳过输入直到出现预期标记),请参阅Wirth's A+D=P 的第 5.9 节。

【讨论】:

  • 我已经实施了削减。它们确实非常方便。
  • 为什么说uniformfurthest failure position不报最近的错误?
  • @Valentin。现在我不记得说过了,但如果我这样做了,那一定是因为最远的失败可能发生在不是最合理的推导上。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2021-11-22
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多