为什么“for I:= 0到List.Count-1 do”可以使用缺少的空间?

时间:2011-10-24 06:31:43

标签: delphi compiler-errors

我在Delphi(XE)中编写了一个小型控制台应用程序,并错误地写道:

for I := 0to aList.Count-1 do 

请注意“0”和“to”之间缺少的空格

直到我运行程序之后才注意到这一点,编译器接受了这一点我感到很惊讶。这可能没什么大不了的,但这让我很好奇。

为什么德尔福接受这个错字?

2 个答案:

答案 0 :(得分:29)

出于同样的原因,您不需要.-周围的空格。由于t永远不会出现在任何可识别标记中的初始0之后,因此词法分析器只会将0作为整数文字标记返回,然后识别to作为独特的关键字令牌。如果您犯了一个不同的错误 - for I := 0 to10 - 您现在遇到了问题,因为to10被识别为有效的标识符,这在0之后立即生效。

答案 1 :(得分:14)

如果我们为简单起见排除了行注释,那么我们会发现您的代码包含这11个令牌:

  • for
  • I
  • :=
  • 0
  • to
  • aList
  • .
  • Count
  • -
  • 1
  • do

为了让编译器能够识别它们,必须明确地表示它们。也就是说,如果任何两个相邻的令牌,当彼此相邻时,会产生关于其含义的歧义,那么分隔符spacetab,{{1他们之间需要{},carriage return}。

现在,如果您使用任何此类令牌,​​您会看到两个分隔符确实需要 的地方:一个位于line feedfor之间({{ 1}} vs I),另一个介于forIfor I之间(to vs aList)。至于分隔toaListto aList,特别是(和,类似地,0to),它们不会对编译器产生任何歧义 1是一个数字,do不是,因此0无法在任何合理的(编译器)方式中与t形成单个标记。也就是说,一旦编译器遇到t,它立即将其识别为另一个令牌的开头,而不必在两者之间存在分隔符。

我们通常会在数字和后续“单词”(标识符或关键字)之间放置一个空格,因为这样可以提高代码的可读性,但这就是它的全部内容。