1. Лексемы, разделители и ограничители

■ ‘ Текст каждой компиляции — это последовательность отдельных лек­сем. Лексема (лексический элемент) — это ограничитель, идентификатор (который может быть зарезервированным словом), числовой литерал, сим­вольный литерал, строковый литерал или комментарий. Результат выполне­ния программы зависит только от конкретной последовательности лексем, исключая возможные комментарии.

В некоторых случаях необходим явный разделитель между соседними лексемамй (в противном случае они могут быть восприняты как одна).

Разделителем может быть символ пробела, символ управления форматом или конец строчки. Символ пробела не является разделителем в коммента­рии, строковом литерале или в символьном литерале. Символ управления форматом (кроме символа горизонтальной табуляции, когда он употреб­ляется в комментариях) всегда является разделителем.

Конец строчки всегда является разделителем. Язык не определяет, что является концом строчки. Однако, если в данной реализации конец строч­ки обозначается одним или несколькими символами, то эти символы долж­ны быть символами управления форматом, отличными от символа горизон­тальной табуляции. Во всяком случае, последовательность из одного или не­скольких символов управления форматом, отличных от символа горизон­тальной табуляции, должна означать по крайней мере один конец строчки.

Один или несколько разделителей допустимы между любыми двумя со­седними лексемами, перед первой или после последней лексемами каждой компиляции. По крайней мере один разделитель необходим между иден­тификатором или числовым литералом и соседними идентификаторами или числовыми литералами.

Ограничитель — это один из следующих специальных символов из набо­ра основных символов

или один из так называемых составных ограничителей, представляющих со­бой пару специальных символов

=>> * * = /= >= <= « » О

Каждый специальный символ является простым ограничителем, за ис­ключением тех случаев, когда он встречается в составном ограничителе, в комментарии, в строковом, символьном или числовом литералах.

Остальные формы лексем описаны в других разделах этой главы.

Примечание. Каждая лексема должна располагаться в одной строчке, поскольку конец строчки - разделитель. Символы кавычки, номера, подчеркивания и два сосед­них дефиса не являются ограничителями, но могут входить в лексемы в качестве ее частей.

Наименования составных ограничителей даны в табл. 2.2.

Таблица 2.2

Ограничитель

Наименование

= >

Стрелка


Двойная точка

* *

Двойная звездочка (возведение в степень)

: =

Присваивание (читается: „становится равным”)

/ =

Неравенство (читается: „не равно”)

> =

Больше или равно

< =

Меньше или равно

< <

Левая скобка метки

>>

Правая скобка метки

< >

Бокс (коробка)

  1. Идентификаторы

Идентификаторы используются в качестве имен и зарезервированных слов.

идентификатор : : = буква { [подчеркивание] буква_или_цифра} буква_или_цифра : : = буква | цифра

буква :' = прописная_ буква I строчная_буква

Все символы идентификатора существенны, включая символ подчерки­вания между соседними буквами или цифрами. Идентификаторы, различа­ющиеся только размерами букв и использованием графически совпадаю­щих букв русского и латинского алфавитов, считаются совпадающими.

Примеры:

СЧЕТЧИК X дай_символ Эвелина Марион

СНОБОЛ 4 XI СчетчикСтраниц ЗАПАСТИ_СЛЕДУЮЩИЙ_ЭЛЕМЕНТ

Примечание. Пробел внутри идентификатора недопустим, поскольку он является разделителем.

  1. Числовые литералы

Числовые литералы подразделяются на два класса: вещественные и це­лые. Вещественный литерал — это числовой литерал, который включает точ­ку; целый литерал — это числовой литерал без точки. Вещественные литера­лы являются литералами типа универсальный ^вещественный. Целые лите­ралы — литералы типа универсальный целый.

числовой_литерал : : = десятичный-.литерал | литерал_с_основанием

  1. Д е с я т и ч н ы е литералы

Десятичный литерал — это числовой литерал, выраженный в общепри­нятой десятичной системе (основание по умолчанию равно десяти).

десятичный—Литерал : : = целое [. целое] [порядок]

целое : : = цифра -[ [подчеркивание] цифра}

порядок : : — Е [+] целое | Е — целое

Символ подчеркивания между соседними цифрами десятичного литера­ла не влияет на значение числового литерала. Буква Е в порядке может быть строчной или прописной буквой с одним и тем же назначением.

Для получения значения десятичного литерала с порядком следует умно­жить значение десятичного литерала без порядка на степень десяти, задан­ную порядком. Порядок для целого литерала не должен содержать знак ми­нус.

Примеры:

12 О 1Е6 123_45б --целые литералы

12.0 0.0 0.456 3.14159_26 --вещественные литералы

1.34Е-12 1.0Е+6 --вещественные литералы с порядком

Примечание. Ведущие нули допускаются. Пробел в числовом литерале недопус­тим даже между составными частями порядка, поскольку пробел является разделите­лем. Нулевой порядок для целого литерала допустим.

  1. Литералы с основанием

Литерал с основанием — это числовой литерал, в котором явно указано основание. Основание должно принимать значение от двух до шестнадцати.

литерал_с_основанием : : = основание # целое_с_основанием

[. целое_с_основанием] # [порядок]

основание : : = целое

целое_с_основанием : : =

расширенная_цифра{ [подчеркивание] расширенная_цифра} расширенная_цифра : : = цифра | буква

Символ подчеркивания, заключенный между соседними цифрами ли­терала с основанием, не влияет на значение этого числового литерала. Ос­нование и порядок, если они есть, записываются в десятичной системе. В качестве расширенных цифр от десяти до пятнадцати допускаются только латинские буквы от А до 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

  1. Символьные литералы

Символьный литерал - это какой-либо из 161 графических символов (включая пробел), заключенный между двумя символами апострофа. Сим­вольный литерал имеет значение некоторого символьного типа.

символьный_литерал : : = 'графический_символ

Примеры:

' к' "

  1. Строковые литералы ,

Строковый литерал образуется из последовательности (возможно, пус­той) графических символов, заключенной между двумя символами кавыч­ки - строковыми скобками.

строковый литерал : : = ” {графический-символ}-”

Строковый литерал имеет значение, являющееся последовательностью значений символов, соответствующих графическим символам строкового литерала, кроме внешних символов кавычки. Для представления кавычки в последовательности значений символов необходимо в соответствующем месте внутри строкового литерала поместить пару соседних символов ка­вычки. (Это означает, что строковый литерал, включающий два соседних символа кавычки, никогда не рассматривается как два строковых литера­ла.)

Длина строкового литерала — это количество значений символьного ти­па в последовательности, его представляющей. (Каждые два соседних сим­вола кавычки в строке считаются одним символом.)

Примеры:

” Дневное сообщение”

”” --пустой строковый литерал

” ” "А” ”””” - - три строковых литерала длиной 1

’’Символы, такие, как % и J допустимы в строковых литералах”.

Примечание. Строковый литерал должен помещаться на одной строчке, посколь­ку он является лексемой (см. 2.2) . .Более длинные последовательности значений гра­фических символов могут быть получены катенацией строковых литералов. Равным образом, катенация констант, описанных в пакетах ASCII и ГОСТ (см. приложение 3), может быть использована для получения последовательности значений символьного типа, которая включает значения неграфических символов (так называемых управля­ющих символов). Ниже даны примеры использования катенации:

’’ПЕРВАЯ ЧАСТЬ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ,” &

’’КОТОРАЯ ПРОДОЛЖАЕТСЯ НА СЛЕДУЮЩЕЙ СТРОЧКЕ”

’’последовательность, которая включает” & ГОСТ. ДА & ’’управляющий символ”

  1. Комментарии

Комментарий начинается с двух соседних дефисов и продолжается до конца строчки. Комментарий может помещаться в любой строчке програм­мы. Присутствие или отсутствие комментария не влияет ни на правиль­ность, ни на неправильность программы. Более того, комментарии не влия­ют на результат программы; их единственное назначение — сделать про­грамму более понятной.

Примеры:

  • - последнее предложение выражает ту же мысль, что и

  • - в языке Алгол 68

end; - - обработка СТРОЧКИ завершена

  • - длинный комментарий может быть разбит на две или

  • несколько последовательных строчек і

первые два дефиса начинают комментарий

Примечание. Горизонтальная табуляция может быть использована в коммента­риях после двух дефисов; это эквивалентно одному или нескольким пробелам (см. 2.2).

  1. Прагмы

Прагма используется для задания информации компилятору. Прагма начинается зарезервированным словом pragma, за которым следует иден­тификатор — имя прагмы.

прагма : : — pragma идентйфикатор

[ (сопоставление—аргумента {, сопоставление—аргумента?) ] ;

сопоставление—аргумента : : =

[идентификатор—аргумента =>] имя

I [идентификатор-аргумента =>] выражение

Прагмы допустимы только в следующих местах программы:

  • После ограничителя точки с запятой, но не внутри раздела формаль­ных параметров или раздела дискриминантов;

  • В любом месте, где синтаксические правила допускают синтаксичес­кие понятия, в названии которых содержатся слова „описание”, „оператор”, „спецификатор” или „альтернатива”, или одно из синтаксических понятий: вариант и обработчик исключений, но не вместо соответствующих конст­рукций, а также в любом месте, где допустим компилируемый модуль.

На месторасположение отдельных прагм могут накладываться допол­нительные ограничения.

Некоторые прагмы имеют аргументы. Сопоставления аргументов могут быть либо позиционными, либо именованными, как и при сопоставлении параметров в вызовах подпрограмм (см. 6.4). Однако именованные сопо­ставления возможны, если определены идентификаторы аргументов. Име­нем аргумента должно быть либо имя, видимое в месте употребления праг­мы, либо идентификатор, специфический для этой прагмы.

Предопределенные прагмы описаны в обязательном приложении 2; они должны поддерживаться в каждой реализации. Реализация может опреде­лить дополнительные прагмы. Они должны быть описаны в соответствии с обязательным приложением 4. Реализация не должна допускать определе­ние прагм, наличие или отсутствие которых влияет на правильность текста программы. Следовательно, правильность программы не зависит от наличия или отсутствия прагм, определенных реализацией.

Прагма, не определенная в языке, не дает никакого результата, если ее идентификатор не распознан (данной) реализацией. Более того, прагма (как определенная в языке, так и определенная реализацией) не дает ника­кого результата, если ее размещение или ее аргументы не соответствуют до­пустимым для этой прагмы. Участок текста, на который распространяется действие прагмы, зависит от прагмы.

Примеры:

pragma LIST (OFF);

pragma OPTIMIZE (TIME);

pragma INLINE (УСТАНОВИТЬМАСКУ);

pragma SUPPRESS (RANGE CHECK, ON => ИНДЕКС) ;

Примечание. Рекомендуется (но не требуется), чтобы реализация выдавала пре­дупреждающие сообщения о прагмах, которые не распознаны, и поэтому проигнори­рованы.

  1. Зарезервированные слова

Перечисленные в табл. 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 - новый

хог - либо