解析不完整或不正确的代码的参考资料?

10

有没有人能为我指出针对包含语法错误或缺少必要标点符号等代码的解析技术的参考文献呢?

我正在开发一个集成开发环境,我们希望在不要求在调用函数时源代码处于语法正确状态的情况下,提供"跳转到定义"、自动完成和重构功能等特性。

我见过的大多数解析器代码似乎都是基于"早期失败"原则工作的,而非专注于错误恢复或解析部分完成的代码。

3个回答

4

您尝试过ANTLR吗?

在 "The Definitive ANTLR Reference" 中,Terrence在第10.7节中讨论了5页的自动错误恢复策略。他引用了Algorithms + Data Structures = ProgramsA Note on Error Recovery in Recursive Descent ParsersEfficient and Comfortable Error Recovery in Recursive Descent Parsers

此外,请参阅网站上的页面:

同时,查看 ANTLR 标签以访问 ANTLR 论坛,Terrence Parr 在那里回答问题。他在这里作为 ANTLR 专家 回答一些问题。

另外,ANTLR 4 的新版本即将发布,以及书籍

抱歉听起来像是在推销,但我已经使用 ANTLR 多年了,因为它被许多人使用,在生产系统中得到应用,有几个稳定的版本:Java、C、C#,拥有一个非常活跃的社区,有一个网站,有书籍,正在不断发展,维护良好,开源,采用 BSD 许可证,易于使用,并且有一些 GUI 工具。

其中一个正在为 ANTLR 4 编写 GUI 的人是 Sam Harwell。如果您可以通过 ANTLR 论坛联系到他,他可能能够帮助您。


有趣的是,ANTLR 明显现在有了一个 JavaScript 源代码生成器。这可能使其成为对现有解析器进行从头重新设计的更合理的候选者。感谢提供错误恢复链接 - 它们给了我关于除单符号插入和删除以外的恢复选项支持情况的想法。 - Mark Bessey
@MarkBessey 我不确定 JavaScript 目标是否得到维护。我已经在 ANTLR 论坛上为你发布了一个状态问题。你可以在 http://antlr.markmail.org/search/?q=#query:+page:1+mid:dsv33hegehdr7wh3+state:results 查看,无需注册。 :) - Guy Coder
@MarkBessey 作者发布的 JavaScript 目标的最后一篇文章在这里 http://antlr.markmail.org/search/?q=Joey+Hurst#query:Joey%20Hurst+page:1+mid:cdn4hfexethqo67s+state:results。请注意,那时只是 alpha 版本,而且作者自那以后就没有再出现在论坛上了。 - Guy Coder
最坏的情况下,它仍然是一个潜在的创意来源。 - Mark Bessey
@MarkBessey 在你做出避免使用当前版本的JavaScript来处理ANTLR的正确决定时,请考虑以下事项:该代码是开源的,采用BSD许可证。您可以随时拾取现有的JavaScript目标(alpha版本)并使其正常工作。我无法帮助进行转换,但ANTLR论坛会提供尽可能的帮助。现在有人正在考虑从头开始制作ANTLR的Ruby版本。您可以在ANTLR论坛上关注它。 - Guy Coder

3
我不知道有没有相关的论文或教程,但uu-parsinglib是一个Haskell解析库,可以以一般方式从语法错误中恢复。例如,如果期望出现;,但接收到int,则解析器可以继续,就好像在该源位置插入了;一样。
您可以决定解析器在哪里失败以及在哪里进行更正,并将结果与解析过程中纠正的一组错误一起提供。即使您不打算在Haskell中实现解析代码,查看该库也可能为您提供一些见解。或者您可以在Haskell中编写解析器,并从C中调用它

会看一下以获取灵感。我将在Javascript中实现它,因此Haskell库本身对我来说不太可能有用。 - Mark Bessey

0
研究“孤立语法”可能会引起您的兴趣。我已经有一段时间没有看过它们了,但我相信它们应该能够合理地处理文件中存在许多无意义块的情况。我在CiteSeer上运气不太好(奇怪的是,通常它表现得很好),但Google Scholar找到了许多相关的论文。使用孤立语法生成健壮的解析器看起来是一个很好的起点。

哦,太好了。这解决了如何从无法解析的代码中提取某些信息的问题,而不是传统编译器中更典型的单符号插入和删除的错误恢复模式。 - Mark Bessey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接