分析技术在CS文献中有很好的描述。但是我所知道的算法要求源在语法上是正确的。如果遇到语法错误,解析将立即中止。
但是IDE(如Visual )通常能够在输入时提供有意义的代码完成和其他提示,这意味着语法通常不处于有效状态。例如,在函数调用中键入一个括号,IDE为函数提供参数提示,即使语法在输入结束括号之前是无效的。
在我看来,这必须依赖某种猜测或容错解析器。有人知道这方面使用了什么技术或算法吗?
发布于 2011-01-24 13:40:47
标准的技巧是使用解析机制进行某种错误修复,以帮助进行预测。
对于基于表的解析器(如LALR或GLR),当语法错误发生时,解析器最近处于错误尚未发生的状态。您可以在每次移位之前记录解析堆栈以记住这一点(或者在错误之前记录缩减)。如果遇到错误,则可以检查保存的堆栈的解析状态,以确定哪些标记可能是下一个标记(这也是如何根据语法标记完成代码)。更复杂的技术可以发明最小的允许错误令牌移位的令牌序列,或者最小的可能树,它可以替换错误令牌并允许下一个令牌的移位。
对于递归下降解析器来说,这并不容易,因为周围没有太多的信息可用来进行预测。对于错误恢复,一个繁琐的技巧是定义错误恢复点(例如,"stmt“可能被接受)并继续扫描直到找到";”并接受和“错误stmt”。如果您想要完成代码,这是没有帮助的。
发布于 2011-01-24 13:38:06
Packrat很有前途-它提供了成功和失败的关键点解析尝试的信息,这些信息可以被恢复并用于智能错误报告、完成、提示等。例如,如果游标在缓存中将所有解析尝试标记为失败,则可以为完成选项提供尝试标记的列表。
https://stackoverflow.com/questions/4782315
复制相似问题