我在Delphi(XE)中编写了一个小型控制台应用程序,并错误地写道:
for I := 0to aList.Count-1 do
请注意“0”和“to”之间缺少的空格
直到我运行程序之后才注意到这一点,编译器接受了这一点我感到很惊讶。这可能没什么大不了的,但这让我很好奇。
为什么德尔福接受这个错字?
答案 0 :(得分:29)
出于同样的原因,您不需要.
或-
周围的空格。由于t
永远不会出现在任何可识别标记中的初始0
之后,因此词法分析器只会将0
作为整数文字标记返回,然后识别to
作为独特的关键字令牌。如果您犯了一个不同的错误 - for I := 0 to10
- 您现在遇到了问题,因为to10
被识别为有效的标识符,这在0
之后立即生效。
答案 1 :(得分:14)
如果我们为简单起见排除了行注释,那么我们会发现您的代码包含这11个令牌:
for
I
:=
0
to
aList
.
Count
-
1
do
为了让编译器能够识别它们,必须明确地表示它们。也就是说,如果任何两个相邻的令牌,当彼此相邻时,会产生关于其含义的歧义,那么分隔符(space
,tab
,{{1他们之间需要{},carriage return
}。
现在,如果您使用任何此类令牌,您会看到两个分隔符确实需要 的地方:一个位于line feed
和for
之间({{ 1}} vs I
),另一个介于forI
和for I
之间(to
vs aList
)。至于分隔toaList
和to aList
,特别是(和,类似地,0
和to
),它们不会对编译器产生任何歧义 。 1
是一个数字,do
不是,因此0
无法在任何合理的(编译器)方式中与t
形成单个标记。也就是说,一旦编译器遇到t
,它立即将其识别为另一个令牌的开头,而不必在两者之间存在分隔符。
我们通常会在数字和后续“单词”(标识符或关键字)之间放置一个空格,因为这样可以提高代码的可读性,但这就是它的全部内容。