Р а з д е л ы вариантов
Именуемый тип с разделом вариантов задает альтернативные списки компонентов. Каждый вариант определяет компоненты для соответствующего значения или значений дискриминанта.
раздел-вариантов : : =
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 ПЕРИФЕРИЙНЫЙ (ДИСК);
Примеры ограниченных переменных именуемого типа:
ПИШУЩЕЕ_УСТРОЙСГВО: ПЕРИФЕРИЙНЫЙ (МОДУЛЬ =>
ПЕЧАТАЮЩЕЕ-УСТРОЙСТВО);
АРХИВ: УСТРОЙСТВО-ДИСКА;
Примечание. Выборы с дискретными значениями используются также в операторах и в агрегатах массива. Выборы с простыми именами компонентов используются только в агрегатах записей.
О п е р а ди и над именуемыми типами
Базовые операции над именуемым типом включают присваивание и агрегаты (если тип - не лимитируемый тип), проверку принадлежности, именование компонентов записи, квалификацию и преобразование типа (для производных типов).
Для любого объекта А типа с дискриминантами базовые операции включают также следующий атрибут.
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).
Ссылочные типы
Объявленный описанием объект создается предвыполнением этого описания и обозначается простым именем или некоторой другой формой имени. В противоположность этому существуют объекты, создаваемые вычислением генераторов (см. 4.8) и не имеющие простого имени. Доступ к такому объекту осуществляется посредством возвращаемого генератором ссылочного значения; говорят, что ссылочное значение указывает объект.
определение_ссылочного_типа : : = access указание_подтипа
Для каждого ссылочного типа существует литерал null, имеющий пустое ссылочное значение, вообще не указывающее объект. Пустое значение ссылочного типа — начальное значение этого типа но умолчанию. Другие значения ссылочного типа получаются вычислением специальной операции над типом, называемой генератором. Каждое такое ссылочное значение указывает объект подтипа, обозначенного указанием подтипа определения ссылочного типа; этот подтип называется указываемым подтипом; базовый тип этого подтипа называется указываемым типом. Указанные значением ссылочного типа объекты образуют набор, неявно связанный с этим типом.
Предвыполнение определения ссылочного типа состоит из предвыполне- ния указания подтипа и создания ссылочного типа.
Если ссылочный объект — константа, то ссылочное значение не может быть изменено и всегда указывает один и тот же объект. С другой стороны, значение указываемого объекта не обязательно остается одним и тем же (присваивание указываемому объекту допустимо, если указываемый тип не лимитируемый).
Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, — это ограничения индексов и ограничения дискриминантов (см. разд. 3.6.1 и 3.7.2 для правил, применимых к этим указаниям подтипа). Ссылочное значение принадлежит соответствующему подтипу ссылочного типа, если либо ссылочное значение — пустое значение, либо значение указываемого объекта удовлетворяет ограничению.
Примеры:
type ОБРАМЛЕНИЕ is access МАТРИЦА; - - см. 3.6
type ИМЯ_БУФЕРА is access БУФЕР; - - см. 3.7.1
Примечание. Ссылочное значение, передаваемое генератором, может быть присвоено нескольким ссылочным объектам. Следовательно, объект, созданный генератором, может быть указан более чем одной переменной или константой ссылочного типа. Ссылочное значение может указывать только объект, созданный генератором, в частности, оно не может указывать объект, объявленный описанием объекта.
Если тип объектов, указанных ссылочными значениями, - индексируемый тип или тип с дискриминантами, то эти объекты ограничены либо границами массива, либо значениями дискриминантов, заданными неявно или явно соответствующими генераторами (см. 4.8).
Ссылочные значения в некоторых других языках называются указателями или ссылками.
Н е п о л н ы е описания типов
Никаких конкретных ограничений на тип, указываемый ссылочным типом, не существует. В Частности, тип компонента указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или описания личного типа) для одного или нескольких типов.
неполное_описание_типа : : =
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;
МОЙ-АВТО, ВАШ_АВТО, СЛЕДУЮЩИЙ-АВТО:
ИМЯ-АВТОМОБИЛЯ; - - неявно инициированы пустым значением
О п е р а ц и и над ссылочными типами
Базовые операции над ссылочным типом включают присваивание, генераторы для этого ссылочного типа, проверку принадлежности, явное преобразование, квалификацию и литерал 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).
Кроме базовых, операции над ссылочным типом включают предопределенное сравнение на равенство и неравенство.
Разделы описаний
Раздел описаний содержит элементы описания (возможно и ни одного). раздел—описаний : : = {основной— элемент—описания} {дополнительный_злемент-Описания} основной—элемент—описания : : = основное—описание
I спецификатор-представления
I спецификатор использования дополнительный—элеМент—описания : : = тело I описание—подпрограммы | описание_пакета I описание—задачи | описание—настройки
I спецификатор—использования | конкретизация—настройки тело : : = соответствующее—тело | след_тела соответствующее—тело : : = тело_подпрограммы
I тело_пакета | тело_задачи
Предвыполнение раздела описаний состоит из предвыполнения элементов описания, если они есть, в порядке их следования в разделе описаний. После своего предвыполнения элемент описания называется предвыполнен- ным. До окончания своего предвыполнения (включая фазу перед предвы- полнением) элемент описания еще не предвыполнен.
Для нескольких форм элементов описания правила языка (в частности, правило определения области действия и правила видимости) таковы, что использование понятия до предвыполнения элемента описания, который объявляет это понятие, либо невозможно, либо является неправильным. Например, невозможно использование имени типа для описания объекта, если соответствующее описание типа еще не предвыполнено. В случае тел осуществляются следующие проверки:
При вызове подпрограммы проверяется, предвыполнено ли уже тело подпрограммы.
При активизации задачи проверяется, предвыполнено ли уже тело соответствующего заданного модуля.
При конкретизации настраиваемого модуля, имеющего тело, проверяется, предвыполнено ли уже тело настраиваемого модуля.
Если одна из этих проверок дает отрицательный результат, возбуждается исключение PROGRAM ERROR.
Если описание подпрограммы, описание пакета, описание задачи или описание настраиваемого понятия является элементом описания данного раздела описаний, то тело (если оно существует) программного модуля, описанного элементом описания, должно само быть элементом описания этого раздела описаний (и должно помещаться ниже). Если тело представлено следом тела, то для этого программного модуля необходим раздельно компилируемый субмодуль, содержащий соответствующее тело (см. 10.2).