ГОСТ 27831-88
(ИСО 8652-87)
Группа П85
ГОСУДАРСТВЕННЫЙ СТАНДАРТ СОЮЗА ССР
ЯЗЫК ПРОГРАММИРОВАНИЯ АДА
Programming language Ada
ОКСТУ 4002
Дата введения 1989-07-01
ИНФОРМАЦИОННЫЕ ДАННЫЕ
1. ИСПОЛНИТЕЛИ
А.А.Красилов, д-р. техн. наук, проф.; B.M.Курочкин, канд. техн. наук (руководители темы); Ю.Н.Голубев, канд. техн. наук; В.И.Баранов, канд. техн. наук; В.Л.Лейтес, канд. техн. наук; В.А.Хитров; H.E.Богородская; В.П.Чепкасов; Е.П.Фадеева; А.П.Попов; В.В.Лукашев, канд. техн. наук; Н.Л.Жданова; В.Г.Коневских; Л.А.Андрианова; Т.С.Прокофьева; O.E.Косырева; E.E.Полякова; Ю.П.Пузей; E.B.Фадеева; А.Ф.Яблокова; Е.А.Обертынская; И.Ю.Гребенкина; О.Г.Кузьмина; Н.Г.Соболев; Н.М.Блохин; Н.К.Зубанова
2. УТВЕРЖДЕН И ВВЕДЕН В ДЕЙСТВИЕ Постановлением Государственного комитета СССР по стандартам от 22.09.88 N 3217
3. ВВЕДЕН ВПЕРВЫЕ
4. Стандарт соответствует международному стандарту ИСО 8652-87
5. ССЫЛОЧНЫЕ НОРМАТИВНО-ТЕХНИЧЕСКИЕ ДОКУМЕНТЫ
Обозначение НТД, на который дана ссылка | Номер раздела, приложения |
ГОСТ 27465-87 | 2.1, приложение 3 |
Настоящий стандарт устанавливает базовое описание языка программирования АДА, применяемого для разработки программ различного назначения, в том числе работающих в реальном масштабе времени, а также средств компиляции, тестирования и отладки программ.
В процессе принятия решений при проведении испытаний и приемке систем программирования и программ на языке Ада настоящий стандарт является основанием для определения их полного соответствия языку Ада только при наличии и применении систем тестов, согласованных в установленном порядке.
1. ОБЩИЕ ПОЛОЖЕНИЯ
1. ОБЩИЕ ПОЛОЖЕНИЯ
1.1. Область действия стандарта
В настоящем стандарте описаны форма представления и семантика программных модулей, написанных на языке Ада. Цель стандарта - повысить надежность и переносимость программ для разнообразных систем обработки данных.
1.1.1. Содержание стандарта
Стандарт определяет:
а) Форму представления программного модуля, написанного на языке Ада.
б) Результаты трансляции и выполнения такого программного модуля.
в) Способ получения Ада-программ из набора программных модулей.
г) Предопределенные программные модули, которые должна обеспечивать согласованная со стандартом реализация (далее - согласованная реализация).
д) Допустимые в рамках стандарта изменения языка и способы их задания.
е) Те нарушения стандарта, которые обязана обнаруживать согласованная реализация, а также результат попытки транслировать или выполнять программный модуль, содержащий такие нарушения.
ж) Те нарушения стандарта, которые согласованная реализация не обязана обнаруживать.
Стандарт не определяет:
з) Средства преобразования программного модуля, написанного на языке Ада, в объектный код, выполняемый процессором.
и) Средства инициализации трансляции, выполнения программных модулей и управления ими.
к) Размер и скорость выполнения объектного кода, а также относительную скорость выполнения различных языковых конструкций.
л) Форму и содержание любых листингов, предусмотренных реализациями, в частности, форму и содержание сообщений об ошибках или предупреждающих сообщений.
м) Результат выполнения программного модуля, содержащего любое нарушение стандарта, которое согласованная реализация не обязана обнаруживать.
н) Предельный для конкретной согласованной реализации размер программы или программного модуля.
Там, где стандарт предписывает, что программный модуль, написанный на языке Ада, имеет точный результат, этот результат является функциональным значением данного программного модуля, и его должны обеспечивать все согласованные реализации. Там, где стандарт допускает неоднозначность результата выполнения программного модуля, под функциональным значением программного модуля в целом понимается множество возможных результатов, и согласованная реализация может обеспечить любой из возможных результатов. Примерами допустимых неоднозначностей являются:
Значения фиксированных и плавающих числовых величин, а также результаты операций над ними;
Порядок выполнения операторов в различных параллельных задачах при отсутствии явной синхронизации.
1.1.2. Согласованность реализации со стандартом
Согласованная реализация должна:
а) Корректно транслировать и выполнять правильные программные модули, написанные на языке Ада, если только их объем находится в допустимых для реализации пределах.
б) Не выполнять программные модули, объем которых больше допускаемого реализацией.
в) Не выполнять программные модули, содержащие ошибки, обнаружение которых предусмотрено стандартом.
г) Включать предусмотренные стандартом предопределенные программные модули.
д) Содержать только те изменения, которые допускает стандарт.
е) Описывать допустимые изменения способом, разрешенным стандартом.
1.2. Структура стандарта
Стандарт содержит четырнадцать глав, четыре обязательных и два справочных приложения.
Каждая глава делится на разделы, которые имеют общую структуру. В каждом разделе вводятся соответствующие понятия, даются все необходимые синтаксические правила и описывается семантика соответствующих конструкций. В конце раздела могут быть даны примеры и примечание.
Примеры предназначены для иллюстрации возможных форм описанных конструкций. Примечание предназначено для пояснения следствий из правил, описанных в данном или других разделах.
Определение стандарта языка программирования Ада предполагает следующее ограничение: материал каждого из перечисленных ниже пунктов носит информативный характер и не является частью определения стандарта языка.
Разд.1.3. Цели и источники разработки.
Разд.1.4. Обзор свойств языка.
Примеры и примечания, приведенные в конце любого раздела.
Каждый раздел, заголовок которого начинается со слов "Пример" или "Примеры".
1.3. Цели и источники разработки
Язык был разработан исходя из трех противоречивых требований:
- обеспечить надежность и сопровождение программ;
- поддерживать программирование как вид человеческой деятельности;
- обеспечить эффективность программ.
Необходимость в языках, повышающих надежность и упрощающих сопровождение программ, является установленным фактом. В языке Ада предпочтение было отдано удобочитаемости программы по сравнению с легкостью ее написания. Например, правила языка требуют, чтобы все переменные и их типы были явно описаны в программе. Так как тип переменной неизменен, компилятор может гарантировать совместимость операций над переменными со свойствами, присущими объектам этого типа. Более того, чтобы избежать обозначений, которые могут привести к ошибкам, в синтаксисе языка было отдано предпочтение конструкциям, которые ближе к естественному языку. Язык поддерживает раздельную компиляцию программных модулей способом, облегчающим разработку и сопровождение программ и обеспечивающим один и тот же уровень контроля для межмодульных и внутримодульных связей.
Человеческий фактор программирования также повлиял на разработку языка. Прежде всего была сделана попытка ограничить язык настолько, насколько это позволяла широкая область его применения. Язык охватывает всю область применения небольшим числом основных понятий путем систематизации и выявления однородности, а также учитывает требование описания такой семантики, которая совпадает с интуитивным представлением о ней у пользователя.
Как и многие другие виды человеческой деятельности, разработка программ становится все более децентрализованной и разобщенной. Следовательно, одной из центральных идей при разработке языка было обеспечить возможность составлять программу из независимо разработанных компонентов. Концепции пакетов, личных типов и настраиваемых модулей прямо служат этой идее, которая повлияла на многие другие аспекты языка.
При создании любого языка необходим учет проблемы эффективности. Языки, которые требуют сверхсложных компиляторов или приводят к неэффективному использованию памяти и времени выполнения программы, дают неэффективные результаты на всех машинах и для всех программ. Каждая конструкция языка оценивалась с точки зрения современных методов реализации. Отвергались все те конструкции, которые были недостаточно ясными или требовали чрезмерных машинных ресурсов.
Ни одна из указанных выше целей разработки языка не откладывалась на будущее. Все они учитывались одновременно и с самого начала разработки языка.
При разработке любого языка трудность заключается в том, что необходимо определить не только возможности, которыми он должен обладать и которые диктует предполагаемая область применения, но и собственно разработать средства языка, обеспечивающие эти возможности. Такие возможности и требования были учтены при формировании языка.
Другое обстоятельство, существенно упростившее разработку, было следствием приобретенного ранее опыта реализации удачных проектов на базе языка Паскаль, созданного с целями, аналогичными указанным выше. Такими языками являются языки Евклид, Лис, Меса, Модула и Сью. Многие из ключевых идей и синтаксических форм этих языков имеют аналоги в языке Ада. Некоторые существующие языки, такие как Алгол 68 и Симула, а также современные проекты языков Альфард и Клу, также повлияли на разработку языка, хотя и в меньшей степени, чем языки семейства Паскаль.
1.4. Обзор свойств языка
Ада-программа представляет собой один или несколько программных модулей, которые могут компилироваться раздельно. Программные модули - это подпрограммы (определяющие выполняемый алгоритм), пакеты (определяющие наборы понятий), задачные модули (определяющие параллельные вычисления) или настраиваемые модули (определяющие параметризованные пакеты и подпрограммы). Каждый модуль обычно состоит из двух частей: спецификации, содержащей видимую для других модулей информацию, и тела, содержащего детали реализации, о которых другие модули не обязаны знать.
Это различие между спецификацией и телом, а также возможность компилировать модули раздельно позволяют разрабатывать, записывать и тестировать программу как множество в достаточной степени независимых программных компонентов.
Ада-программа может использовать библиотеку программных модулей общего назначения.
Язык предоставляет средства, с помощью которых отдельные организации могут создавать свои собственные библиотеки. В тексте раздельно компилируемого программного модуля должны быть указаны имена библиотечных модулей, которые ему требуются.
Программные модули. Подпрограмма является основным модулем для представления алгоритма. Существуют два вида подпрограмм: процедуры и функции. Процедура - это средство вызова последовательности действий. Например, она может считывать данные, изменять значения переменных или выводить информацию. Процедура может иметь параметры для управления механизмом передачи информации между процедурой и точкой вызова.
Функция - это средство вызова действий по вычислению значения. Она подобна процедуре, но в результате выполнения еще и возвращает результат.
Пакет - это основной модуль для определения набора логически связанных понятий. Например, пакет может быть использован для определения общей группы данных и типов, набора взаимосвязанных подпрограмм или же множества описаний типов и соответствующих операций. Части пакета могут быть скрыты от пользователя, следовательно, доступ будет разрешен только к тем логическим свойствам, которые описаны в спецификации пакета.
Задачный модуль - это основной модуль для определения задачи, последовательность действий которой может выполняться параллельно с выполнением других задач. Такие задачи могут быть реализованы на многомашинной или многопроцессорной системе, либо чередованием выполнения задач на одном процессоре. Задачный модуль может определить или одну выполняемую задачу или задачный тип, позволяющий создать любое количество подобных задач.
Настраиваемый модуль - это шаблон, по которому можно получить конкретизацию в виде подпрограммы или пакета.
Описания и операторы. Тело программного модуля, как правило, содержит две части: раздел описаний, который определяет логические понятия, используемые в программном модуле, и последовательность операторов, определяющая выполнение этого программного модуля.
Раздел описаний связывает имена с описанными понятиями. Например, имя может обозначать тип, константу, переменную или исключение. Раздел описаний также может вводить имена и параметры других вложенных подпрограмм, пакеты, задачные модули и настраиваемые модули, используемые в программном модуле.
Последовательность операторов описывает последовательность действий, которые должны быть выполнены. Операторы выполняются последовательно (если только оператор возврата, перехода, выхода или возбуждения исключения не вызовет продолжения выполнения с другого места).
Оператор присваивания изменяет значение переменной. Вызов процедуры инициирует выполнение процедуры после сопоставления каждого фактического параметра, заданного в вызове, соответствующему формальному параметру.
Оператор выбора и условный оператор позволяют выполнить одну из входящих в них последовательностей операторов, определяемую значением выражения или значением условия.
Оператор цикла обеспечивает основной итерационный механизм в языке. Оператор цикла указывает, что повторение некоторой последовательности операторов выполняется по заданной итерационной схеме или до выполнения оператора выхода.
Оператор блока включает в себя последовательность операторов, которым предшествуют описания локальных понятий, используемых в этих операторах.
Некоторые операторы применимы только к задачам. Оператор задержки приостанавливает выполнение задачи на указанный интервал времени. Оператор вызова входа записывается как оператор вызова процедуры; он показывает, что выполнившая этот вызов задача готова для рандеву с другой задачей, имеющей указанный вход. Вызываемая задача готова принять вызов входа, когда ее выполнение достигает соответствующего оператора принятия, который определяет выполняемые далее действия. После завершения рандеву обе задачи как вызывающая, так и имеющая вход, продолжают свое параллельное выполнение. Одна из форм оператора отбора допускает отбор с ожиданием для одного из нескольких альтернативных рандеву. Другие формы оператора отбора допускают условные или временные вызовы входа.
Выполнение программного модуля может привести к ошибочным ситуациям, вследствие чего продолжение нормального выполнения программы невозможно. Например, когда результат арифметического вычисления превышает максимальное допустимое числовое значение или когда делается попытка доступа к компоненту массива с неправильным значением индекса. Для работы с такими ошибочными ситуациями текстуально за операторами программного модуля могут следовать обработчики исключений, определяющие предпринимаемые при возникновении ошибочных ситуаций действия. Исключения могут быть возбуждены и явно оператором возбуждения.
Типы данных. Каждый объект языка имеет тип, характеризующий множество значений и множество применимых к ним операций. Основные классы типов - это скалярные типы (включающие перечислимые и числовые типы), составные, ссылочные и личные типы.
Перечислимый тип определяет упорядоченное множество различных литералов перечисления, например, список состояний или перечень символов. Перечислимые типы BOOLEAN и CHARACTER предопределены.
Числовые типы обеспечивают средства выполнения точных или приближенных числовых вычислений. Для точных вычислений используются целые типы, которые обозначают множество последовательных целых чисел. В приближенных вычислениях используются либо фиксированные типы (типы чисел с фиксированной точкой), представимые с абсолютной погрешностью, либо плавающие типы (типы чисел с плавающей точкой), представимые с относительной погрешностью. Числовые типы INTEGER, FLOAT и DURATION предопределены.
Составные типы допускают определения структурных объектов из сгруппированных компонентов. Составные типы в языке представлены массивами и записями. Массив - это объект с индексируемыми компонентами одного и того же типа. Запись - это объект с именованными компонентами, возможно, различных типов. Индексируемый тип STRING предопределен.
Запись может иметь специальные компоненты, называемые дискриминантами. В записях можно определить альтернативные структуры, зависящие от значений дискриминантов.
Ссылочные типы позволяют вычислением генератора создавать связанные ссылками структуры данных. Они позволяют нескольким переменным ссылочного типа указывать на один и тот же объект, а компонентам одного объекта указывать на тот же самый или другие объекты. Элементы такой связанной структуры данных и их связи с другими элементами могут быть изменены во время выполнения программы.
Личные типы могут быть определены в пакете, скрывающем внутреннюю структуру, несущественную вне пакета. Пользователю таких типов видны лишь логически существенные их свойства (включая дискриминанты).
Концепция типа уточняется концепцией подтипа, благодаря чему пользователь может ограничить набор допустимых значений данного типа. Подтипы могут быть использованы для определения поддиапазонов скалярных типов, массивов с ограниченным множеством значений индексов, а также именованных и личных типов с конкретными значениями дискриминантов.
Другие средства языка. Для определения отображения типов на архитектуру объектной машины можно использовать спецификатор представления. Например, пользователь может задать число битов для представления объектов данного типа или размещение в памяти машины компонентов записи. Другие свойства языка допускают управляемое использование особенностей, связанных с низким уровнем, непереносимостью или зависимостью от реализации, включая прямое использование машинного кода.
Ввод-вывод в языке определен средствами предопределенных библиотечных пакетов. Предоставляются средства для ввода-вывода значений типов, определенных пользователем, а также значений предопределенных типов; обеспечивается представление изображений значений в стандартной форме.
Наконец, язык предоставляет мощные средства параметризации программных модулей, называемых настраиваемыми программными модулями. Параметрами настройки могут быть типы и подпрограммы (а также объекты), и, таким образом, допустимы общие алгоритмы, применимые для всех типов данного класса.
1.5. Метод описания и синтаксические обозначения
Контекстно-свободный синтаксис программных модулей языка Ада вместе с контекстно-зависимыми требованиями выражаются в повествовательной форме.
Семантика программных модулей описана правилами определения результата выполнения каждой конструкции и правилами их построения. В изложении используются термины, точное определение которых дано в тексте.
Все другие понятия имеют свое естественное значение, определенное в словаре русского языка Ушакова*.
________________
* Толковый словарь русского языка/Под ред. Д.Н.Ушакова. - М.: Государственное издательство иностранных и национальных словарей, 1938.
Контекстно-свободный синтаксис языка описывается с помощью простого варианта форм Бэкуса-Наура, в частности:
а) Записанные строчными буквами слова, возможно содержащие в некоторых случаях символ подчеркивания, используются для обозначения синтаксических понятий, например:
аддитивная_операция
В названиях синтаксических понятий, используемых вне контекста синтаксических правил, вместо символа подчеркивания используется пробел, например:
аддитивная операция
б) Полужирным шрифтом выделены зарезервированные слова, например:
array
в) В квадратные скобки заключены необязательные элементы. Поэтому два следующих правила эквивалентны:
оператор возврата : : = return [выражение];
оператор возврата : : = return ; return выражение;
г) Повторяющиеся элементы заключаются в фигурные скобки. Этот элемент может встретиться нуль или более раз; повторение осуществляется слева направо в соответствии с правилом левой рекурсии. Таким образом, два следующих правила эквивалентны:
слагаемое : : = множитель {операция_умножения множитель}
слагаемое : : = множитель слагаемое операция_умножения множитель
д) Вертикальная черта разделяет альтернативные элементы, кроме случаев, когда черта встречается непосредственно за открывающей фигурной скобкой, тогда она обозначает знак вертикальной черты:
буква_или_цифра : : = буквацифра
сопоставление_компонентов : : =
[выбор {выбор} = >] выражение
е) Если название какого-нибудь синтаксического понятия содержит выделенную курсивом часть, оно эквивалентно названию синтаксического понятия без выделенной курсивом части. Выделенная курсивом часть предназначена для выражения некоторой семантической информации. Например, имя_типа и имя_задачи эквивалентны просто понятию имя.
Примечание. Описывающие структурные конструкции синтаксические правила представлены в форме, соответствующей рекомендованному делению на абзацы. Например, условный оператор определяется так:
условный оператор : : = | |||||
if условие then | |||||
последовательность_операторов | |||||
{elsif условие then | |||||
последовательность_операторов} | |||||
[else | |||||
последовательность_операторов] | |||||
end if; |
Синтаксические правила записываются в несколько строк, если соответствующие части конструкции рекомендуется располагать на разных строчках. Все отступы от начала строчки рекомендованы в правилах для сдвига соответствующих частей конструкции. Все отступы должны быть кратны базовому шагу отступа (число пробелов в базовом шаге не определяется). Переход на новую строчку рекомендуется после точки с запятой. Допускается размещение всей конструкции в одной строчке.
1.6. Классификация ошибок
Определение языка делит ошибки на несколько различных категорий:
а) Ошибки, которые должны быть обнаружены во время компиляции любым компилятором с языка Ада.
Эти ошибки соответствуют любому нарушению правил, данных в этом стандарте, кроме нарушений, соответствующих подпунктам б и в. В частности, к этой категории относятся нарушения правил, в которых использованы слова должно, допустимо (или недопустимо), правильный или неправильный. Любая содержащая такую ошибку Ада-программа не является правильной; с другой стороны, тот факт, что программа правильна в этом смысле, не означает, что в ней нет других ошибок.
б) Ошибки, которые должны быть обнаружены во время выполнения Ада-программы.
Соответствующим ошибочным ситуациям сопоставлены имена предопределенных исключений. Каждый компилятор с языка Ада должен генерировать код, возбуждающий соответствующее исключение, если такая ошибочная ситуация обнаружится во время выполнения программы. Если исключение обязательно будет возбуждаться при выполнении данной программы, то компиляторы могут (но не обязательно) сообщить об этом во время компиляции.
в) Ошибочное выполнение.
В языке определен ряд правил, которым должна подчиняться Ада-программа, хотя от компилятора и не требуется обнаружение нарушений этих правил ни во время компиляции, ни во время выполнения программы. Слово ошибочный квалифицирует выполнение конструкций, содержащих ошибки этой категории. Результат выполнения ошибочной конструкции - непредсказуем.
г) Некорректная зависимость от порядка выполнения.
Когда в стандарте указывается, что различные части данной конструкции должны быть выполнены в порядке, который не определен в языке, это означает, что реализация может выполнять эти части в любом порядке, но не параллельно. Более того, конструкция некорректна, если выполнение этих частей в различном порядке дает различный результат. Во время компиляции и во время выполнения программы (этот процесс называется выполнением) компилятор не обязан обеспечивать проверку некорректной зависимости результата от порядка. Термин выполнение в равной мере применим к процессам, которые называются вычислением и предвыполнением.
Если компилятор способен распознать во время компиляции, что конструкция ошибочна или содержит некорректную зависимость от порядка, то допускается, чтобы компилятор генерировал код, заменяющий конструкцию кодом, возбуждающим предопределенное исключение PROGRAM_ERROR. Компилятор также может сгенерировать код, который во время выполнения проверяет ошибочность конструкции, некорректную зависимость от порядка или и то, и другое. Предопределенное исключение PROGRAM_ERROR возбуждается, если проверка покажет наличие такой ошибки.
2. ЛЕКСИКА
Текст программы состоит из текстов одной или нескольких компиляций. Текст компиляции - это последовательность лексических элементов (лексем), каждый из которых состоит из символов. В этой главе приведены правила составления лексем. Кроме того, в ней описаны прагмы, задающие определенную информацию для компилятора.
2.1. Набор символов
Символами текста программы должны быть только графические символы и символы управления форматом. Каждый графический символ представляется (визуально) графическим знаком. Описание определения языка в этом документе использует стандартный набор графических символов по ГОСТ 27465-87.
графический символ : : = основной_графический_символ | ||||
строчная_буква дополнительный_специальный_символ | ||||
основной_графический_символ : : = прописная_буква | ||||
цифра специальный_ символ символ_пробела | ||||
основной_символ : : = основной_графический_символ | ||||
символ_управления_форматом |
Набор основных символов достаточен для написания любой программы. Основные графические символы подразделяются на следующие подклассы:
а) прописные буквы
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
б) цифры
0 1 2 3 4 5 6 7 8 9
в) специальные символы
" # & ' ( ) * + , - . / : ; < = > _
г) символ пробела
Символы управления форматом (часть символов формата) - это символы по ГОСТ 27465-87, называющиеся: горизонтальная табуляция, вертикальная табуляция, возврат каретки, перевод строчки и перевод формата.
Остальные подклассы графических символов определяются следующим образом:
д) строчные буквы
a b c d e f g h I i j k l m n o p q r s t u v w x y z
а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
е) дополнительные специальные символы
! % ? @ [ \ ] { }
В разд.2.10 определены допустимые замены для специальных символов вертикальной черты (), номера (#) и кавычки (").
Примечание. Шрифтовые выделения графических символов (например, курсив или полужирный шрифт) не являются частью стандартного набора.
Для ссылок на специальные и дополнительные специальные символы в табл.2.1 приведены их наименования.
Таблица 2.1
Символ | Наименование |
" | Кавычки |
# | Номер |
& | Коммерческое И |
' | Апостроф |
( | Круглая скобка левая |
) | Круглая скобка правая |
* | Звездочка |
+ | Плюс |
, | Запятая |
- | Минус |
. | Точка |
/ | Дробная черта |
: | Двоеточие |
; | Точка с запятой |
< | Меньше |
= | Равно |
> | Больше |
_ | Подчеркивание |
| Вертикальная черта |
! | Восклицательный знак |
Знак денежной единицы | |
% | Проценты |
? | Вопросительный знак |
@ | Коммерческое ЭТ |
[ | Квадратная скобка левая |
\ | Обратная дробная черта |
] | Квадратная скобка правая |
| Сиркюмфлекс |
Слабое ударение | |
{ | Фигурная скобка левая |
} | Фигурная скобка правая |
Черта сверху |
2.2. Лексемы, разделители и ограничители
Текст каждой компиляции - это последовательность отдельных лексем. Лексема (лексический элемент) - это ограничитель, идентификатор (который может быть зарезервированным словом), числовой литерал, символьный литерал, строковый литерал или комментарий. Результат выполнения программы зависит только от конкретной последовательности лексем, исключая возможные комментарии.
В некоторых случаях необходим явный разделитель между соседними лексемами (в противном случае они могут быть восприняты как одна). Разделителем может быть символ пробела, символ управления форматом или конец строчки. Символ пробела не является разделителем в комментарии, строковом литерале или в символьном литерале. Символ управления форматом (кроме символа горизонтальной табуляции, когда он употребляется в комментариях) всегда является разделителем.
Конец строчки всегда является разделителем. Язык не определяет, что является концом строчки. Однако, если в данной реализации конец строчки обозначается одним или несколькими символами, то эти символы должны быть символами управления форматом, отличными от символа горизонтальной табуляции. Во всяком случае, последовательность из одного или нескольких символов управления форматом, отличных от символа горизонтальной табуляции, должна означать по крайней мере один конец строчки.
Один или несколько разделителей допустимы между любыми двумя соседними лексемами, перед первой или после последней лексемами каждой компиляции. По крайней мере один разделитель необходим между идентификатором или числовым литералом и соседними идентификаторами или числовыми литералами.
Ограничитель - это один из следующих специальных символов из набора основных символов
& ' ( ) * + , - . / : ; < = >
или один из так называемых составных ограничителей, представляющих собой пару специальных символов
=> .. ** := /= >= <= << >> <>
Каждый специальный символ является простым ограничителем, за исключением тех случаев, когда он встречается в составном ограничителе, в комментарии, в строковом, символьном или числовом литералах.
Остальные формы лексем описаны в других разделах этой главы.
Примечание. Каждая лексема должна располагаться в одной строчке, поскольку конец строчки - разделитель. Символы кавычки, номера, подчеркивания и два соседних дефиса не являются ограничителями, но могут входить в лексемы в качестве ее частей.
Наименования составных ограничителей даны в табл.2.2.
Таблица 2.2
Ограничитель | Наименование |
=> | Стрелка |
.. | Двойная точка |
** | Двойная звездочка (возведение в степень) |
:= | Присваивание (читается: "становится равным") |
/= | Неравенство (читается: "не равно") |
> = | Больше или равно |
< = | Меньше или равно |
< < | Левая скобка метки |
>> | Правая скобка метки |
< > | Бокс (коробка) |
2.3. Идентификаторы
Идентификаторы используются в качестве имен и зарезервированных слов.
идентификатор : : = буква { [подчеркивание] буква_или_цифра}
буква_или_цифра : : = буква цифра
буква : : = прописная_ буква строчная_буква
Все символы идентификатора существенны, включая символ подчеркивания между соседними буквами или цифрами. Идентификаторы, различающиеся только размерами букв и использованием графически совпадающих букв русского и латинского алфавитов, считаются совпадающими.
Примеры:
СЧЕТЧИК Х дай_символ Эвелина Марион
СНОБОЛ_4 XI СчетчикСтраниц ЗАПАСТИ_СЛЕДУЮЩИЙ_ЭЛЕМЕНТ
Примечание. Пробел внутри идентификатора недопустим, поскольку он является разделителем.
2.4. Числовые литералы
Числовые литералы подразделяются на два класса: вещественные и целые. Вещественный литерал - это числовой литерал, который включает точку; целый литерал - это числовой литерал без точки. Вещественные литералы являются литералами типа универсальный_вещественный. Целые литералы - литералы типа универсальный целый.
числовой_литерал : : = десятичный_литерал литерал_с_основанием
2.4.1. Десятичные литералы
Десятичный литерал - это числовой литерал, выраженный в общепринятой десятичной системе (основание по умолчанию равно десяти).
десятичный_литерал : : = целое [. целое] [порядок]
целое : : = цифра { [подчеркивание] цифра}
порядок : : = Е [+] целое Е - целое
Символ подчеркивания между соседними цифрами десятичного литерала не влияет на значение числового литерала. Буква Е в порядке может быть строчной или прописной буквой с одним и тем же назначением.
Для получения значения десятичного литерала с порядком следует умножить значение десятичного литерала без порядка на степень десяти, заданную порядком. Порядок для целого литерала не должен содержать знак минус.
Примеры:
12 | 0 | 1Е6 | 123_456 | - - целые литералы | |||
12.0 | 0.0 | 0.456 | 3.14159_26 | - - вещественные литералы | |||
1.34Е-12 | 1.0Е+6 | - - вещественные литералы с порядком |
Примечание. Ведущие нули допускаются. Пробел в числовом литерале недопустим даже между составными частями порядка, поскольку пробел является разделителем. Нулевой порядок для целого литерала допустим.
2.4.2. Литералы с основанием
Литерал с основанием - это числовой литерал, в котором явно указано основание. Основание должно принимать значение от двух до шестнадцати.
литерал_с_основанием : : = основание # целое_с_основанием | ||||
[. целое_с_основанием] # [порядок] | ||||
основание : : = целое | ||||
расширенная_цифра { [подчеркивание] расширенная__цифра} |
Символ подчеркивания, заключенный между соседними цифрами литерала с основанием, не влияет на значение этого числового литерала. Основание и порядок, если они есть, записываются в десятичной системе. В качестве расширенных цифр от десяти до пятнадцати допускаются только латинские буквы от А до F. Буква в литерале с основанием (расширенная цифра или буква Е в порядке) может быть строчной или прописной с одним и тем же смыслом.
Предполагается обычный смысл обозначения литерала с основанием; в частности, значение каждой расширенной цифры литерала с основанием должно быть меньше основания. Для получения значения литерала с основанием и порядком следует умножить значение литерала с основанием без порядка на основание, возведенное в указанную порядком степень.
Примеры:
2#1111_1111# | 16#FF# | 016#0FF# | |||
- - целые литералы со значением 255 | |||||
16#Е#Е1 | 2#1110_0000# | ||||
- - целые литералы со значением 224 | |||||
16#F.FF#E+2 | 2#1.1111_1111_111#E11 | ||||
- - вещественные литералы со значением 4095.0 |
2.5. Символьные литералы
Символьный литерал - это какой-либо из 161 графических символов (включая пробел), заключенный между двумя символами апострофа. Символьный литерал имеет значение некоторого символьного типа.
символьный_литерал : : = ' графический_символ
Примеры:
' А ' '*' ''' ''
2.6. Строковые литералы
Строковый литерал образуется из последовательности (возможно, пустой) графических символов, заключенной между двумя символами кавычки - строковыми скобками.
строковый литерал : : = " {графический_символ}"
Строковый литерал имеет значение, являющееся последовательностью значений символов, соответствующих графическим символам строкового литерала, кроме внешних символов кавычки. Для представления кавычки в последовательности значений символов необходимо в соответствующем месте внутри строкового литерала поместить пару соседних символов кавычки. (Это означает, что строковый литерал, включающий два соседних символа кавычки, никогда не рассматривается как два строковых литерала.)
Длина строкового литерала - это количество значений символьного типа в последовательности, его представляющей. (Каждые два соседних символа кавычки в строке считаются одним символом.)
Примеры:
" Дневное сообщение" | |||||
"" | - - пустой строковый литерал | ||||
" " | "А" """" | - - три строковых литерала длиной 1 | |||
"Символы, такие, как , % и } допустимы в строковых литералах". |
Примечание. Строковый литерал должен помещаться на одной строчке, поскольку он является лексемой (см. 2.2). Более длинные последовательности значений графических символов могут быть получены катенацией строковых литералов. Равным образом, катенация констант, описанных в пакетах ASCII и ГОСТ (см. приложение 3), может быть использована для получения последовательности значений символьного типа, которая включает значения неграфических символов (так называемых управляющих символов). Ниже даны примеры использования катенации:
"ПЕРВАЯ ЧАСТЬ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ," &
"КОТОРАЯ ПРОДОЛЖАЕТСЯ НА СЛЕДУЮЩЕЙ СТРОЧКЕ"
"последовательность, которая включает" & ГОСТ. ДА & "управляющий символ"
2.7. Комментарии
Комментарий начинается с двух соседних дефисов и продолжается до конца строчки. Комментарий может помещаться в любой строчке программы. Присутствие или отсутствие комментария не влияет ни на правильность, ни на неправильность программы. Более того, комментарии не влияют на результат программы; их единственное назначение - сделать программу более понятной.
Примеры:
- - последнее предложение выражает ту же мысль, что и
- - в языке Алгол 68
end; - - обработка СТРОЧКИ завершена
- - длинный комментарий может быть разбит на две или
- - несколько последовательных строчек
- - - - - - - первые два дефиса начинают комментарий
Примечание. Горизонтальная табуляция может быть использована в комментариях после двух дефисов; это эквивалентно одному или нескольким пробелам (см. 2.2).
2.8. Прагмы
Прагма используется для задания информации компилятору. Прагма начинается зарезервированным, словом pragma, за которым следует идентификатор - имя прагмы.
прагма : : = pragma идентификатор | ||||
[ (сопоставление_аргумента {, сопоставление_аргумента}) ]; | ||||
сопоставление_аргумента : : = | ||||
[идeнтификaтop_аргумента =>] имя | ||||
[идентификатор_ аргумента =>] выражение |
Прагмы допустимы только в следующих местах программы:
После ограничителя точки с запятой, но не внутри раздела формальных параметров или раздела дискриминантов;
В любом месте, где синтаксические правила допускают синтаксические понятия, в названии которых содержатся слова "описание", "оператор", "спецификатор" или "альтернатива", или одно из синтаксических понятий: вариант и обработчик исключений, но не вместо соответствующих конструкций, а также в любом месте, где допустим компилируемый модуль.
На месторасположение отдельных прагм могут накладываться дополнительные ограничения.
Некоторые прагмы имеют аргументы. Сопоставления аргументов могут быть либо позиционными, либо именованными, как и при сопоставлении параметров в вызовах подпрограмм (см. 6.4). Однако именованные сопоставления возможны, если определены идентификаторы аргументов. Именем аргумента должно быть либо имя, видимое в месте употребления прагмы, либо идентификатор, специфический для этой прагмы.
Предопределенные прагмы описаны в обязательном приложении 2; они должны поддерживаться в каждой реализации. Реализация может определить дополнительные прагмы. Они должны быть описаны в соответствии с обязательным приложением 4. Реализация не должна допускать определение прагм, наличие или отсутствие которых влияет на правильность текста программы. Следовательно, правильность программы не зависит от наличия или отсутствия прагм, определенных реализацией.
Прагма, не определенная в языке, не дает никакого результата, если ее идентификатор не распознан (данной) реализацией. Более того, прагма (как определенная в языке, так и определенная реализацией) не дает никакого результата, если ее размещение или ее аргументы не соответствуют допустимым для этой прагмы. Участок текста, на который распространяется действие прагмы, зависит от прагмы.
Примеры:
pragma LIST (OFF);
pragma OPTIMIZE (TIME);
pragma INLINE (УСТАНОВИТЬМАСКУ);
pragma SUPPRESS (RANGE_CHECK, ON => ИНДЕКС);
Примечание. Рекомендуется (но не требуется), чтобы реализация выдавала предупреждающие сообщения о прагмах, которые не распознаны, и поэтому проигнорированы.
2.9. Зарезервированные слова
Перечисленные в табл.2.3 идентификаторы называются зарезервированными словами. Они зарезервированы в языке для специальных целей и в стандарте изображаются строчными буквами полужирным шрифтом (после тире приведено наименование на русском языке).
Таблица 2.3
Зарезервированные слова | |
abort | - прекращение |
abs | - абсолютная величина |
accept | - принятие |
access | - ссылка_на |
all | - все |
and | - и |
array | - массив |
at | - положение |
begin | - начало |
body | - тело |
case | - выбор |
constant | - константа |
declare | - описание |
delay | - задержка |
delta | - дельта |
digits | - цифр |
do | - выполнение |
else | - иначе |
elsif | - инесли* |
________________ | |
end | - конец |
entry | - вход |
exception | - исключение |
exit | - выход |
for | -для |
function | - функция |
generic | - настройка |
goto | - переход_на |
if | - если |
in | - в |
in | - входной |
is | - есть |
limited | - лимитируемый |
loop | - цикл |
mod | - по_модулю |
new | - новый |
not | - не |
null | - пусто |
of | - из |
or | - или |
others | - другие |
out | - выходной |
package | - пакет |
pragma | - прагма |
private | - личный |
procedure | - процедура |
raise | - возбуждение |
range | - диапазон |
record | - запись |
rem | - остаток |
renames | - синоним |
return | - возврат |
reverse | - в_обратном_порядке |
select | - отбор |
separate | - отдельно |
subtype | - подтип |
task | - задача |
terminate | - завершение |
then | - то |
type | - тип |
use | - использовать |
when | - когда |
while | - пока |
with | - совместно_с |
xor | - либо |
Зарезервированные слова не должны использоваться в качестве описываемого идентификатора.
Примечание. Зарезервированные слова, отличающиеся только соответствующими строчными или прописными буквами, рассматриваются как одинаковые (см. 2.3). Идентификаторы некоторых атрибутов, стоящие после апострофа, совпадают с зарезервированными словами (DELTA, DIGITS и RANGE).
2.10. Допустимые замены символов
Для основных символов вертикальной черты, номера и кавычки допустимы следующие замены:
символ вертикальной черты () можно заменить восклицательным знаком (!) там, где он используется как ограничитель;
символ номера (#) в литерале с основанием можно заменить двоеточием (:) при условии, что в этом литерале заменяются оба символа номера;
символ кавычки ("), использованный как строковая скобка на обоих концах строкового литерала, можно заменить символом процента (%), если последовательность символов строкового литерала не содержит символа кавычки и если в этом литерале заменяются обе строковые скобки. Для представления символа процента внутри последовательности символов строкового литерала должна использоваться пара соседних символов процента, которые рассматриваются как один символ процента.
Эти замены не изменяют смысла программы.
Примечание. Рекомендуется, чтобы замена символов вертикальной черты, номера и кавычки была ограничена случаями, когда соответствующих графических символов нет на терминалах. Заметим, что вертикальная черта изображается на некоторых устройствах прерывистой линией, замена в этом случае не рекомендуется.
Правила для идентификаторов и числовых литералов таковы, что строчные и прописные буквы эквивалентны; эти лексемы могут быть записаны только символами основного набора. Если строковый литерал предопределенного типа STRING содержит символы не из основного набора, та же самая последовательность значений символов может быть получена катенацией строковых литералов, содержащих символы основного набора, и символьных констант, описанных в предопределенных пакетах ASCII и ГОСТ. Таким образом, строковый литерал "АБВГ" можно заменить на "АБ" & ГОСТ.ДЕНЕЖНЫЙ_ЗНАК&"ВГ", а строковый литерал "ABcd" со строчными буквами можно заменить на "AB"&ASCII. LC_C&ASCII.LC_D.
3. ОПИСАНИЯ И ТИПЫ
Эта глава описывает типы и правила описания констант, переменных и именованных чисел.
3.1. Описания
В языке определены некоторые сорта понятий, объявляемые явно и неявно описаниями.
К таким понятиям относятся, например, числовой литерал, объект, дискриминант, компонент записи, параметр цикла, исключение, тип, подтип, подпрограмма, пакет, задачный модуль, настраиваемый модуль, одиночный вход, семейство входов, формальный параметр (подпрограммы, входа, настраиваемой подпрограммы), формальный параметр настройки, именованный блок или цикл, помеченный оператор, а также операция (в частности, атрибут или литерал перечисления, см. 3.3.3).
Существует несколько форм описаний. Основное описание - это форма описания, определенная следующим образом:
основное_описание : : = | |||||
описание_объекта | описание_числа | ||||
описание_типа | описание_подтипа | ||||
описание_подпрограммы | описание_пакета | ||||
описание_задачи | описание_настройки | ||||
описание_исключения | конкретизация_настройки | ||||
описание_переименования | описание_субконстанты |
Некоторые формы описания всегда являются (явно) частью основного описания, а именно: спецификация дискриминантов, описание компонентов, описание входов, спецификация параметров, описание параметров настройки и спецификации литералов перечисления. Спецификация параметра цикла - это конструкция, которая входит только в некоторые формы оператора цикла.
Остальные формы описания являются неявными: имя блока, имя цикла и метка оператора. Некоторые операции описываются неявно (см. 3.3.3).
Для каждой формы описания правила языка определяют некоторый участок текста, называемый областью действия описания (см. 8.2). Некоторые формы описания связывают с описанным понятием идентификатор. Внутри области действия, и только в ней, существуют места, где возможно использование идентификатора для связи его с описанным понятием; эти места определяются правилами видимости (см. 8.3). В таких местах идентификатор называется именем понятия (простым именем); говорят, что имя обозначает связанное с ним понятие.
Некоторые формы спецификации литерала перечисления связывают символьный литерал с соответствующим описываемым понятием. Некоторые формы описаний связывают символ операции или другие обозначения с явно или неявно описанной операцией.
Процесс, в результате которого описание вступает в силу, называется предвыполнением описания; этот процесс протекает во время выполнения программы.
Говорят, что после своего предвыполнения описание становится предвыполненным. До завершения своего предвыполнения (как и до его начала) описание считается еще не предвыполненным. Предвыполнение любого описания дает всегда по крайней мере один эффект: описание из еще не предвыполненного становится (меняет статус) предвыполненным. Фраза: "предвыполнение не дает другого эффекта" используется тогда, когда происходит только изменение статуса описания. Процесс предвыполнения определяется также для разделов описаний, элементов описания и компилируемых модулей (см. 3.9 и 10.5).
Описания объекта, числа, типа и подтипа даны в этой главе. Остальные основные описания изложены в последующих главах.
Примечание. Синтаксические правила используют термин идентификатор для первого вхождения идентификатора в некоторую форму описания; термин простое имя используется для любого вхождения идентификатора, который уже обозначает какое-либо описанное понятие.
3.2. Объекты и именованные числа
Объект - это понятие языка. Объект имеет (содержит) значение данного типа. Объектом может быть:
Объект, объявленный описанием объекта или описанием одиночной задачи;
Формальный параметр подпрограммы, входа или настраиваемой подпрограммы;
Формальный объект настройки;
Параметр цикла;
Объект, указанный значением ссылочного типа;
Компонент или отрезок другого объекта.
Описание числа - это специальная форма описания объекта, которая связывает идентификатор со значением типа универсальный_целый или универсальный_вещественный.
описание_объекта : : = | |||||
список_идентификаторов : [constant] | |||||
указание_подтипа [: = выражение] ; | |||||
список идентификаторов : [constant] | |||||
определение_ограниченного_индексируемого_типа | |||||
описание _числа : : = | |||||
список_идентификаторов : constant | |||||
: = универсальное _статическое_выражение; | |||||
список_идентификаторов : : = | |||||
идентификатор {, идентификатор} |
Описание объекта называется единичным описанием объекта, если список его идентификаторов имеет единственный идентификатор; оно называется групповым описанием объектов, если его список имеет два или несколько идентификаторов. Групповое описание объектов эквивалентно последовательности соответствующего числа единичных описаний объектов. Для каждого идентификатора из списка в такой эквивалентной последовательности единичное описание объекта формируется из идентификатора, двоеточия и всего того, что стоит справа от двоеточия в групповом описании объекта; описания в эквивалентной последовательности идут в том же порядке, что и список идентификаторов.
Аналогичная эквивалентность имеет место также для списка идентификаторов описания числа, описаний компонентов, спецификаций дискриминантов, спецификаций параметров и описаний параметров настройки, исключений и субконстант.
В остальной части описания языка все пояснения даны для описаний с единственным идентификатором; соответствующие пояснения для описаний с несколькими идентификаторами следуют из эквивалентности, установленной выше.
Примеры:
- - групповое описание объектов
ИВАН, ПЕТР: ИМЯ_ПЕРСОНЫ : = new ПЕРСОНА (ПОЛ => М);
- - см. 3.8.1
- - эквивалентно единичным описаниям объектов,
- - следующим в данном порядке
ИВАН: ИМЯ_ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М);
ПЕТР: ИМЯ_ПЕРСОНЫ: = new ПЕРСОНА (ПОЛ => М);
3.2.1. Описания объектов
Описание объекта вводит объект, тип которого задан либо указанием подтипа, либо определением ограниченного индексируемого типа. Если описание объекта включает составной ограничитель присваивания, за которым следует выражение, то это выражение определяет начальное значение описываемого объекта; тип выражения должен совпадать с типом объекта.
Описываемый объект - константа, если в описании объекта присутствует зарезервированное слово constant. В этом случае описание должно включать явную инициализацию. Значение константы не может быть изменено после инициализации. Формальные параметры вида in подпрограмм и входов, а также формальные параметры настройки вида in являются константами; параметр цикла - константа в соответствующем цикле; подкомпонент или отрезок константы - тоже константа.
Объект, не являющийся константой, называется переменной (в частности, объект, заданный описанием объекта без зарезервированного слова constant, является переменной). Для изменения значения переменной существует только два пути: непосредственное присваивание или косвенное изменение (см. 6.2) оператором вызова процедуры или входа (это действие может быть выполнено над самой переменной, над компонентом переменной, либо над другой переменной, для которой данная является подкомпонентом).
Предвыполнение описания объекта происходит следующим образом:
а) устанавливается подтип объекта посредством предвыполнения указания подтипа или определения ограниченного индексируемого типа;
б) если описание объекта включает явную инициализацию, то его начальное значение получается вычислением соответствующего выражения. В противном случае вычисляются неявные начальные значения (если они есть) объекта или его подкомпонентов;
в) создается объект;
г) начальное значение (заданное явно или по умолчанию) присваивается объекту или соответствующему подкомпоненту.
Неявные начальные значения определяются для объектов, заданных описанием объекта, и для компонентов таких объектов в следующих случаях:
Для объекта ссылочного типа - его неявное начальное значение равно пустому значению ссылочного типа;
Для объекта заданного типа - неявное начальное (и единственное) значение обозначает соответствующую задачу;
Если тип объекта является типом с дискриминантами и его подтип ограничен, то неявное начальное (и единственное) значение каждого дискриминанта определяется подтипом объекта;
Для объекта составного типа неявное начальное значение каждого компонента, имеющего выражение по умолчанию, получается вычислением этого выражения, если только компонент не дискриминант ограниченного объекта (предыдущий случай).
Если компонент сам является составным объектом, значение которого не определено ни явной инициализацией, ни выражением по умолчанию, то неявное начальное значение компонентов составного объекта определяется теми же самыми правилами, что и для описанного объекта.
Шаги от а до г выполняются в указанном порядке. Если на шаге б вычисляется выражение по умолчанию для дискриминанта, то это вычисление выполняется до вычисления выражений по умолчанию для зависящих от дискриминанта подкомпонентов, а также до вычисления выражений по умолчанию, содержащих имя дискриминанта. Кроме предыдущего правила, порядок вычисления выражений по умолчанию языком не определен.
При инициализации описанного объекта или одного из его подкомпонентов проверяется принадлежность начального значения подтипу объекта; для массива, объявленного описанием объекта, сначала применяется неявное преобразование подтипа, как при выполнении оператора присваивания, если только объект не является константой с подтипом неограниченного индексируемого типа. При отрицательном результате проверки возбуждается исключение CONSTRAINT_ERROR.
Значение скалярной переменной после предвыполнения соответствующего описания объекта не определено, если начальное значение не было присвоено переменной при (явной или неявной) инициализации.
Если операнд преобразования типа или квалифицированного выражения является составной переменной с неопределенными значениями скалярных подкомпонентов, то значения соответствующих подкомпонентов результата неопределены. Выполнение программы ошибочно, если делается попытка вычислить скалярную переменную с неопределенным значением. Аналогично выполнение программы ошибочно, если делается попытка применить предопределенную операцию к составной переменной, имеющей скалярный подкомпонент с неопределенным значением.
Примеры описаний переменных:
СЧЕТ, СУММА: INTEGER; | ||||
ПРЕДЕЛ | : constant INTEGER := 10_000; | |||
НИЖНИЙ_ПРЕДЕЛ: | constant INTEGER : = ПРЕДЕЛ/10; | |||
ДОПУСК | : constant ВЕЩЕСТВ : = ДИСПЕРСИЯ (1.15); |
Примечание. Выражение для инициализации константы не обязательно является статическим выражением (см. 4.9). В приведенных выше примерах ПРЕДЕЛ и НИЖНИЙ_ПРЕДЕЛ инициализированы статическими выражениями, а ДОПУСК - нет, если ДИСПЕРСИЯ - определенная пользователем функция.
3.2.2. Описание чисел
Описание числа - это специальная дополнительная форма описания константы. Тип статического выражения, заданного для инициализации в описании числа, должен быть либо типом универсальный_целый, либо типом универсальный_вещественный. Константа, объявленная описанием числа, называется именованным числом и имеет тот же тип, что и статическое выражение.
Примечание. Относящиеся к выражениям универсального типа правила изложены в разд.4.10. Из этих правил следует, что именованное число имеет универсальный_целый тип, если каждое содержащееся в выражении первичное имеет этот тип. Аналогично, если каждое первичное имеет тип универсальный_вещественный, то именованное число имеет этот тип.
Примеры описаний чисел:
ПИ | : constant: = 3.14159_26536; - - вещественное | |||
- - число | ||||
ДВА_ПИ | : constant : = 2.0*ПИ; - - вещественное число | |||
МАКСИМУМ | : constant : = 500; | - - целое число | ||
СТЕПЕНЬ_16: constant : = 2 * * 16; - - целое 65_536 | ||||
ОДИН, ONE, EINS: constant : = 1; | - - три различных имени 1 |
3.3. Типы и подтипы
Тип характеризуется набором значений и набором операций (точнее: операций типа или операций над типом).
Существует несколько классов типов. Скалярные типы - это целые и вещественные типы и типы, определенные перечислением своих значений; значения этих типов не имеют компонентов. Индексируемый и именуемый типы являются составными. Значение составного типа состоит из значений компонентов. Ссылочный тип - это тип, значения которого обеспечивают доступ к объектам. Личные типы - это типы, для которых полностью определяется набор возможных значений, но непосредственный доступ к ним пользователей невозможен. Наконец, существуют задачные типы. (Личные типы описаны в гл.7, задачные - в гл.9, остальные - в гл.3).
Именуемые и личные типы могут иметь специальные компоненты, называемые дискриминантами, значения которых различают альтернативные формы значений каждого из этих типов. Если личный тип имеет дискриминанты, они известны пользователям типа. Следовательно, личный тип известен только своим именем, своими дискриминантами, если они есть, и соответствующим набором операций.
Набор возможных значений данного типа может зависеть от условия, которое называется ограничением (сюда же относятся случаи без ограничения); значение удовлетворяет ограничению, если оно удовлетворяет соответствующему условию. Подтип - это тип вместе с ограничением; говорят, что значение принадлежит подтипу, если оно принадлежит типу и удовлетворяет ограничению; данный тип называется базовым типом подтипа. Тип является подтипом самого себя; такой подтип называется неограниченным; он соответствует условию, которое не налагает никаких ограничений. Базовым типом типа является он сам.
Набор операций, определенных над конкретным типом, определен и для любого его подтипа; однако переменной данного подтипа можно присвоить значение только этого подтипа. Дополнительные операции, например, квалификация (в квалифицированном выражении), неявно определяются описанием подтипа.
Для объектов некоторых типов определено начальное значение по умолчанию; некоторые другие типы имеют выражения по умолчанию, определенные для части или всех своих компонентов. Некоторые операции над типами и подтипами называются атрибутами; эти операции обозначаются формой имени, описанной в разд.4.1.4.
Термин подкомпонент используется в описании языка вместо термина компонент, чтобы указать компонент другого компонента или подкомпонента. Если нет других подкомпонентов, используется термин компонент.
Данный тип не должен иметь подкомпонентов, типом которых является он сам.
Имя класса типов используется в описании языка для квалификации объектов и значений, принадлежащих к типу рассматриваемого класса. Например, термин "индексируемый объект" используется для объекта индексируемого типа; аналогично термин "ссылочное значение" используется для значения ссылочного типа.
Примечание. Набор значений подтипа - это подмножество значений базового типа. Это подмножество не обязано быть собственным подмножеством; оно может быть пустым.
3.3.1. Описания типов
Описание типа объявляет тип.
описание_типа : : = полное_описание_типа | |||||
неполное_описание_типа описание_личного_типа | |||||
полное_описание_типа : : = | |||||
type идентификатор [раздел_дискриминантов] | |||||
is определение_типа; | |||||
определение_типа : : = определение_перечислимого__типа | |||||
определение_целого_типа |
Предвыполнение полного описания типа состоит из предвыполнения раздела дискриминантов, если он есть (исключая случай, когда дается полное описание типа для уже встречавшегося неполного описания типа или для описания личного типа), и предвыполнения определения типа.
Типы, созданные в результате предвыполнения различных определений, являются различными. Более того, предвыполнение определения типа для числовых или производных типов создает как базовый тип, так и подтип базового типа; то же самое следует сказать об определении ограниченного индексируемого типа (одной из двух форм определения индексируемого типа).
Простое имя в полном описании типа обозначает описанный тип, если только описание типа не объявляет одновременно базовый тип и подтип базового типа; в этом случае простое имя обозначает подтип, а базовый тип является анонимным. Тип называется анонимным, если он не имеет простого имени. Для наглядности в этом стандарте время от времени используется псевдоимя анонимного типа, выделенное курсивом там, где обычно по синтаксису требуется идентификатор.
Примеры определений типов: