Справочное руководство по языку Ада-83



Справочное руководство по языку Ада-83

         

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


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

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

Ссыпки: литерал 4.2, универсальный-вещественный тип 6, универсальный-целый тип 4.

1. ДЕСЯТИЧНЫЕ ЛИТЕРАЛЫ

Десятичный литерал — это числовой литерал, выраженный в общепринятой десятичной


системе (основание по умолчанию равно десяти).

десятичный-литерал ::= целое [.целое] [порядок]целое ::= цифра {[подчеркивание] цифра}порядок ::= Е [+] целое | E - целое

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

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



Допустимые замены символов


Для основных символов — вертикальной черты, номера и кавычки — допустимы следующие замены:

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

• Символ номера (#) в литерале с основанием можно заменить двоеточием (:) при условии, что в этом литерале заменяются оба символа номера.

• Символ кавычки ("), использованный как строковая скобка на обоих концах строкового литерала, можно заменить символом процента (%), если последовательность символов строкового литерала не содержит символа кавычки и если в этом литерале заменяются обе строковые скобки. Для представления символа процента внутри последовательности символов строкового литерала должна использоваться пара соседних символов процента, которая рассматривается как один символ процента.

Эти замены не изменяют смысла программы.

. Рекомендуется, чтобы замена символов вертикальной черты, номера и кавычки была ограничена случаями, когда соответствующих графических символов нет на терминалах. Заметим, что вертикальная черта изображается на некоторых устройствах прерывистой линией, замена в этом случае не рекомендуется.

Правила для идентификаторов и числовых литералов таковы, что строчные и прописные буквы эквивалентны; эти лексемы могут быть записаны только символами основного набора. Если строковый литерал предопределенного типа STRING содержит символы не из основного набора, та же самая последовательность значений символов может быть получена катенацией строковых литералов, содержащих символы основного набора, и символьных констант, описанных в предопределенном пакете ASCII. Таким образом, строковый литерал "AB$CD" можно заменить на "АВ" & ASCII.DOLLAR & "CD", а строковый литерал "ABcd" со строчными буквами можно заменить на "АВ" & ASCII.LC-C & ASCII.LC-D.

Ссылки: графический знак 2.1, графический символ 2.1, значение символа 2, идентификатор 2.3, лексема 2.2, литерал с основанием 2, ограничитель 2.2, операция катенации 3, основной символ 2.1, предопределенный пакет ASCII С, прописная буква 2.1, строковая скобка 2.6, строковый литерал 2.6, строчная буква 2.1, числовой литерал



Лексика


Содержание

НАБОР СИМВОЛОВ ЛЕКСЕМЫ, РАЗДЕЛИТЕЛИ И ОГРАНИЧИТЕЛИ ИДЕНТИФИКАТОРЫ ЧИСЛОВЫЕ ЛИТЕРАЛЫ СИМВОЛЬНЫЕ ЛИТЕРАЛЫ СТРОКОВЫЕ ЛИТЕРАЛЫ КОММЕНТАРИИ ПРАГМЫ ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА 2.10. ДОПУСТИМЫЕ ЗАМЕНЫ СИМВОЛОВ

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

Ссылки: компиляция 10.1, лексема 2.2, прагма 2.8, символ



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


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

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

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



в любой строчке программы. Присутствие


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

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


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

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

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

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

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

&'()*+,-./:;<=>!

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

=> .. ** := /= >= <= << >> <>

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

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

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

Наименования составных ограничителей даны ниже:

Ограничитель Наименование
= > стрелка
.. двойная точка
** двойная звездочка, возведение в степень
:= присваивание (читается: «Становится равным»)
/= неравенство (читается: «Не равно»)
> = больше или равно
< = меньше или равно
<< левая скобка метки
>> правая скобка метки
< > бокс (или коробка)

Ссылки: зарезервированное слово 2.9, идентификатор 2.3, комментарий 2.7, компиляция 10.1, символ пробела 2.1, символ управления 2.1, символьный литерал 2.5, специальный символ 2.1, строковый литерал 2.6, числовой литерал



Набор символов


Символами в тексте программы должны быть только графические символы и символы управления форматом. Каждый графический символ соответствует единственному коду из набора символов ISO, кодируемых семью разрядами (стандарт ISO 646), и представляется (визуально) графическим знаком. Некоторые графические символы представляются различными графическими знаками в национальных представлениях набора символов ISO. При описании определения языка в данном справочном руководстве используются графические знаки ASCII, представляющие собой национальное представление ANSI набора символов ISO.

графический-символ ::= основной-графический-символ | строчная-буква | дополнительный-специальный-символосновной-графический-символ ::= прописная-буква | цифра | специальный-символ | символ-пробелаосновной-символ ::= основной-графический-символ | символ-управления-форматом

Набор основных символов достаточен для написания любой программы. Основные графические символы подразделяются на следующие категории:

а) прописные буквы [3]

ABCDEFGHIJKLMNOPQRSTUVWXYZ

б) цифры

0123456789

в) специальные символы

" # &'()*+, -./:;<=>- |

г) символ пробела.

Символы управления форматом — это символы ISO (и ASCII), называющиеся горизонтальной табуляцией, вертикальной табуляцией, возвратом каретки, переводом строчки и переводом формата.

Остальные категории графических символов определяются следующим образом:

д) строчные буквы [4]

abcdefghijklmnopqrstuvwxyz

е) дополнительные специальные символы

! $ % ? @ [ \ ] " ' | ) -

В разд. 2.10 определены допустимые замены для специальных символов вертикальной черты (|), номера (#) и кавычки (").

. Графическому символу номера в представлении ASCII соответствует символ фунта стерлингов в представлении национальных стандартов Франции, Германии и Великобритании. Шрифтовые выделения графических символов (например, курсив или полужирный шрифт) не являются частью стандарта ISO.

Под использованными в этом разделе акронимами понимают следующее: ANSI — Американский национальный институт стандартов, ASCII — Американский стандартный код для обмена информацией, ISO — Международная организация по стандартизации.

Для ссылок на специальные и дополнительные специальные символы используются следующие их наименования:

Знак Наименование Знак Наименование
" кавычки > больше
# номер (решетка) подчеркивание
& коммерческое И (амперсанд) 1 вертикальная черта
' апостроф ! восклицательный знак
( круглая скобка (левая) $ доллар
) круглая скобка (правая) % процент
* звездочка, умножение ? вопросительный знак
+ плюс @ коммерческое эт
, запятая [ квадратная скобка (левая)
- дефис, минус \ обратная дробная черта
точка, период ] квадратная скобка (правая)
/ дробная черта, деление * сиркюмфлекс
двоеточие слабое ударение
; точка с запятой ! фигурная скобка (левая)
< меньше 1 фигурная скобка (правая)
= равно - тильда


[3] В тексте перевода для идентификаторов наряду с латинским используется алфавит прописных русских букв. - Прим. ред.

[4] В тексте перевода наряду с латинским используется алфавит строчных русских букв. - Прим. ред.



Прагмы


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

прагма ::=pragma идентификатор [(сопоставление-аргумента {, сопоставление-аргумента })];сопоставление-аргумента ::= [идентификатор-аргумента => ] имя [идентификатор-аргумента => ] выражение

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

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

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

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

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

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

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



чтобы реализация выдавала предупреждающие сообщения



.

pragma LIST(OFF); pragma OPTIMIZE(TIME); pragma INLINE(SETMASK); pragma SUPPRESS(RANGE_CHECK, ON => INDEX); . Рекомендуется (но не требуется), чтобы реализация выдавала предупреждающие сообщения о прагмах, которые не распознаны и поэтому проигнорированы.
Ссылки: вариант 3, видимость 8.3, выражение 4.4, компилируемый модуль 10.1, зарезервированное слово 2.9, идентификатор 2.3, имя 4.1, обработчик исключения 11.2, ограничитель 2.2, оператор 5, правильный 1.6, прагма, зависящая от реализации F, прагма, зависящая от языка В, раздел дискриминантов 1, статическое выражение
Понятие со словом «описание»: описание входа 9.5, описание компоненты 3.7, описание параметра настройки 12.1, основное описание
Понятие со словом «спецификатор>: спецификатор выравнивания 13.4, спецификатор использования 8.4, спецификатор компоненты 13.4, спецификатор контекста 1, спецификатор представления 13.1, спецификатор совместности 1.
Понятие со словом «альтернатива»: альтернатива завершения 1, альтернатива задержки 1, альтернатива оператора выбора 5.4, альтернатива отбора 1, альтернатива отбора с ожиданием 1, альтернатива принятия 1.

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



.

12 0 1Е6 123_456 -- целые литералы
12.0 0.0 0.156 3.14159_26 -- вещественные литералы
1.34Е-12 1.0Е+6 -- вещественные литералы с порядком

: Ведущие нули допускаются. Пробел в числовом литерале недопустим даже между составными частями порядка, поскольку пробел является разделителем. Нулевой порядок для целого литерала допустим.
Ссылки: прописная буква 2.1, разделитель 2.2, символ пробела 2.1, строчная буква 2.1, цифра 2.1, числовой литерал
2. ЛИТЕРАЛЫ С ОСНОВАНИЕМ
Литерал с основанием — это числовой литерал, в котором явно указано основание. Основание должно принимать значение от 2 до 16.
литерал-с-основанием ::= основание # целое-с-основанием [.целое-с-основанием] # [порядок]основание :: = целоецелое-с-основанием ::= расширенная-цифра {[подчеркивание] расширенная-цифра}расширенная-цифра ::= цифра | буква Символ подчеркивания, заключенный между соседними цифрами литерала с основанием, не влияет на значение этого числового литерала. Основание и порядок записываются в десятичной системе. В качестве расширенных цифр от 10 до 15 допускаются только латинские буквы от А до F. Буква в литерале с основанием (расширенная цифра или буква Е в порядке) может быть строчной или прописной с одним и тем же смыслом.
Предполагается обычный смысл обозначения литерала с основанием; в частности, значение каждой расширенной цифры литерала с основанием должно быть меньше основания. Для получения значения литерала с основанием и порядком следует умножить значение литерала с основанием без порядка на основание, возведенное в указанную порядком степень.

целые литералы со значением



. 2

2#1111_1111# 16#FF# 016#0FF# -- целые литералы со значением 255
16#Е#Е1 2#1110_0000# -- целые литералы со значением 224
16#F.FF#E+2 2#1.1111_1111_111#Е11 -- действительные литералы со значением 4095.0

Ссылки: буква 2.3, порядок 1, прописная буква 2.1, строчная буква 2.1, цифра 2.1, числовой литерал

последнее предложение выражает ту же



-- последнее предложение выражает ту же мысль, что и -- в языке Алгол-68end; -- обработка LINE завершена-- длинный комментарий может быть разбит на -- две или несколько последовательных строчек------- первые два дефиса начинают комментарий . Горизонтальная табуляция может быть использована в комментариях после двух дефисов, это эквивалентно одному или нескольким пробелам (см. 2.2).
Ссылки: конец строчки 2.2, неправильный 1.6, правильный 1.6, символ пробела

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


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

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

Строковые литералы


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

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

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

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

Примеры :

"Дневное сообщение:"

"" -- пустой строковый литерал " " "А" """" -- три строковых литерала длиной 1 "Символы, такие как $, % и ), допустимы в строковых литералах"

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

"ПЕРВАЯ ЧАСТЬ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ," & "КОТОРАЯ ПРОДОЛЖАЕТСЯ НА СЛЕДУЮЩЕЙ СТРОЧКЕ"

"последовательность, которая включает" & ASCII.ACK & "управляющий символ"

Ссылки: графический символ 2.1, значение символа 2, конец строчки 2.2, константа 1, лексема 2.2, операция катенации 3, описание 3.1, предопределенный пакет ASCII С.



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


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

abort — прекращение loop — цикл
abs — abs mod — по-мод
accept — принятие new — новый
access — ссылка-на not — не
all — все null — пусто
and — и of — из
array — массив or — или
at — положение others — Другие
begin — начало out — вых
body — тело package — пакет
case — выбор pragma — прагма
constant — константа private — личный
declare — описание procedure — процедура
delay — задержка raise — возбуждение
delta — дельта range — диапазон
digits — цифр record — запись
do — выполнение rem — остаток
else — иначе renames — синоним
elsif — инесли return — возврат
end — конец reverse — в-обратном-порядке
entry — вход select — отбор
exception — исключение separate — отдельно
exit — выход subtype — подтип
for — для task — задача
function — функция terminate — завершение
generic — настройка then — то
goto — переход-на type — тип
if — если use — использование
in — из when — когда
in — вх while — пока
is — есть with — совместно-с
limited — лимитируемый xor — либо

Зарезервированные слова не должны использоваться в качестве описываемого идентификатора.

. Зарезервированные слова, отличающиеся только соответствующими строчными или прописными буквами, рассматриваются как одинаковые (см. 2.3). Идентификаторы некоторых атрибутов, стоящие после апострофа, совпадают с зарезервированными словами (DELTA, DIGITS и RANGE).

Ссылки: атрибут 4, идентификатор 2.3, описание 3.1, прописная буква 2.1, строчная буква