例如,任何人都可以指出有关解析包含语法错误或缺少必要标点符号的代码的技术的参考资料吗?
我正在开发的应用程序是一个 IDE,我们希望在其中提供“跳转到定义”、自动完成和重构功能等功能,而无需在调用函数时源语法正确.
我见过的大多数解析器代码似乎都按照“早期失败”的原则工作,而不是专注于错误恢复或解析部分完整的代码。
例如,任何人都可以指出有关解析包含语法错误或缺少必要标点符号的代码的技术的参考资料吗?
我正在开发的应用程序是一个 IDE,我们希望在其中提供“跳转到定义”、自动完成和重构功能等功能,而无需在调用函数时源语法正确.
我见过的大多数解析器代码似乎都按照“早期失败”的原则工作,而不是专注于错误恢复或解析部分完整的代码。
你试过ANTLR吗?
在“ The Definitive ANTLR Reference ”中,10.7 节 5 页的自动错误恢复策略 Terrence 谈到了这一点。他参考了算法 + 数据结构 = 程序,关于递归下降解析器中的错误恢复的说明,递归下降解析器中的高效和舒适的错误恢复。
另请参阅网站上的页面:
还要检查ANTLR标签以访问 Terrence Parr 回答问题的 ANTLR 论坛。他确实以ANTLR Guy 的身份在这里回答了一些问题。
抱歉听起来像是推销,但我多年来一直在使用 ANTLR,因为它被很多人使用,用于生产系统,有几个可靠的版本:Java、C、C#,有一个非常活跃的社区,有一个网站,有书籍,正在发展,维护,开源,BSD 许可,易于使用并有一些 GUI 工具。
Sam Harwell 是为 ANTLR 4 开发具有语法突出显示和自动完成以及其他有用 IDE 编辑功能的GUI的人之一。如果您可以通过 ANTLR 论坛联系到他,他或许可以帮助您。
我不知道任何论文或教程,但uu-parsinglib是一个 Haskell 解析库,可以以一般方式从语法错误中恢复。例如,如果;
预期但int
已接收,则解析器可以继续,就好像;
插入到该源位置一样。
解析器在哪里失败以及在哪里进行更正取决于您,结果将与解析期间纠正的一组错误一起交付。即使您不打算在 Haskell 中实现解析代码,对该库的检查也可能会为您提供一些见解。或者您可以在 Haskell 中编写解析器并从 C 调用它。
您可能会对“岛屿语法”的研究感兴趣。自从我查看它们已经有一段时间了,但我相信它们应该能够合理地处理文件中有很多废话的情况。我对 CiteSeer 不太满意(奇怪的是;通常它还不错),但Google Scholar找到了许多相关论文。使用岛语法生成健壮的解析器看起来是一个不错的起点。