当一个人输入错误时,编译器如何猜测正确的名字?
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'?
我看到 gcc
在 Y
包含一些简单的拼写错误时正确猜测 Z
,例如 错误 lower/upper 大小写 ,而且名称中有一些 missing/extra 个字符。
我很想知道
gcc
如何从Y
开始正确猜出Z
?
- 如果它应用一套固定的规则,它能够处理什么样的干扰,什么是它无法控制的?
我也欢迎与其他编译器相关的答案,如果他们执行表面上不同或有趣的事情。
我不知道GCC具体是怎么做的,但是有算法可以计算出这两个字符串有多少不同?完全无关还是细微差别?
例如:Jaro-Winkler 距离、Levenshtein 距离,也许还有其他。
因此,当看到未解析的名称时,编译器可以扫描 known/suitable 个名称,选择 one/few 个最相似的名称,并建议将其作为替代方案。
GCC 在遇到可能不正确的符号时,可能已经准备好了 in-scope 个符号列表。然后它所要做的就是通过一个很好的老式拼写检查算法 运行 不正确的符号,将 in-scope 符号作为字典。
经过快速搜索,GCC 似乎有一个内部代码来处理拼写检查,其中包括 Levenstein 距离的实现。
见
https://gcc.gnu.org/ml/gcc-patches/2015-09/msg01090.html
和
https://gcc.gnu.org/ml/gcc-patches/2015-11/msg00046.html
有时,gcc
会产生以下错误消息:
error: 'class X' has no member named 'Y'; did you mean 'Z'?
我看到 gcc
在 Y
包含一些简单的拼写错误时正确猜测 Z
,例如 错误 lower/upper 大小写 ,而且名称中有一些 missing/extra 个字符。
我很想知道
gcc
如何从Y
开始正确猜出Z
?- 如果它应用一套固定的规则,它能够处理什么样的干扰,什么是它无法控制的?
我也欢迎与其他编译器相关的答案,如果他们执行表面上不同或有趣的事情。
我不知道GCC具体是怎么做的,但是有算法可以计算出这两个字符串有多少不同?完全无关还是细微差别?
例如:Jaro-Winkler 距离、Levenshtein 距离,也许还有其他。
因此,当看到未解析的名称时,编译器可以扫描 known/suitable 个名称,选择 one/few 个最相似的名称,并建议将其作为替代方案。
GCC 在遇到可能不正确的符号时,可能已经准备好了 in-scope 个符号列表。然后它所要做的就是通过一个很好的老式拼写检查算法 运行 不正确的符号,将 in-scope 符号作为字典。
经过快速搜索,GCC 似乎有一个内部代码来处理拼写检查,其中包括 Levenstein 距离的实现。
见 https://gcc.gnu.org/ml/gcc-patches/2015-09/msg01090.html 和 https://gcc.gnu.org/ml/gcc-patches/2015-11/msg00046.html