1

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

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

4

1 回答 1

4

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

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

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

于 2014-02-23T19:06:07.627 回答