1. Р а з д е л ы вариантов

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

раздел-вариантов : : =

case простое_юля_дискриминанта is

вариант

{вариант}

end case;

вариант : : =

when выбор {I выбор} => список_компонентов выбор : : = простое_выражение I дискретный_диапазон I others I простое_тля_компонента

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

Простые выражения и дискретные диапазоны, данные как выборы в разделе вариантов, должны быть статическими. Определенный дискретным диапазоном выбор задает все значения соответствующего диапазона (и ни одного, если диапазон пустой). Выбор others допустим только для послед­него варианта и только как его единственный выбор; он задает все осталь­ные значения (возможно и ни одного), не упомянутые в выборах предыду­щих вариантов. Простое имя компонента недопустимо в качестве выбора варианта (хотя оно присутствует в синтаксисе выбора).

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

Примеры именуемого типа с разделом вариантов:

type УСТРОЙСТВО is (ПЕЧАТАЮЩЕЕ_УСТРОЙСТВО, ДИСК, БАРАБАН) ;

type СОСТОЯНИЕ is (ОТКРЫТ, ЗАКРЫТ);

type ПЕРИФЕРИЙНЫЙ (МОДУЛЬ: УСТРОЙСТВО: = ДИСК) is record

СТАТУС: СОСТОЯНИЕ;

case МОДУЛЬ is

when ПЕЧАТАЮЩЕЕ _УСТРОЙСТВО=>

СЧЕТСТРОЧЕК: INTEGER range 1. ,РАЗМЕР_СТР;

when others = >

ЦИЛИНДР: ИНДЕКС_ЦИЛИНДРА;

ТРАКТ: НОМЕР_ТРАКТА;

end case;

end record;

Примеры подтипов записей:

subtype УСТРОЙСТВО_БАРАБАНА is ПЕРИФЕРИЙНЫЙ (БАРАБАН);

subtype УСТРОЙСТВО..ДИСКА is ПЕРИФЕРИЙНЫЙ (ДИСК);

Примеры ограниченных переменных именуемого типа:

ПИШУЩЕЕ_УСТРОЙСГВО: ПЕРИФЕРИЙНЫЙ (МОДУЛЬ =>

ПЕЧАТАЮЩЕЕ-УСТРОЙСТВО);

АРХИВ: УСТРОЙСТВО-ДИСКА;

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

  1. О п е р а ди и над именуемыми типами

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

Для любого объекта А типа с дискриминантами базовые операции вклю­чают также следующий атрибут.

A'CONSTRAINED Вырабатывает значение TRUE, если ограничение дис­криминанта наложено на объект А или если объект — константа (включая формальный параметр или формальный параметр настройки вида in); вы­рабатывает значение FALSE в противном случае. Если А — формальный па­раметр настройки вида in out или если А — формальный параметр вида in out или out, и данное в соответствующей спецификации параметра обозначе­ние типа обозначает неограниченный тип с дискриминантами, то значение этого атрибута получается из значения атрибута соответствующего факти­ческого параметра. Значение этого атрибута имеет предопределенный тип BOOLEAN.

Кроме того, атрибуты T'BASE и T'SIZE определены для именуемого типа или подтипа Т (см. 3.3.3) '; атрибуты A'SIZE и A'ADDRESS определе­ны для записи А (см. 13.7.2).

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

Примечание. Именуемый тип — лимитируемый, если тип хотя бы одного из его компонентов - лимитируемый (см. 7.4.4).

  1. Ссылочные типы

Объявленный описанием объект создается предвыполнением этого опи­сания и обозначается простым именем или некоторой другой формой име­ни. В противоположность этому существуют объекты, создаваемые вычис­лением генераторов (см. 4.8) и не имеющие простого имени. Доступ к тако­му объекту осуществляется посредством возвращаемого генератором ссы­лочного значения; говорят, что ссылочное значение указывает объект.

определение_ссылочного_типа : : = access указание_подтипа

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

Предвыполнение определения ссылочного типа состоит из предвыполне- ния указания подтипа и создания ссылочного типа.

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

Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, — это ограничения индексов и ограни­чения дискриминантов (см. разд. 3.6.1 и 3.7.2 для правил, применимых к этим указаниям подтипа). Ссылочное значение принадлежит соответствую­щему подтипу ссылочного типа, если либо ссылочное значение — пустое зна­чение, либо значение указываемого объекта удовлетворяет ограничению.

Примеры:

type ОБРАМЛЕНИЕ is access МАТРИЦА; - - см. 3.6

type ИМЯ_БУФЕРА is access БУФЕР; - - см. 3.7.1

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

Если тип объектов, указанных ссылочными значениями, - индексируемый тип или тип с дискриминантами, то эти объекты ограничены либо границами массива, ли­бо значениями дискриминантов, заданными неявно или явно соответствующими гене­раторами (см. 4.8).

Ссылочные значения в некоторых других языках называются указателями или ссылками.

  1. Н е п о л н ы е описания типов

Никаких конкретных ограничений на тип, указываемый ссылочным ти­пом, не существует. В Частности, тип компонента указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или опи­сания личного типа) для одного или нескольких типов.

неполное_описание_типа : : =

type идентификатор [раздел_дискриминантов] ;

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

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

Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел Дискриминантов, то это предвыполнение вклю­чает предвыполнение раздела дискриминантов: в этом случае раздел дис­криминантов полного описания типа не предвыполняется.

/

Пример рекурсивного типа:

type ЯЧЕЙКА; - - неполное описание типа

type СВЯЗЬ is access ЯЧЕЙКА;

type ЯЧЕЙКА is

record

ЗНАЧЕНИЕ: INTEGER;

СЛЕД: СВЯЗЬ;

ПРЕД: СВЯЗЬ;

end record;

ГОЛОВА: СВЯЗЬ: = new ЯЧЕЙКА' (0, null, null);

СЛЕДУЮЩИЙ: СВЯЗЬ: = ГОЛОВА. СЛЕД;

Примеры взаимозависимых ссылочных типов:

type ПЕРСОНА (ПОЛ: РОД); - - неполное описание типа type АВТОМОБИЛЬ; - - неполное описание типа

type ИМЯ ПЕРСОНЫ is access ПЕРСОНА;

type ИМЯ_АВТОМОБИЛЯ is access АВТОМОБИЛЬ;

type АВТОМОБИЛЬ is

record

НОМЕР: INTEGER;

ВЛАДЕЛЕЦ: ИМЯ_ПЕРСОНЫ;

end record;

type ПЕРСОНА (ПОЛ: РОД) is record

ИМЯ: STRING (1..20);

РОДИЛСЯ: ДАТА;

ВОЗРАСТ: INTEGER range 0. .130;

МАШИНА: ИМЯ_АВТОМОБИЛЯ; case ПОЛ is

when М = > ЖЕНА: ИМЯ_ПЕРСОНЫ (ПОЛ = > Ж); when Ж = > МУЖ: ИМЯ_ПЕРСОНЫ (ПОЛ => М); end case;

end record;

МОЙ-АВТО, ВАШ_АВТО, СЛЕДУЮЩИЙ-АВТО:

ИМЯ-АВТОМОБИЛЯ; - - неявно инициированы пустым значением

  1. О п е р а ц и и над ссылочными типами

Базовые операции над ссылочным типом включают присваивание, гене­раторы для этого ссылочного типа, проверку принадлежности, явное преоб­разование, квалификацию и литерал null. Если указываемый тип — именуе­мый тип с дискриминантами, то базовые операции включают именование Соответствующих дискриминантов; если указываемый тип — именуемый тип, то они включают именование соответствующих компонентов; если указываемый тип - индексируемый тип, то они включают образование ин­дексированных компонентов и отрезков; если указываемый тип — задан­ный тип, то они включают именование входов и семейств входов. Кроме то­го, базовые операции включают образование именованйого компонента с зарезервированным словом all (см. 4.1.3).

Если указываемый тип — индексируемый тип, то базовые операции включают атрибуты с обозначениями FIRST, LAST, RANGE и LENGTH (и эти же атрибуты с параметром К для номера измерения). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики указываемого объекта (см. 3.6.2).

Если указываемый тип — заданный тип, то базовые операции включают атрибуты с обозначениями TERMINATED и CALLABLE (см. 9.9). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики заданных объек­тов.

Кроме того, атрибут T'BASE (см. 3.3.3) и атрибуты представления T'SIZE и Т'STORAGE-SIZE (см. 13.7.2) определены для ссылочного типа или подтипа Т; атрибуты A'SIZE и A'ADDRESS определены для ссылочно­го объекта А (см. 13.7.2).

Кроме базовых, операции над ссылочным типом включают предопре­деленное сравнение на равенство и неравенство.

  1. Разделы описаний

Раздел описаний содержит элементы описания (возможно и ни одного). раздел—описаний : : = {основной— элемент—описания} {дополнительный_злемент-Описания} основной—элемент—описания : : = основное—описание

I спецификатор-представления

I спецификатор использования дополнительный—элеМент—описания : : = тело I описание—подпрограммы | описание_пакета I описание—задачи | описание—настройки

I спецификатор—использования | конкретизация—настройки тело : : = соответствующее—тело | след_тела соответствующее—тело : : = тело_подпрограммы

I тело_пакета | тело_задачи

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

Для нескольких форм элементов описания правила языка (в частности, правило определения области действия и правила видимости) таковы, что использование понятия до предвыполнения элемента описания, который объявляет это понятие, либо невозможно, либо является неправильным. На­пример, невозможно использование имени типа для описания объекта, если соответствующее описание типа еще не предвыполнено. В случае тел осу­ществляются следующие проверки:

  • При вызове подпрограммы проверяется, предвыполнено ли уже тело подпрограммы.

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

  • При конкретизации настраиваемого модуля, имеющего тело, прове­ряется, предвыполнено ли уже тело настраиваемого модуля.

Если одна из этих проверок дает отрицательный результат, возбуждает­ся исключение PROGRAM ERROR.

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