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

问题描述 投票:3回答:3

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

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

gcc包含一些简单的拼写错误时,我已经看到Z正确猜测Y。错误的大写/小写,但也有名称中有一些丢失/额外字符。

我很想知道

  • gcc如何从Z正确猜测Y
  • 如果它应用了一套固定的规则,那么它能够处理什么样的干扰以及什么超出它的控制范围?

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

gcc compiler-errors compiler-construction
3个回答
3
投票

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

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


1
投票

我不知道GCC是如何具体做到的,但有些算法可以计算出这两个字符串有多少不同?完全不相关或微小的差异?

例如:Jaro-Winkler距离,Levenshtein距离,以及其他人。

因此,当看到未解析的名称时,编译器可以扫描已知/合适的名称,选择一个/几个最相似的名称并建议作为替代。


1
投票

当GCC到达可能不正确的符号时,GCC可能已经准备好了范围内的符号列表。它所要做的就是通过一个老式的拼写检查算法运行不正确的符号,并将范围内的符号作为字典。

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

© www.soinside.com 2019 - 2024. All rights reserved.