我认为解析器生成器是您的编程工具包中一个非常不错的工具,因此在玩了一些解析器后,我写了我自己的只是为了更好地理解事情,结果发现它比我预期的要好,所以我坚持使用它。
最近困扰我的一件事是错误报告和恢复。我做的不是很好。我知道一种方法是 token 同步,但踪迹似乎就此停止。除了滚动您自己的递归下降解析器并包括各种启发式方法以外,在解析器生成器中处理错误报告和错误恢复的一些通用方法是什么?
最佳答案
使用自上而下的PEG,您可以自动或手动包含“剪切”功能,因此您可以在尽可能接近错误源的位置报告错误。请参见Grako和引用的article by Kota Mizushima。在输入中看到某些标记后,“剪切”会使替代项无效,因此解析器可以知道如何尽早失败。
总的来说,我不喜欢错误恢复,因为Turbo Pascal曾经证明过,第一次出现后报告的错误往往很麻烦。
恢复的一般策略是对输入序列执行重写,插入或删除操作,以便解析器可以继续。对于仅基于删除的简单恢复策略(将输入跳过直到期望的 token ),请参阅Wirth's A+D=P的5.9节。
关于parsing - 解析器生成器中的错误报告和恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21950661/