当一个人输入错误时,编译器如何猜测正确的名字?

How does the compiler guess the correct name when one mistypes it?

有时,gcc 会产生以下错误消息:

error: 'class X' has no member named 'Y'; did you mean 'Z'?

我看到 gccY 包含一些简单的拼写错误时正确猜测 Z,例如 错误 lower/upper 大小写 ,而且名称中有一些 missing/extra 个字符。

我很想知道

我也欢迎与其他编译器相关的答案,如果他们执行表面上不同或有趣的事情。

我不知道GCC具体是怎么做的,但是有算法可以计算出这两个字符串有多少不同?完全无关还是细微差别?

例如:Jaro-Winkler 距离、Levenshtein 距离,也许还有其他。

因此,当看到未解析的名称时,编译器可以扫描 known/suitable 个名称,选择 one/few 个最相似的名称,并建议将其作为替代方案。

GCC 在遇到可能不正确的符号时,可能已经准备好了 in-scope 个符号列表。然后它所要做的就是通过一个很好的老式拼写检查算法 运行 不正确的符号,将 in-scope 符号作为字典。

https://gcc.gnu.org/ml/gcc-patches/2015-09/msg01090.html

经过快速搜索,GCC 似乎有一个内部代码来处理拼写检查,其中包括 Levenstein 距离的实现。

https://gcc.gnu.org/ml/gcc-patches/2015-09/msg01090.htmlhttps://gcc.gnu.org/ml/gcc-patches/2015-11/msg00046.html