parsing - 解析器错误-自动生成错误处理的模式

标签 parsing compiler-construction grammar

有什么已知的方法可以对机器生成的解析器实现良好的错误处理吗?
是否存在针对此类问题的“模式”或已知算法?

对于“好”,我的意思是类似于手工制作的递归下降解析器和现代编译器可获得的结果:
解析器不会在出现第一个错误时就停止,而是可以发出“有意义的”错误,而不仅仅是发出“xyz行中无法识别的标记”一次错误。

理想情况下,这种方法也应该是自动化的,而不是
手工制作的。

我不是在寻找库,而是需要一种可以在不同平台上使用的方法,理想情况下,它应尽可能地独立于语言。

最佳答案

使用传统的YACC/野牛生成器,您会得到yyerror/YYERROR框架,由于LALR解析器的无序回溯特性,使用该框架很难生成非常有用的错误消息。
您甚至可以在其中添加错误恢复规则,因为您可能需要它们来抑制失败规则中的错误错误消息,而这些错误消息仅是您想解析的规则。

使用基于PEG的解析器,您可以获得更好的~{}后缀错误操作块语法。参见例如。 peg manual

  rule = e1 e2 e3 ~{ error("e[12] ok; e3 has failed"); }
         | ...

  rule = (e1 e2 e3) ~{ error("one of e[123] has failed"); }
         | ...

您会在错误的实际位置收到出色的错误消息。但是您必须编写PEG规则,尤其是要编写起来并不容易。处理运算符优先级时。使用LALR解析器更容易。

使用更简单的recursive descent parser生成器,您可以获得与PEG相同的错误报告优势,但解析速度要慢得多。

http://lambda-the-ultimate.org/node/4781上看到相同的讨论

关于parsing - 解析器错误-自动生成错误处理的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708817/

相关文章:

javascript - 如何解析 C# 代码然后将其序列化回文本文件

php - 建议提高页面加载速度

parsing - 在 StandardTokenParsers 中使用正则表达式

c++ - 在编译系统中,链接器(ld)如何知道将myprogram.o链接到谁?

python - 不在实时服务器上托管编译器的原因是什么?

grammar - Perl 6是否应该能够从不同的来源中解脱出包含相同角色的问题?

parsing - 使用 Hadoop 解析用户代理

php - 在 PHP 中解析时取消格式货币

java - 语义分析时如何处理多个源文件?

c - 如何导出 C 表达式 "4 - 2 - 1"?