Подтвердить что ты не робот

Почему "for I: = 0 to aList.Count-1 do" работает с отсутствующим пространством?

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

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

Обратите внимание на недостающее место между "0" и "до"

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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