Справочник по Ada 95
3.2.1 Объявления типов
Объявление type_declaration объявляет тип и его первый подтип.
Синтаксис
type_declaration ::= full_type_declaration
| incomplete_type_declaration
| private_type_declaration
| private_extension_declaration
| incomplete_type_declaration
| private_type_declaration
| private_extension_declaration
full_type_declaration ::=
type defining_identifier [known_discriminant_part] is type_definition;
| task_type_declaration
| protected_type_declaration
type defining_identifier [known_discriminant_part] is type_definition;
| task_type_declaration
| protected_type_declaration
type_definition ::=
enumeration_type_definition | integer_type_definition
| real_type_definition | array_type_definition
| record_type_definition | access_type_definition
| derived_type_definition
enumeration_type_definition | integer_type_definition
| real_type_definition | array_type_definition
| record_type_definition | access_type_definition
| derived_type_definition
Правила допустимости
Данный тип не должен иметь подкомпонента, тип которого совпадает с данным типом.
Статическая семантика
defining_identifier объявления type_declaration обозначает первый подтип типа. known_discriminant_part, если есть, определяет дискриминанты типа (см. 3.7, ``Дискриминанты''). Остальная часть type_declaration определяет оставшиеся характеристики типа.
Тип, определенный объявлением type_declaration, является именованным типом; такой тип имеет один или более именованных подтипов. Некоторые другие формы объявления также включают определения типов в качестве части объявления объекта (включая параметр или дискриминант). Тип, определенный таким объявлением, является безымянным — у него нет именованных подтипов. Для целей пояснения этот международный стандарт иногда ссылается на безымянный тип с помощью псевдоимени, написанного курсивом, и использует такие псевдоимена в местах, где синтаксис обычно требует идентификатора. Для именованного типа, первым подтипом которого является T, этот международный стандарт иногда ссылается на тип T как просто ``тип T''.
Именованный тип, который объявлен full_type_declaration, или безымянный тип, определенный в рамках объявления объекта типа, называется полным типом. type_definition, task_definition, protected_definition или access_definition, который определяет полный тип, называется полным определением типа. Типы, объявленные другими формами type_declaration, не являются отдельными типами; они являются частичным или неполным представлением какого-либо полного типа.
Определение типа неявно объявляет определенные предопределенные операторы, которые действуют на тип в соответствии с тем, к какой категории относится тип, как указано в 4.5, ``Операторы и оценка выражений''.
Предопределенные типы (например, типы Boolean, Wide_Character, Integer, root_integer и universal_integer) являются типами, которые определены в предопределенном пакете библиотеки Standard; этот пакет также включает (неявные) объявления их предопределенных операторов. Пакет Standard описан в A.1.
Динамическая семантика
Выполнение full_type_declaration состоит из выполнения полного определения типа. Каждое выполнение полного определения типа создает отдельный тип и его первый подтип.
Примеры
Примеры определений типов:
(Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный)
диапазон 1 .. 72
массив(1 .. 10) из Целого
диапазон 1 .. 72
массив(1 .. 10) из Целого
Примеры объявлений типов:
type Цвет is (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
type Столбец is диапазон 1 .. 72;
type Таблица is массив(1 .. 10) из Целого;
type Столбец is диапазон 1 .. 72;
type Таблица is массив(1 .. 10) из Целого;
ПРИМЕЧАНИЯ
3 Каждый из вышеперечисленных примеров объявляет именованный тип. Указанный идентификатор обозначает первый подтип типа. Другие именованные подтипы типа могут быть объявлены с помощью subtype_declaration (см. 3.2.2). Хотя имена не обозначают напрямую типы, фраза вроде ``тип Столбец'' иногда используется в этом международном стандарте для ссылки на тип Столбец, где Столбец обозначает первый подтип типа. Пример определения безымянного типа см. в объявлении массива Color_Table в 3.3.1; его тип является безымянным — у него нет именованных подтипов.