有时,gcc
会产生以下错误消息:
error: 'class X' has no member named 'Y'; did you mean 'Z'?
当gcc
包含一些简单的拼写错误时,我已经看到Z
正确猜测Y
。错误的大写/小写,但也有名称中有一些丢失/额外字符。
我很想知道
gcc
如何从Z
正确猜测Y
?如果他们执行表面上不同或有趣的事情,我也会欢迎有关其他编译器的答案。
在快速搜索之后,似乎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是如何具体做到的,但有些算法可以计算出这两个字符串有多少不同?完全不相关或微小的差异?
例如:Jaro-Winkler距离,Levenshtein距离,以及其他人。
因此,当看到未解析的名称时,编译器可以扫描已知/合适的名称,选择一个/几个最相似的名称并建议作为替代。
当GCC到达可能不正确的符号时,GCC可能已经准备好了范围内的符号列表。它所要做的就是通过一个老式的拼写检查算法运行不正确的符号,并将范围内的符号作为字典。