Почему "for I: = 0 to aList.Count-1 do" работает с отсутствующим пространством?
Я писал небольшое консольное приложение в Delphi (XE), и по ошибке писал:
for I := 0to aList.Count-1 do
Обратите внимание на недостающее место между "0" и "до"
Я не заметил этого до тех пор, пока не запустил программу, и я был удивлен, что компилятор принял это. Это, вероятно, не имеет большого значения, но мне было любопытно.
Почему Delphi принимает эту опечатку?
Ответы
Ответ 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
, он сразу же распознает его как начало другого токена, не имея между собой разделителя.
Обычно мы помещаем пробел между числами и последующими словами (идентификаторами или ключевыми словами), потому что это улучшает читаемость нашего кода, но все, что ему нужно.