Правила языка: идентификаторы
Идентификатор обязательно начинается либо буквой (язык чувствителен к регистру: заглавные и строчные буквы отличаются),
либо символом нижнего подчёркивания, либо обратным апострофом.
Со второго символа набор возможных символов идентификатора расширяется десятичными цифрами.
Так же начиная со второго символа и далее может быть употреблён пустой оператор.
Символы обратного апострофа обязаны быть парными. Между нечётным и чётным обратным апострофом могут находиться любые символы.
Таким образом, если мы хотим включить в идентификатор произвольные символы, то для этого достаточно заключить их в обратные апострофы.
Примеры:
XYZ // идентификатор, состоящий только из букв, в нём одно слово
a24 // второй и далее символы идентификатора могут быть цифрами
_ 3 _ 7 // идентификатор начинается символом нижнего подчёркивания,
// в нём в любом месте могут находиться пустые операторы
нечто`` // идентификатор с двумя обратными апострофами
любые `$*?:%` символы // и такое может быть идентификатором, если «незаконные»
// символы помещены внутрь обратных апострофов
абв где ...
(*комментарий*) ёж // идентификатор на двух строках с комментарием внутри
абв где ёж // это одинаковые идентификаторы: что этот, что строкой выше
Идентификаторы перед помещением в таблицу идентификаторов компилятора проходят «нормализацию»,
которая состоит в том, что каждый пустой оператор, разделяющий слова идентификатора, заменяется на единственный пробел.
Идентификаторы из примера выше будут иметь такой вид в таблице идентификаторов:
XYZ
a24
_ 3 _ 7
нечто``
любые `$*?:%` символы
абв где ёж // идентификаторы в таблице не дублируются
Сочетание идентификаторов и ключевых слов
Если идентификатор состоит из нескольких слов, то это может создать неопределённость при принятии решения:
чем является очередное встретившееся слово — частью многословного идентификатора или отдельным ключевым словом?
Коллизия разрешается следующим способом.
-
Если при просмотре слева направо встретившееся слово является ключевым (ищется в списке ключевых слов),
то оно помещается в список лексем как ключевое слово.
-
Если следующее встретившееся слово опять является ключевым, то опять помещаем его в список лексем и т. д.
-
В противном случае у нас имеется первое слово идентификатора.
-
Выбираем следующее слово идентификатора и так до тех пор, пока не встретим нечто, которое точно не может быть словом идентификатора.
При добавлении очередного слова к идентификатору происходит «нормализация», то есть все виды разделителей между словами заменяются на единственный пробел.
-
Просматриваем справа налево слова идентификатора. Если последнее слово является ключевым словом, то идентификатор укорачиваем на одно слово,
а ключевое слово затем будет дописано в список лексем.
-
Повторяем просмотр слов идентификатора справа налево. Если последнее слово снова является ключевым,
то снова укорачиваем идентификатор.
И так до тех пор, пока последнее слово идентификатора не будет найдено в списке ключевых слов.
-
Выявленный идентификатор помещаем в таблицу идентификаторов компилятора, если он там ранее отсутствовал, и записываем его в список лексем.
-
Перемещаем из стека (если он не пуст) хвостовые ключевые слова в список лексем.
Коротко эти правила можно выразить следующим образом.
Cлова в начале и в конце многословного идентификатора изымаются из его состава, если они являются ключевыми словами.
Например:
значение = (если условие выполнено то -1 иначе 0)
Этот пример показывает, что из последовательность слов «если условие выполнено то» изъяты ключевые слова «если» и «то»
(на самом деле ключевого слова «то» в языке нет, оно в примере для наглядности) в начале последовательности и в конце.
Поэтому идентификатор укорачивается до «условие выполнено».
Ключевые слова, которые встретились в средине многословного идентификатора, опознаны не будут.
По этой причине в языке отсутствуют ключевые слова «и», «или».
Соответствующие им операции записываются специальными символами.
Формальное описание.
Первое слово идентификатора =
( буква | _ | ` { любые символы } ` )
{ буква | _ | ` { любые символы } ` | цифра }
Следующее слово идентификатора =
{ буква | _ | ` { любые символы } ` | цифра }1
Идентификатор =
Контекстная зависимость от наличия ключевых слов
первое слово идентификатора
[ Пустой оператор ]
{ следующее слово идентификатора }
Контекстная зависимость от наличия ключевых слов
Опубликовано: 2023.05.02, последняя правка: 2023.11.30 20:39
Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|