【问题标题】:Any references for parsing incomplete or incorrect code?解析不完整或不正确代码的任何参考资料?
【发布时间】:2012-09-07 04:03:33
【问题描述】:

任何人都可以向我指出有关解析包含语法错误或缺少必要标点符号的代码的技术的参考资料吗?

我正在开发的应用程序是一个 IDE,我们希望在其中提供“跳转到定义”、自动完成和重构功能等功能,而不要求源代码目前在语法上是正确的函数被调用。

我见过的大多数解析器代码似乎都按照“早期失败”的原则工作,而不是专注于错误恢复或解析部分完整的代码。

【问题讨论】:

    标签: parsing programming-languages heuristics


    【解决方案1】:

    你试过ANTLR吗?

    在“The Definitive ANTLR Reference”的 10.7 节 5 页的自动错误恢复策略中,Terrence 谈到了这一点。他引用了Algorithms + Data Structures = ProgramsA Note on Error Recovery in Recursive Descent ParsersEfficient and Comfortable Error Recovery in Recursive Descent Parsers

    还可以查看网站上的页面:

    还可以查看ANTLR 标签以访问 Terrence Parr 回答问题的 ANTLR 论坛。他确实在这里以The ANTLR Guy 的身份回答了一些问题。

    ANTLR 4book 的新版本也即将发布。

    很抱歉,这听起来像是推销,但我多年来一直在使用 ANTLR,因为它被很多人使用,用于生产系统,有几个可靠的版本:Java、C、C#,有一个非常活跃的社区, 有一个网站, 有书籍, 正在发展, 维护, 开源, BSD 许可, 易于使用并且有一些 GUI 工具。

    Sam Harwell 是为 ANTLR 4 开发具有语法突出显示和自动完成功能以及其他有用 IDE 编辑功能的 GUI 的人之一。如果您可以通过 ANTLR 论坛联系到他,他或许可以帮助您。

    【讨论】:

    • 有趣 - ANTLR 显然现在有一个 Javascript 源代码生成器。这可能使其成为重新设计现有解析器的更合理的候选者。感谢您提供错误恢复链接 - 它们让我了解除了单符号插入和删除之外的恢复选项支持的内容。
    • @MarkBessey 我不确定 JavaScript 目标是否得到维护。我为您在 ANTLR 论坛上发布了一个状态问题。您可以在antlr.markmail.org/search/… 进行检查,无需注册。 :)
    • @MarkBessey JavaScript 目标作者的最后一篇文章在这里antlr.markmail.org/search/…。请注意,当时它只是 alpha 版,此后作者就没有上过论坛。
    • 好吧,最坏的情况,它仍然是一个潜在的想法来源。
    • @MarkBessey 当您做出正确的决定以避开当前用于 ANTLR 的 JavaScript 版本时,请考虑这一点:代码是开源和 BSD 许可的。非常欢迎您选择现有的 JavaScript 目标,它是 alpha,并使其工作。我无法帮助进行转换,但 ANTLR 论坛将为您提供他们可以提供的帮助。有人现在正在研究从头开始做一个 Ruby 版本的 ANTLR。您可以在 ANTLR 论坛上关注它。
    【解决方案2】:

    您可能会对“岛屿语法”的研究感兴趣。自从我查看它们已经有一段时间了,但我相信它们应该能够合理地处理文件中有很多废话的情况。我对 CiteSeer 的运气不太好(奇怪的是;通常它还不错),但Google Scholar 找到了一些相关的论文。 Generating robust parsers using island grammars 看起来是个不错的起点。

    【讨论】:

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

    我不知道任何论文或教程,但uu-parsinglib 是一个 Haskell 解析库,可以以一般方式从语法错误中恢复。例如,如果需要;,但收到了int,则解析器可以继续,就像; 被插入到该源位置一样。

    解析器在哪里失败以及在哪里进行更正取决于您,结果将与解析期间纠正的一组错误一起交付。即使您不打算在 Haskell 中实现解析代码,对该库的检查也可能会为您提供一些见解。或者你可以用 Haskell 和call it from C 编写一个解析器。

    【讨论】:

    • 至少会检查它的想法。我将在 Javascript 中实现这一点,因此 Haskell 库本身不太可能对我有用。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多