解析具有语法错误的代码

时间:2011-01-24 13:07:39

标签: parsing language-agnostic

解析技术在CS文献中有很好的描述。但我知道的算法要求源语法正确。如果遇到语法错误,则立即中止解析。

但IDE(如Visual Studio)通常能够在键入时提供有意义的代码完成和其他提示,这意味着语法通常不处于有效状态。例如。在函数调用中键入左括号,IDE为函数提供参数提示,即使在输入右括号之前语法无效。

在我看来,这必须依赖于某种猜测或容错的解析器。任何人都知道使用了哪些技术或算法?

2 个答案:

答案 0 :(得分:1)

Packrat很有前途 - 它提供有关关键点成功和失败解析尝试的信息,可以恢复并用于智能错误报告,完成,提示等。例如,如果光标位于缓存中所有解析尝试都标记为失败的位置,则可以为完成选项提供尝试的令牌列表。

答案 1 :(得分:1)

标准技巧是使用解析机制进行某种错误修复,以帮助进行预测。

对于基于表的解析器(例如LALR或GLR),当发生语法错误时,解析器最近处于某种尚未发生错误的状态。可以记录解析堆栈以在每次转换之前记住这一点(或者在错误之前记录减少量)。鉴于遇到错误,可以检查已保存堆栈的解析状态,以确定下一个可能是哪些令牌(这也是如何根据语法令牌完成代码完成)。更复杂的技术可以发明最小可能的令牌序列,允许通过错误令牌进行转换,或者可以替换错误令牌并允许下一次转换的最小可能树。

使用递归下降解析器并不是那么容易,因为没有很多信息可以用于预测。对于错误恢复,一个俗气的技巧是定义错误恢复点(例如,可能接受“stmt”)并继续扫描直到“;”找到并接受和“错误stmt”。如果您想要完成代码,这无济于事。