Почему "for I: = 0 to aList.Count-1 do" работает с пропущенным пробелом? - PullRequest
17 голосов
/ 24 октября 2011

Я писал небольшое консольное приложение в Delphi (XE) и по ошибке написал:

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

Обратите внимание на пропущенный пробел между "0" и "до"

Я не сделалне замечал этого до тех пор, пока я не запустил программу, и я был удивлен, что компилятор принял это.Это, вероятно, не имеет большого значения, но это сделало меня любопытным.

Почему Delphi принимает эту опечатку?

Ответы [ 2 ]

29 голосов
/ 24 октября 2011

По той же причине вам не нужны пробелы вокруг . или -.Поскольку t никогда не может идти после начального 0 в любом распознаваемом токене, лексический анализатор просто возвращает 0 в качестве целочисленного литерального токена, а затем распознает to в качестве отдельного ключевого токена.Если бы вы вместо этого совершили другую ошибку - for I := 0 to10 - у вас возникла бы проблема, поскольку to10 распознается как действительный идентификатор, который недопустим сразу после 0.

14 голосов
/ 24 октября 2011

Если мы исключим строковый комментарий для простоты, то мы обнаружим, что ваш фрагмент кода содержит эти 11 токенов:

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

Чтобы компилятор мог их распознать, они должны бытьпредставлены однозначно.То есть, если любые два соседних токена, помещенные рядом друг с другом, создают двусмысленность относительно их значения, тогда delimiter (space, tab, carriage return, line feed)между ними требуется.

Теперь, если вы возьмете любую такую ​​пару токенов, вы увидите два места, где действительно нужны разделители : одно находится между for и I(forI против for I), а другой - от to до aList (toaList против to aList).Что касается разграничения 0 и to, в частности (и, аналогично, 1 и do), они не создают никакой неопределенности для компилятора .0 - это цифра, t - нет, поэтому t не может сформировать один токен с 0 любым разумным (для компилятора) способом.То есть, как только компилятор встречает t, он сразу же распознает его как начало другого токена, без необходимости разделять их двумя.

Обычно мы ставим пробел между числами ипоследующие «слова» (идентификаторы или ключевые слова), потому что это улучшает читаемость нашего кода, но это все, что нужно сделать.

...