Лексемы, разделители и ограничители
■ ‘ Текст каждой компиляции — это последовательность отдельных лексем. Лексема (лексический элемент) — это ограничитель, идентификатор (который может быть зарезервированным словом), числовой литерал, символьный литерал, строковый литерал или комментарий. Результат выполнения программы зависит только от конкретной последовательности лексем, исключая возможные комментарии.
В некоторых случаях необходим явный разделитель между соседними лексемамй (в противном случае они могут быть восприняты как одна).
Разделителем может быть символ пробела, символ управления форматом или конец строчки. Символ пробела не является разделителем в комментарии, строковом литерале или в символьном литерале. Символ управления форматом (кроме символа горизонтальной табуляции, когда он употребляется в комментариях) всегда является разделителем.
Конец строчки всегда является разделителем. Язык не определяет, что является концом строчки. Однако, если в данной реализации конец строчки обозначается одним или несколькими символами, то эти символы должны быть символами управления форматом, отличными от символа горизонтальной табуляции. Во всяком случае, последовательность из одного или нескольких символов управления форматом, отличных от символа горизонтальной табуляции, должна означать по крайней мере один конец строчки.
Один или несколько разделителей допустимы между любыми двумя соседними лексемами, перед первой или после последней лексемами каждой компиляции. По крайней мере один разделитель необходим между идентификатором или числовым литералом и соседними идентификаторами или числовыми литералами.
Ограничитель — это один из следующих специальных символов из набора основных символов
или один из так называемых составных ограничителей, представляющих собой пару специальных символов
=>> * * = /= >= <= « » О
Каждый специальный символ является простым ограничителем, за исключением тех случаев, когда он встречается в составном ограничителе, в комментарии, в строковом, символьном или числовом литералах.
Остальные формы лексем описаны в других разделах этой главы.
Примечание. Каждая лексема должна располагаться в одной строчке, поскольку конец строчки - разделитель. Символы кавычки, номера, подчеркивания и два соседних дефиса не являются ограничителями, но могут входить в лексемы в качестве ее частей.
Наименования составных ограничителей даны в табл. 2.2.
Таблица 2.2
Ограничитель |
Наименование |
= > |
Стрелка |
|
Двойная точка |
* * |
Двойная звездочка (возведение в степень) |
: = |
Присваивание (читается: „становится равным”) |
/ = |
Неравенство (читается: „не равно”) |
> = |
Больше или равно |
< = |
Меньше или равно |
< < |
Левая скобка метки |
>> |
Правая скобка метки |
< > |
Бокс (коробка) |
Идентификаторы
Идентификаторы используются в качестве имен и зарезервированных слов.
идентификатор : : = буква { [подчеркивание] буква_или_цифра} буква_или_цифра : : = буква | цифра
буква :' = прописная_ буква I строчная_буква
Все символы идентификатора существенны, включая символ подчеркивания между соседними буквами или цифрами. Идентификаторы, различающиеся только размерами букв и использованием графически совпадающих букв русского и латинского алфавитов, считаются совпадающими.
Примеры:
СЧЕТЧИК X дай_символ Эвелина Марион
СНОБОЛ 4 XI СчетчикСтраниц ЗАПАСТИ_СЛЕДУЮЩИЙ_ЭЛЕМЕНТ
Примечание. Пробел внутри идентификатора недопустим, поскольку он является разделителем.
Числовые литералы
Числовые литералы подразделяются на два класса: вещественные и целые. Вещественный литерал — это числовой литерал, который включает точку; целый литерал — это числовой литерал без точки. Вещественные литералы являются литералами типа универсальный ^вещественный. Целые литералы — литералы типа универсальный целый.
числовой_литерал : : = десятичный-.литерал | литерал_с_основанием
Д е с я т и ч н ы е литералы
Десятичный литерал — это числовой литерал, выраженный в общепринятой десятичной системе (основание по умолчанию равно десяти).
десятичный—Литерал : : = целое [. целое] [порядок]
целое : : = цифра -[ [подчеркивание] цифра}
порядок : : — Е [+] целое | Е — целое
Символ подчеркивания между соседними цифрами десятичного литерала не влияет на значение числового литерала. Буква Е в порядке может быть строчной или прописной буквой с одним и тем же назначением.
Для получения значения десятичного литерала с порядком следует умножить значение десятичного литерала без порядка на степень десяти, заданную порядком. Порядок для целого литерала не должен содержать знак минус.
Примеры:
12 О 1Е6 123_45б --целые литералы
12.0 0.0 0.456 3.14159_26 --вещественные литералы
1.34Е-12 1.0Е+6 --вещественные литералы с порядком
Примечание. Ведущие нули допускаются. Пробел в числовом литерале недопустим даже между составными частями порядка, поскольку пробел является разделителем. Нулевой порядок для целого литерала допустим.
Литералы с основанием
Литерал с основанием — это числовой литерал, в котором явно указано основание. Основание должно принимать значение от двух до шестнадцати.
литерал_с_основанием : : = основание # целое_с_основанием
[. целое_с_основанием] # [порядок]
основание : : = целое
целое_с_основанием : : =
расширенная_цифра{ [подчеркивание] расширенная_цифра} расширенная_цифра : : = цифра | буква
Символ подчеркивания, заключенный между соседними цифрами литерала с основанием, не влияет на значение этого числового литерала. Основание и порядок, если они есть, записываются в десятичной системе. В качестве расширенных цифр от десяти до пятнадцати допускаются только латинские буквы от А до F. Буква в литерале с основанием (расширенная цифра или буква Е в порядке) может быть строчной или прописной с одним и тем же смыслом.
Предполагается обычный смысл обозначения литерала с основанием; в частности, значение каждой расширенной цифры литерала с основанием должно быть меньше основания. Для получения значения литерала с основанием и порядком следует умножить значение литерала с основанием без порядка на основание, возведенное в указанную порядком степень.
Примеры:
2#1111_1Ш# 16#FF# 016#0FF#
- целые литералы со значением 255
16#Е#Е1 2#1110_0000#
- целые литералы со значением 224
16#F.FF#E+2 2#1.1111_1111_111#Е11
- вещественные литералы со значением 4095.0
Символьные литералы
Символьный литерал - это какой-либо из 161 графических символов (включая пробел), заключенный между двумя символами апострофа. Символьный литерал имеет значение некоторого символьного типа.
символьный_литерал : : = 'графический_символ
Примеры:
' к' "
Строковые литералы ,
Строковый литерал образуется из последовательности (возможно, пустой) графических символов, заключенной между двумя символами кавычки - строковыми скобками.
строковый литерал : : = ” {графический-символ}-”
Строковый литерал имеет значение, являющееся последовательностью значений символов, соответствующих графическим символам строкового литерала, кроме внешних символов кавычки. Для представления кавычки в последовательности значений символов необходимо в соответствующем месте внутри строкового литерала поместить пару соседних символов кавычки. (Это означает, что строковый литерал, включающий два соседних символа кавычки, никогда не рассматривается как два строковых литерала.)
Длина строкового литерала — это количество значений символьного типа в последовательности, его представляющей. (Каждые два соседних символа кавычки в строке считаются одним символом.)
Примеры:
” Дневное сообщение”
”” --пустой строковый литерал
” ” "А” ”””” - - три строковых литерала длиной 1
’’Символы, такие, как % и J допустимы в строковых литералах”.
Примечание. Строковый литерал должен помещаться на одной строчке, поскольку он является лексемой (см. 2.2) . .Более длинные последовательности значений графических символов могут быть получены катенацией строковых литералов. Равным образом, катенация констант, описанных в пакетах ASCII и ГОСТ (см. приложение 3), может быть использована для получения последовательности значений символьного типа, которая включает значения неграфических символов (так называемых управляющих символов). Ниже даны примеры использования катенации:
’’ПЕРВАЯ ЧАСТЬ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ,” &
’’КОТОРАЯ ПРОДОЛЖАЕТСЯ НА СЛЕДУЮЩЕЙ СТРОЧКЕ”
’’последовательность, которая включает” & ГОСТ. ДА & ’’управляющий символ”
Комментарии
Комментарий начинается с двух соседних дефисов и продолжается до конца строчки. Комментарий может помещаться в любой строчке программы. Присутствие или отсутствие комментария не влияет ни на правильность, ни на неправильность программы. Более того, комментарии не влияют на результат программы; их единственное назначение — сделать программу более понятной.
Примеры:
- последнее предложение выражает ту же мысль, что и
- в языке Алгол 68
end; - - обработка СТРОЧКИ завершена
- длинный комментарий может быть разбит на две или
несколько последовательных строчек і
первые два дефиса начинают комментарий
Примечание. Горизонтальная табуляция может быть использована в комментариях после двух дефисов; это эквивалентно одному или нескольким пробелам (см. 2.2).
Прагмы
Прагма используется для задания информации компилятору. Прагма начинается зарезервированным словом pragma, за которым следует идентификатор — имя прагмы.
прагма : : — pragma идентйфикатор
[ (сопоставление—аргумента {, сопоставление—аргумента?) ] ;
сопоставление—аргумента : : =
[идентификатор—аргумента =>] имя
I [идентификатор-аргумента =>] выражение
Прагмы допустимы только в следующих местах программы:
После ограничителя точки с запятой, но не внутри раздела формальных параметров или раздела дискриминантов;
В любом месте, где синтаксические правила допускают синтаксические понятия, в названии которых содержатся слова „описание”, „оператор”, „спецификатор” или „альтернатива”, или одно из синтаксических понятий: вариант и обработчик исключений, но не вместо соответствующих конструкций, а также в любом месте, где допустим компилируемый модуль.
На месторасположение отдельных прагм могут накладываться дополнительные ограничения.
Некоторые прагмы имеют аргументы. Сопоставления аргументов могут быть либо позиционными, либо именованными, как и при сопоставлении параметров в вызовах подпрограмм (см. 6.4). Однако именованные сопоставления возможны, если определены идентификаторы аргументов. Именем аргумента должно быть либо имя, видимое в месте употребления прагмы, либо идентификатор, специфический для этой прагмы.
Предопределенные прагмы описаны в обязательном приложении 2; они должны поддерживаться в каждой реализации. Реализация может определить дополнительные прагмы. Они должны быть описаны в соответствии с обязательным приложением 4. Реализация не должна допускать определение прагм, наличие или отсутствие которых влияет на правильность текста программы. Следовательно, правильность программы не зависит от наличия или отсутствия прагм, определенных реализацией.
Прагма, не определенная в языке, не дает никакого результата, если ее идентификатор не распознан (данной) реализацией. Более того, прагма (как определенная в языке, так и определенная реализацией) не дает никакого результата, если ее размещение или ее аргументы не соответствуют допустимым для этой прагмы. Участок текста, на который распространяется действие прагмы, зависит от прагмы.
Примеры:
pragma LIST (OFF);
pragma OPTIMIZE (TIME);
pragma INLINE (УСТАНОВИТЬМАСКУ);
pragma SUPPRESS (RANGE CHECK, ON => ИНДЕКС) ;
Примечание. Рекомендуется (но не требуется), чтобы реализация выдавала предупреждающие сообщения о прагмах, которые не распознаны, и поэтому проигнорированы.
Зарезервированные слова
Перечисленные в табл. 2.3 идентификаторы называются зарезервированными словами. Они зарезервированы в языке для специальных целей и в стандарте изображаются строчными буквами полужирным шрифтом (после тире приведено наименование на русском языке).
Таблица 2.3
Зарезервированные слова |
Зарезервированные слова |
abort - прекращение abs - абсолютная величина accept - принятие |
access - ссылка_на all - все and -и |
Продолжение табл. 2.3
Зарезервированные слова |
Зарезервированные слова |
array -массив |
not - не |
at -положение |
null - пусто |
begin - начало |
of - из |
body - тело |
ог -или |
case - выбор |
others - другие |
constant - константа |
out - выходной |
declare - описание |
package - пакет |
delay - задержка |
pragma — прагма |
delta - дельта |
private - личный |
digits - цифр |
procedure - процедура |
do - выполнение |
raise - возбуждение |
else - иначе |
range - диапазон |
elsif - ин если |
record - запись |
end - конец |
rem - остаток |
entry - вход |
renames - синоним |
exception - исключение |
return — возврат |
exit - выход |
reverse - в_обратном_порядке |
for - для |
select - отбор |
function - функция |
separate - отдельно |
generic - настройка |
subtype - подтип |
goto — переходна |
task - задача |
if - если |
terminate - завершение |
in - в |
then - то |
in - входной |
type — тип |
is - есть |
use - использовать |
limited — лимитируемый |
when — когда |
loop - цикл |
while - пока |
mod - по-Модулю |
With - совместно _с |
new - новый |
хог - либо |