Именуемые типы
Объект именуемого типа (запись) — это составной объект, состоящий из именованных компонент. Значение записи — составное значение, состоящее из значений своих компонент.
определение-именуемого-типа::= record список-компонент end recordсписок_компонент::= описание_компоненты {описание_компоненты} |{ описание_компоненты} раздел_вариантов | null;описание_компоненты ::= список_идентификаторов : определение_подтипа_компоненты [:= выражение]; определение_подтипа_компоненты ::= указание_подтипа
Каждое описание компоненты задает компоненту именуемого типа. Кроме этих компонент в компоненты именуемого типа включаются любые компоненты, описанные спецификациями дискриминантов описания именуемого типа. Идентификаторы всех компонент именуемого типа должны быть различными. Использование имени, обозначающего компоненту записи, отличную от дискриминанта, недопустимо в определении именуемого типа, который описывает эту компоненту.
Описание компоненты с несколькими идентификаторами эквивалентно последовательности единичных описаний компонент, как пояснено в разд. Каждое единичное описание компоненты объявляет компоненту записи, подтип которой задан определением подтипа компоненты.
Если описание компоненты включает составной ограничитель присваивания, за которым следует выражение, то это выражение является выражением по умолчанию компоненты записи; выражение по умолчанию должно иметь тип компоненты. Выражения по умолчанию недопустимы для компонент лимитируемого типа.
Если именуемый тип не имеет раздела дискриминантов, то одни и те же компоненты присутствуют во всех значениях этого типа. Если список компонент именуемого типа определен зарезервированным словом null и раздел дискриминантов отсутствует, то именуемый тип не имеет компонент и все записи этого типа — пустые записи.
Предвыполнение определения именуемого типа создает именуемый тип; оно состоит из предвыполнения соответствующих (единичных) описаний компонент в порядке их следования, включая описания компонент в разделе вариантов. Предвыполнение описания компоненты состоит из предвыполнения определения подтипа компоненты.
Для предвыполнения определения подтипа компоненты в случае, когда ограничение не зависит от дискриминанта, предвыполняется указание подтипа. Если, с другой стороны, ограничение зависит от дискриминанта, то Предвыполнение состоит из вычисления каждого входящего в ограничение выражения, которое не является дискриминантом.
Примеры описаний именуемого типа:
type DATE is record DAY : INTEGER range 1 ..31; MONTH : MONTHNAME; YEAR : INTEGER range 0 .. 4000; end record;type COMPLEX is record RE : REAL := 0.0; IM : REAL := 0.0; end rocord;
Примеры переменных именуемого типа:
TOMORROW, YESTERDAY : DATE; А, В, С : COMPLEX;-- компоненты А, В и С неявно инициализированы нулем
. Выражения по умолчанию для компоненты записи при отсутствии явной инициализации неявно вычисляются предвыполнением описания записи (см. 1). Если описание компоненты имеет несколько идентификаторов, то выражение вычисляется один раз для каждой такой компоненты записи (поскольку это описание эквивалентно последовательности единичных описаний компонент).
В отличие от компонент массива компоненты записи не обязательно имеют один и тот же тип.
Ссыпки: выражение 4.4, дискриминант 3.3, зависит от дискриминанта 1, идентификатор 2.3, имя 4.1, компонента 3.3, лимитируемый тип 4, обозначение типа 2, объект 3.2, ограничение 3.3, описание 3.1, подтип 3.3, Предвыполнение 3.9, раздел вариантов 3, раздел дискриминантов 3.7, 1, составное значение 3.3, составной ограничитель присваивания 2.2, список идентификаторов 3.2, тип
1. ДИСКРИМИНАНТЫ
Раздел дискриминантов специфицирует дискриминанты типа. Дискриминант записи — это компонента записи. Тип дискриминанта должен быть дискретным.
раздел-дискриминантов:: =
(спецификация-дискриминанта {; спецификация-дискриминанта})
спецификация-дискриминанта ::=
список-идентификаторов : обозначение-типа [:= выражение]
Раздел дискриминантов допустим только в описании именуемого типа, в описании личного типа или в неполном описании типа (соответствующее полное описание должно тогда описывать именуемый тип), а также в описании параметра настройки для формального личного типа.
Спецификация дискриминанта с несколькими идентификаторами эквивалентна последовательности единичных спецификаций дискриминантов, как пояснено в разд. Каждая единичная спецификация дискриминанта описывает дискриминант. Если спецификация дискриминанта включает составной ограничитель присваивания, за которым следует выражение, то это — выражение по умолчанию для дискриминанта; выражения по умолчанию должны быть заданы либо для всех, либо не заданы ни для одного из дискриминантов раздела дискриминантов.
Использование имени дискриминанта недопустимо в выражениях по умолчанию раздела дискриминантов, если спецификация дискриминанта сама дана в этом разделе дискриминантов.
В определении именуемого типа допустимы только следующие случаи использования имени дискриминанта: в выражениях по умолчанию для компонент записи, в разделе вариантов в качестве имени дискриминанта, а также в определении подтипа компоненты — либо как границы в ограничении индекса, либо для задания значения дискриминанта в ограничении дискриминанта. Использованное в этих определениях подтипа компоненты имя дискриминанта должно встречаться само по себе, а не как часть выражения. Такие определения подтипа компонент и такие ограничения называются зависимыми от дискриминанта.
Компонента называется зависимой от дискриминанта, если она — либо компонента записи, описанная в разделе вариантов, либо компонента записи, чье определение подтипа компоненты зависит от дискриминанта, либо, наконец, одна из подкомпонент, зависящих от дискриминанта.
Каждое значение записи включает значение каждого дискриминанта, заданного для именуемого типа; оно также включает значение для каждой компоненты записи, которая не зависит от дискриминанта. Значения дискриминантов определяют, значения каких компонент, зависящих от дискриминантов, присутствуют в значении записи.
Непосредственное присваивание дискриминанту объекта недопустимо; более того, дискриминант недопустим как фактический параметр вида in out или out либо как фактический параметр настройки вида in out. Единственным путем изменения значения дискриминанта переменной является присваивание (полного) значения самой переменной. Аналогично присваивание самой переменной является единственным путем изменения одной из ее компонент, если определение подтипа компоненты зависит от дискриминанта переменной.
Предвыполнение раздела дискриминантов не имеет другого эффекта.
Индексируемые типы
Индексируемый объект (массив) — это составной объект, содержащий компоненты, имеющие один и тот же подтип. В имени компоненты массива используется одно или несколько индексных значений, принадлежащих заданным дискретным типам. Значение массива — это составное значение, состоящее из значений его компонент
опеределение-индексируемого-типа :: = определение-неограниченного-индексируемого-типа | определение-ограниченного-индексируемого-типаопределение-неограниченного-индексируемого-типа ::= array (определение-подтипа-индекса {, определение-подтипа-индекса}) of указание-подтипа-компонентыопределение-ограниченного-индексируемого-типа:: = array ограничение-индекса of указание-подтипа-компонентыопределение-подтипа-индекса ::= обозначение-типа range < > ограничение-индекса ::= (дискретный-диапазон {, дискретный-диапазон}) дискретный-диапазон :: = указание-дискретного-подтипа | диапазонМассив характеризуется числом индексов (размерность массива), типом и позицией каждого индекса, верхней и нижней границами каждого индекса, а также типом и возможным ограничением компонент. Порядок индексов существен.
Для каждого возможного значения индекса одномерный массив имеет отдельную компоненту. Многомерный массив имеет отдельную компоненту для каждой возможной последовательности значений индексов, которая может быть образована фиксацией значений для каждой позиции индекса (в данном порядке). Возможными значениями индекса являются все значения между нижней и верхней границами включительно; этот диапазон значений называется диапазоном индекса.
Определение неограниченного индексируемого типа определяет индексируемый тип. Для каждого объекта индексируемого типа число индексов, тип и позиция каждого индекса, а также подтип компонент будут такими, как в определении типа; значение нижней и верхней границ для каждого индекса принадлежит соответствующему подтипу индекса, кроме пустых массивов, как пояснено в разд. 1. Подтипом индекса для данной позиции индекса по определению является подтип, указанный обозначением типа соответствующего определения подтипа индекса. Составной ограничитель < > (бокс) в определении подтипа индекса помещается для неопределенного диапазона (различные объекты данного типа не обязательно имеют одни и те же границы). Предвыполнение определения неограниченного индексируемого типа создает индексируемый тип: оно включает Предвыполнение указания подтипа компонент.
Определение ограниченного индексируемого типа определяет индексируемый тип и подтип этого типа:
• Индексируемый тип — это неявно описанный анонимный тип, этот тип определен (неявно) определением неограниченного индексируемого типа, в котором указание подтипа компонент берется из определения ограниченного индексируемого типа и обозначение типа каждого определения подтипа индекса определяется соответствующим дискретным диапазоном.
• Индексируемый подтип — это подтип, полученный наложением ограничения индекса на индексируемый тип.
Если определение ограниченного индексируемого типа дано для описания типа, то простое имя, введенное этим описанием, обозначает индексируемый подтип.
Предвыполнение определения ограниченного индексируемого типа создает соответствующий индексируемый тип и индексируемый подтип. При этом предвыполняются ограничение индекса и указание подтипа компонент. Вычисление каждого дискретного диапазона ограничения индекса и Предвыполнение указания подтипа компонент осуществляются в порядке, не определяемом языком.
Примеры описаний типа с определениями неограниченного индексируемого типа:
type VECTOR is array (INTEGER range <>) of REAL;
type MATRIX is array (INTEGER range <>, INTEGER range <>) of REAL;
type BIT_VECTOR is array (INTEGER range <>) of BOOLEAN;
type ROMAN is array (POSITIVE range 0) of ROMAN_DIGIT:
Примеры описаний типа с определениями ограниченного индексируемого типа:
type TABLE is array (1 .. 10) of INTEGER;
type SCHEDULE is array (DAY) of BOOLEAN;
type LINE is array (1 .. MAX_LINE_SIZE) of CHARACTER:
Примеры описаний объектов с определениями ограниченного индексируемого типа:
GRID : array (1 .. 80, 1 .. 100) of BOOLEAN;
MIX : array (COLOR range RED .. GREEN) of BOOLEAN;
PAGE : array (1 .. 50) of LINE; -- массив массивов
. Данное для одномерного массива правило означает, что описание с определением ограниченного индексируемого типа, например
type Т is array( POSITIVE range MIN .. MAX) of COMPONENT;
эквивалентно (при отсутствии некорректной зависимости от порядка) последовательности описаний:
subtype под тип__индексаis POSITIVE range MIN .. МАХ;
type индексируемый _ тип is array (подтип_индекса range <>) of COMPONENT;
subtype Т is индексируемый_тип (подтип _ индекса)',
где подтип - индекса и индексируемый-тип оба анонимны. Следовательно, Т — имя подтипа, и все объекты, описанные с этим обозначением типа, — массивы, имеющие одни и те же границы. Аналогичные преобразования применяются к многомерным массивам.
Подобное преобразование применяется к объекту, описание которого включает определение ограниченного индексируемого типа. Следствием этого является то, что нет двух таких объектов одного и того же типа.
Ссылки: анонимный тип 1, в некотором порядке 1.6, граница диапазона 3.5, диапазон 3.5, дискретный тип 3.5, имя 4.1, компонента 3.3, обозначение типа 2, объект 3.2, ограничение 3.3, описание типа 1, определение типа 3,3.1, подтип 3.3, Предвыполнение 3.1, 3.9, тип 3.3, указание подтипа 2.
1. ОГРАНИЧЕНИЯ ИНДЕКСА И ДИСКРЕТНЫЕ ДИАПАЗОНЫ
Ограничение индекса определяет диапазон возможных значений каждого индекса индексируемого типа и, таким образом, соответствующие границы массива.
Для дискретного диапазона, использованного в определении ограниченного индексируемого типа и определенного диапазоном, неявное преобразование к предопределенному типу INTEGER производится в том случае, если каждая граница — это либо числовой литерал, либо именованное число, либо атрибут, а тип обеих границ (до неявного преобразования) является универсальным-целым. В остальных случаях обе границы должны быть одного и того же дискретного типа, отличного от типа универсальный-целый', этот тип должен определяться независимо от контекста, но с учетом того, что тип должен быть дискретным и обе границы должны иметь один и тот же тип. Эти правила применимы также к дискретному диапазону, используемому в правиле итерации (см. 5.5) или в описании семейства входов (см. 9.5).
Если ограничение индекса следует за обозначением типа в указании подтипа, то тип и подтип, указанный обозначением типа, не должен содержать ограничение индекса. Обозначение типа должно указывать либо неограниченный индексируемый тип, либо ссылочный тип, указываемый тип которого — такой же индексируемый тип. В любом случае ограничение индекса должно задавать дискретный диапазон для каждого индекса индексируемого типа и тип каждого дискретного диапазона должен быть тем же самым, что и у соответствующего индекса.
Ограничение индекса совместимо с типом, указанным в обозначении типа, если и только если ограничение, определенное каждым дискретным диапазоном, совместимо с соответствующим подтипом индекса. Если какой-нибудь из дискретных диапазонов определяет пустой диапазон, то ограниченный таким образом массив является пустым массивом, не имеющим компонент. Значение массива удовлетворяет ограничению индекса, если в каждой позиции индекса значение массива и ограничение индекса имеют одни и те же границы индекса. (Заметим, однако, что присваивание и некоторые другие операции над массивами включают неявное преобразование подтипа.)
Границы каждого массива определены следующим образом:
• Для заданной описанием объекта переменной указание подтипа соответствующего описания объекта должно определять подтип ограниченного индексируемого типа (и, таким образом, границы). То же самое требуется от указания подтипа описания компоненты, если тип
компоненты записи — индексируемый тип, а также от указания подтипа компоненты определения индексируемого типа, если тип компонент массива является сам индексируемым типом.
• Для заданной описанием объекта константы индексируемого типа границы определены начальным значением, если подтип константы не ограничен; иначе они определены подтипом (в последнем случае начальное значение — это результат неявного преобразования подтипа). То же правило применимо к формальному параметру настройки вида in.
• Для указанного ссылочным значением массива границы должны быть определены генератором, создающим массив. (Созданный объект ограничен соответствующими значениями границ.)
• Для формального параметра подпрограммы или входа границы получены от соответствующего фактического параметра. (Формальный параметр ограничен соответствующими зна- ' чениями границ.)
• Для описания переименования и для формального параметра настройки вида in out границы берутся у переименованного объекта или у соответствующего фактического параметра настройки.
Порядок вычисления дискретных диапазонов при предвыполнении ограничения индекса в языке не определен.
Примеры описания массивов, включающих ограничения индексов:
BOARD : MATRIX(1 .. 8, 1 .. 8); -- СМ. 3.6 RECTANGLE : MATRIX(1 .. 20, 1 .. 30); INVERSE : MATRIX(1 .. N, 1 .. N); -- N не обязательно статическоеFILTER : BIT_VECTOR(0 .. 31);
Пример описания массива с ограниченным индексируемым подтипом:
MY_SCHEDULE : SCHEDULE; — все массивы типа SCHEDULE! имеют одни и те же границы Пример именуемого типа с компонентой индексируемого типа:
type VARLINE(LENGTH : INTEGER) is record IMAGE : STRING(1 .. LENGTH); end record;NULL_LINE : VAR_LINE(0); -- NULL_LINE.IMAGE пустой массив
. Предвыполнение указания подтипа, состоящего из обозначения типа, за которым следует ограничение индекса, контролирует совместимость ограничения индекса с обозначением типа (см. 2).
Все компоненты массива имеют один и тот же подтип. В частности, для массива компонент, которые являются одномерными массивами, это означает, что все компоненты имеют одни и те же границы и, следовательно, одинаковую длину.
Ссылки: вид 1, вход 9.5, выражение 4.4, генератор 4.8, граница диапазона 3.5, граница массива 3.6, диапазон 3.5, дискретный диапазон 3.6, имя 4.1, индекс 3.6, индексируемый тип 3.6, компонента записи 3.7, компонента массива 3.6, константа 1, начальное значение 1, неограниченный индексируемый тип 3.6, неограниченный подтип 3.3, обозначение типа 2, объект 3.2, ограничение индекса 1, ограниченный индексируемый подтип 3.6, описание компоненты 3.7, описание объекта 1, описание переименования 8.5, описание семейства входов 9.5, определение индексируемого типа 3.6, определение ограниченного индексируемого типа 3.6, определение ссылочного типа 3.8, параметр настройки 12.1, переменная 3.2, подпрограмма 6, подтип индекса 3.6, подтип ограниченного индексируемого типа 3.6, подтип результата 6.1, правило итерации 5.5, предопределенный тип С, преобразование 4.6, преобразование подтипа 4.6, пустой диапазон 3.5, совместимый 2, ссылочное значение 3.8, ссылочный тип 3.8, тип универсальный целый 3.5, удовлетворять 3.3, указание подтипа 2, указываемый тип 3.8, указывать 3.8, универсальный тип 4.10, фактический параметр 1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3, функция 6.5, целый литерал 2.4, целый тип 4.
2. ОПЕРАЦИИ НАД ИНДЕКСИРУЕМЫМИ ТИПАМИ
Базовые операции над индексируемым типом включают присваивание, агрегаты (если индексируемый тип не является лимитируемым личным типом), проверку принадлежности, индексируемые компоненты, квалификацию и явное преобразование; для одномерных массивов базовые операции включают также отрезки и строковые литералы, если тип компонент —• символьный тип.
Если А — объект, являющийся массивом, значением массива или подтипом ограниченного индексируемого типа, то базовые операции включают также атрибуты, которые перечислены ниже. Эти атрибуты недопустимы для неограниченного индексируемого типа. Аргумент N, использованный в обозначении атрибута для N-ro измерения массива, должен быть положительным статическим выражением типа универсальный-целый и не больше размерности массива.
A'FIRST | Вырабатывает нижнюю границу диапазона первого индекса. Значение этого атрибута имеет тот же тип, что и эта граница. |
A'FIRSTfN) | Вырабатывает значение нижней границы диапазона N-ro индекса. Значение этого атрибута имеет тот же тип, что и эта нижняя граница. |
A'LAST | Вырабатывает верхнюю границу диапазона первого индекса. Значение этого атрибута имеет тот же тип, что и эта верхняя граница. |
A'LAS^N) | Вырабатывает верхнюю границу диапазона М-го индекса. Значение этого атрибута имеет тот же тип, что и эта верхняя граница. |
A'RANGE | Вырабатывает диапазон первого индекса, т. е. диапазон A'FIRST.. A'LAST. |
A'RANGE(N) | Вырабатывает диапазон N-ro индекса, т. е. диапазон A'FIRST(N) . . A'LAST(N). |
A'LENGTH | Вырабатывает количество значений в диапазоне первого индекса (нуль для пустого диапазона). Значение этого атрибута имеет тип универсальный-целый. |
A'LENGTH(N) | Вырабатывает количество значений в диапазоне N-ro индекса (нуль для пустого диапазона). Значение этого атрибута имеет тип универсальный-целый. |
Кроме того, для индексируемого типа или подтипа Т определены атрибуты Т'ВАSЕ и T'SIZE (см. 3), а для массива А определены атрибуты A'SIZE и A'ADDRESS (см. 2).
Кроме базовых в состав операций над индексируемым типом входят предопределенные операции сравнения на равенство или неравенство, если индексируемый тип не является лимитируемым типом. Для одномерных массивов к этим операциям относится катенация, если индексируемый тип не является лимитируемым типом; если тип компоненты — дискретный тип, то операции включают также все предопределенные операции отношения; если тип компоненты — логический тип, то операции также включают унарную логическую операцию отрицания и логические операции.
Примеры (использующие массивы, описанные в примерах раздела 1):
-- FILTER'FIRST = 0 FILTER'LAST = 31 FILTER'LENGTH == 32 -- RECTANGLE'LAST(1) = 20 RECTANGLE'LAST(2) = 30
. Атрибуты A'FIRST и A'FIRST(1) вырабатывают одно и то же значение. То же можно сказать об атрибутах A'LAST, A'RANGE и A'LENGTH. Для приведенных атрибутовудовлетворяются следующие соотношения (исключая пустой массив) если тип индекса — целый тип:
A'LENGTH = A'LAST - A'FIRST + 1 A'LENGTH(N) = A'LAST(N) - A'FIRST(N) + 1
Индексируемый тип — лимитируемый, если тип его компонент — лимитируемый (см. 4).
Ссылки: агрегат 4.3, атрибут 4, базовая операция 3, граница диапазона 3.5, индекс 3.6, индексированная компонента 1, индексируемый тип 3.6, квалифицированное выражение 4.7, лимитируемый тип 4, логическая операция 4.5, 4.5,1, неограниченный индексируемый тип 3.6, обозначение 6.1, объект 3.2, ограниченный индексируемый тип 3.6, операция кате-нации 4.5, 2, операция отношения 4.5, 2, операция отрицания 4.5, 6, отрезок 2, подкомпонента 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, пустой диапазон 3.5, размерность 3.6, символьный тип 2, статическое выражение 4.9, строковый литерал 2.6, тип 3.3, универсальный тип 4.10, универсальный целый тип 4.
3. СТРОКОВЫЙ ТИП
Значения предопределенного типа STRING — это одномерные массивы компонент предопределенного типа CHARACTER, индексируемые значениями предопределенного подтипа POSITIVE:
subtype POSITIVE is INTEGER range 1 .. INTEGER'LAST;
type STRING is array (POSITIVE range 0) of CHARACTER;
Объекты и именованные числа
Объект — это понятие языка; объект имеет (содержит) значение данного типа. Объектом может быть:
• объект, объявленный в описании объекта или в описании одиночной задачи;
• формальный параметр подпрограммы, входа или настраиваемой подпрограммы;
• формальный объект настройки;
• параметр цикла;
• объект, указанный значением ссылочного типа;
• компонента или отрезок другого объекта.
Описание числа — это специальная форма описания объекта, которая связывает идентификатор со значением типа универсальный-целый или универсальный-вещественный.
описание-объекта ::= список-идентификаторов : [constant] указание-подтипа [:= выражение]; список-идентификаторов : [constant] определение-ограниченного-индексируемого-типа [:= выражение];описание-числа ::= список-идентификаторов : constant := универсальное-статическое-выражение; список-идентификаторов ::= идентификатор {, идентификатор}
Описание объекта называется единичным описанием объекта, если список его идентификаторов имеет единственный идентификатор; оно называется групповым описанием объектов, если его список имеет два или несколько идентификаторов. Групповое описание объектов эквивалентно последовательности соответствующего числа единичных описаний объектов. Для каждого идентификатора из списка в такой эквивалентной последовательности единичное описание объекта формируется из идентификатора, двоеточия и всего того, что стоит справа от двоеточия в групповом описании объекта; описания в эквивалентной последовательности идут в том же порядке, что и список идентификаторов.
Аналогичная эквивалентность имеет место также для списка идентификаторов описания числа, описаний компонент, спецификаций дискриминантов, спецификаций параметров и описаний параметров настройки, исключений и субконстант.
В остальной части описания языка все пояснения даны для описаний с единственным идентификатором; соответствующие пояснения для описаний с несколькими идентификаторами следуют из эквивалентности, установленной выше.
В языке определены понятия, объявляемые
В языке определены понятия, объявляемые явно или неявно описаниями. К таким понятиям относятся, например: числовой литерал, объект, дискриминант, компонента записи, параметр цикла, исключение, тип, подтип, подпрограмма, пакет, задачный модуль, настраиваемый модуль, одиночный вход, семейство входов, формальный параметр (подпрограммы, входа, настраиваемой подпрограммы), формальный параметр настройки, именованный блок или цикл, помеченный оператор, а также операция (в частности, атрибут или литерал перечисления, см. 3).
Существует, несколько форм описаний. Основное описание — это форма описания, определенная следующим образом:
основное-описание ::= описание-объекта | описание-числа | описание-типа | описание-подтипа | описание-подпрограммы | описание-пакета | описание-задачи | описание-настройки | описание-исключения | конкретизация-настройки | описание-переименования | описание-субконстанты
Некоторые формы описания всегда являются (явно) частью основного описания, а именно:спецификация дискриминантов, описание компонент, описание входов, спецификация параметров, описание параметров настройки и спецификации литералов перечисления. Спецификация параметра цикла — это конструкция, которая входит только в некоторые формы оператора цикла.
Остальные формы описания являются неявными: имя блока, имя цикла и метка оператора. Некоторые операции описываются неявно (см. 3).
Для каждой формы описания правила языка определяют некоторый участок текста, называемый областью действия описания (см. 8.2). Несколько форм описания связывают идентификатор с описанным понятием. Внутри его области действия, и только в ней, существуют места, где возможно использование идентификатора для связи его с описанным понятием;эти места определяются правилами видимости (см. ). В таких местах идентификатор называют именем понятия (простым именем); говорят, что имя обозначает связанное с ним понятие.
Определенные формы спецификации литерала перечисления связывают символьный литерал с соответствующим описываемым понятием. Некоторые формы описаний связывают символ операции или другие обозначения с явно или неявно описанной операцией.
Процесс, в результате которого описание вступает в силу, называется предвыполнением описания; этот процесс протекает во время выполнения программы.
Говорят, что после своего предвыполнения описание становится предвыполненным. До завершения своего предвыполнения (как и до его начала) описание считается еще не предвы-полненным. Предвыполнение любого описания дает всегда по крайней мере один эффект:описание из еще не предвыполненного становится предвыполненным. Фраза Предвыполнение не дает другого эффекта используется тогда, когда происходит только изменение статуса описания. Процесс предвыполнения определяется также для разделов описаний, элементов описания и компилируемых модулей (см. 3.9 и 10.5).
Описания объекта, числа, типа и подтипа даны в этой главе. Остальные основные описания изложены в последующих главах.
. Синтаксические правила используют термин идентификатор для первого вхождения идентификатора в некоторую форму описания; термин простое имя используется для любого вхождения идентификатора, который уже обозначает какое-либо описанное понятие.
Ссылки: атрибут 4, видимость 8.3, знак операции 6.1, идентификатор 2.3, имя 4.1, имя блока 5.6, имя цикла 5.5, компонента записи 3.7, конкретизация настройки 12.3, метка 5.1, область действия 8.2, оператор блока 5.6, оператор цикла 5.5, операция типа 3.3, описание входа 9.5, описание задачи 9.1, описание исключения 11.1, описание компоненты 3.7, описание настройки 12.1, описание объекта 1, описание пакета 7.1, описание параметра настройки 12.1, описание переименования 8.5, описание подпрограммы 6.1, описание подтипа 2, описание субконстанты 7.4, 3.9, описание типа 1, описание числа 2, Предвыполнение 3.9, простое имя 4.1, раздел описаний 3.9, символьный литерал 2.5, спецификатор представления 13.1, спецификация дискриминанта 1, спецификация литерала перечисления 1, спецификация параметра 6.1, спецификация параметра цикла 5.5, тело подпрограммы 6.3, числовой литерал 2.4, элемент описания
subtype SMAL_IINT is INTEGER range
type PAGE_NUM is range 1 .. 2_000; type LINE_SIZE is range 1 .. MAX_LINE_SIZE; subtype SMAL_IINT is INTEGER range -10 .. 10; subtype COLUMN_PTR is LINESIZE range 1 .. 10: subtype BUFFER_SIZE is INTEGER range 0 .. МАХ;
. Имя в описании целого типа — это имя подтипа. С другой стороны, предопределенные операции над целым типом определяют результат, который принадлежит диапазону, определяемому родительским предопределенным типом; такой результат не обязательно принадлежит описанному подтипу, и попытка присвоить такой результат переменной целого подтипа возбуждает исключение CONSTRAINT_ERROR. Наименьшее (наибольшее по модулю отрицательное) значение, поддержанное реализацией для предопределенных целых типов, есть именованное число SYSTEM.MIN_INT, а наибольшее (из положительных) значение — SYSTEM.MAX_INT (см. 13.7).
Ссылки: анонимный тип 1, граница диапазона 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, исключение NUMERIC-ERROR 11.1, литерал 4.2, ограничение диапазона 3.5, описание подтипа 2, описание типа 1, определение типа 1, предопределенная операция 4.5, предопределенный пакет системы 13.7, преобразование 4.6, принадлежит подтипу 3.3, родительский тип 3.4, статическое выражение 4.9, тип 3.3, универсальный тип 4.10, целый литерал
5. ОПЕРАЦИИ НАД ДИСКРЕТНЫМИ ТИПАМИ
Базовые операции над дискретными типами включают присваивание, проверку на принадлежность и квалификацию; для логических типов — управление с промежуточной проверкой;для целого типа — явное преобразование значений других числовых типов к целому типу и неявное преобразование значения типа универсальный-целый к значению заданного типа.
Для каждого дискретного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом перечислении Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений для Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. Эта группа включает атрибут ВАЗЕ (см. 3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 2) и атрибут WIDTH, определенный следующим образом:
T'WIDTH | Вырабатывает максимальную длину образа по всем значениям подтипа Т {образ — это последовательность символов, вырабатываемая атрибутом IMAGE, см. ниже). Вырабатывает нуль для пустого диапазона. Значения этого атрибута имеют тип универсальный-целый. |
Т'РОS | Параметр Х должен быть значением базового типа Т. Тип результата — универсальный-целый. Результат — номер позиции для значения параметра. |
T'VAL | Параметр Х может быть любого целого типа. Тип результата — базовый тип Т. По заданному значению Х — номеру позиции — функция вырабатывает значение в этой позиции. Если соответствующее Х — универсальное-целое значение — не принадлежит диапазону T'POS(T'BASE'FIRST). .T'POS(T'BASE'LAST), то возбуждается исключение CONSTRAINT_ERROR. |
T'SUCC | Параметр X должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу большим номера позиции для значения X. Если Х равен T'BASE'LAST, то возбуждается исключениеCONSTRAINT_ERROR. |
T'PRED | Параметр Х должен быть значением базового типа Т. Тип результата — базовый тип Т. Результат — значение с номером позиции, на единицу меньшим номера позиции для значения X. Если Х равно T'BASE'FIRST, то возбуждается исключение CONSTRAINT - ERROR. |
T'IMAGE | Параметр Х должен быть значением базового типа Т. Тип результата — предопределенный тип STRING. Результат — образ значения X, т.е. последовательность символов, представляющих изображение значения. Образу целого значения соответствует десятичный литерал без подчеркиваний, предшествующих нулей, порядка и пробелов справа, но с одним символом минус или пробелом слева. Нижняя граница образа есть единица. Образ литерала перечисления — это либо соответствующий идентификатор из прописных букв, либо соответствующий символьный литерал (включая два апострофа); пробелы не включаются ни слева, ни справа. Образ символа С, отличного от графического символа, зависит от реализации; должно выполняться равенство СНАRАСТЕR'VАLUЕ(СНАRАСТЕR'IМАGЕ(С))=С. |
T'VALUE | Параметр Х должен быть значением предопределенного типа STRING. Тип результата — базовый тип Т. Игнорируются любые пробелы слева и справа от последовательности символов, соответствующих параметру. Если для перечислимого типа последовательность символов имеет синтаксис литерала перечисления и если этот литерал существует для базового типа Т, то результат — соответствующее значение перечислимого типа. Если для целого типа последовательность символов имеет синтаксис целого литерала с возможным знаком минус или плюс слева и если существует соответствующее значение базового типа Т, то результат есть это значение. Во всех остальных случаях возбуждается исключение CONSTRAINT_ERROR. |
Кроме того, для объекта А дискретного типа определены атрибуты A'SIZE и A'ADDRESS(см. 2).
Кроме базовых операции над дискретными типами включают предопределенные операции отношения. Для перечислимых типов операции включают литералы перечисления. Для логических типов операции включают предопределенную унарную логическую операцию отрицания not и предопределенные логические операции. Для целых типов операции включают предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, все мультипликативные операции, унарную операцию abs и операцию возведения встепень.
Операции над подтипом — это операции над его базовым типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования типа и атрибутов первой группы; результат каждой из этих операций зависит от подтипа (присваивание, проверка принадлежности, квалификация и преобразование включают проверку подтипа; атрибуты первой группы вырабатывают характеристику подтипа).
. Для подтипа дискретного типа переданные атрибутами SUCC, PRED, VAL и VALUE результаты не обязательно принадлежат подтипу; аналогично фактические параметры атрибутов POS, SUCC, PRED и IMAGE не обязаны принадлежать подтипу. Эти атрибуты удовлетворяют (при отсутствии исключения) следующим соотношениям:
T'POS(T'SUCC(X)) = T'POSfX) + 1 T'POS(T'PRED(X)) = T'POS(X) - 1T'VAL(T'POS(X)) = X T'POS(T'VAL(N)) = NПримеры: -- для типов и подтипов, описанных в 1-- COLOR'FIRST = WHITE, COLOR'LAST = BLACK -- RAINBOW'FIRST = RED, RAINBOW'LAST = BLUE-- COLOR'SUCC(BLUE) = RAINBOW'SUCC(BLUE) = BROWN -- COLOR'POS(BLUE) = RAINBOW'POS(BLUE) = 4 -- COLOR'VAL(O) = RAINBOW'VAL(O) = WHITE
Ссылки: атрибут 4, базовая операция 3, базовый тип 3.3, бинарная аддитивная операция 4.5, 3, граница диапазона 3.5, графический символ 2.1, дискретный тип 3.5, идентификатор 2.3, исключение CONSTRAINT_ERROR 11.1, квалифицированное выражение 4.7, литерал перечисления 1, логическая операция 4.5, 1, логический тип 3, мультипликативная операция 4.5, 5, номер позиции 3.5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 6, операция отношения 4.5, 2, операция отрицания 4.5, 6, операция управления с промежуточной проверкой 4.5, 1, подтип 3.3, предопределенная операция 4.5, предопределенный тип С, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, символьный литерал 2.5, строковый тип 3, тип 3.3, тип универсальный целый 4, унарная аддитивная операция 4.5, 4, универсальный тип 4.10, функция 6.5, целый тип 4, числовой литерал 2.4, числовой тип
6. ВЕЩЕСТВЕННЫЕ ТИПЫ
Вещественные типы обеспечивают приближение вещественных чисел с относительной погрешностью для плавающих типов и с абсолютной погрешностью для фиксированных типов.
определение-вещественного-типа :: =
ограничение - плавающего - типа [ограничение - фиксированного - типа
С каждым вещественным типом связан набор чисел, называемых модельными числами. Границы ошибок в предопределенных операциях даны в терминах модельных чисел. Реализация типа должна включать по крайней мере эти модельные числа и представлять их точно.
С каждым вещественным типом связан зависящий от реализации набор чисел, называемых хранимыми числами. Набор хранимых чисел вещественного типа должен включать по крайней мере набор модельных чисел типа. Допустимо, чтобы диапазон хранимых чисел был больше диапазона модельных чисел, но границы ошибок предопределенных операций над хранимыми числами определены теми же правилами, что и для модельных чисел. Хранимые числа по этой причине обеспечивают гарантированные границы ошибок для операций над зависящим от реализации диапазоном чисел; напротив, диапазон модельных чисел зависит только от определения вещественного типа и поэтому не зависит от реализации.
Вещественные литералы — это литералы анонимного предопределенного вещественного типа, называемого в этом руководстве универсальным-вещественным. Другие вещественные типы не имеют литералов. Для каждого вещественного типа существует неявное преобразование, которое преобразует универсальное-вещественное значение в значение этого вещественного типа. Условия, в которых вызываются эти преобразования, описаны в разд. Если универсальное-вещественное значение — хранимое число, то неявное преобразование вырабатывает соответствующее значение; если оно принадлежит диапазону хранимых чисел, но не является хранимым числом, то преобразуемое значение может быть любым значением в диапазоне, определенном ближайшими хранимыми предыдущим и последующим числами универсального-вещественного значения.
Выполнение операции типа вырабатывает значение вещественного типа и может возбудить исключение NUMERIC_ERROR, как поясняется в разд. 7, если она не может вырабатывать корректный результат (т.е. соответствующее одному из возможных математических результатов значение не принадлежит диапазону хранимых чисел); в частности, это исключение может быть возбуждено неявным преобразованием. Однако от реализации не требуется возбуждать исключение NUMERIC_ERROR, если операция — часть большего выражения, которое может быть корректно вычислено (см. 11.6).
Предвыполнение определения вещественного типа включает предвыполнение ограничения плавающего или фиксированного типа и создает вещественный тип.
. Алгоритм, использующий только минимальные свойства чисел, которые гарантированы определением типа для модельных чисел, будет переносимым без каких-либо предосторожностей.
Ссылки: вещественный литерал 2.4, исключение NUMERIC_ERROR 11.1, литерал 4.2, ограничение плавающего типа 7, ограничение фиксированного типа 3.5,7, определение типа 1, предопределенная операция 3, предвыполнение 3.9, преобразование 4.6, тип 3.3, универсальный тип 4.10.
7. ПЛАВАЮЩИЕ ТИПЫ
Для плавающих типов граница ошибки определяется заданием относительной погрешности в виде требуемого минимального числа значащих десятичных цифр.
ограничение-плавающего-типа ::=
определение - точности - плавающего - типа [ограничение - диапазона] определение - точности - плавающего - типа:: = digits статическое- простое - выражение
Минимальное число значащих десятичных цифр определяется значением статического простого выражения в определении точности плавающего типа. Это значение должно быть некоторым целым типом и должно быть положительным (ненулевым); в дальнейшем оно обозначено буквой D. Если ограничение плавающего типа использовано как определение вещественного типа и включает ограничение диапазона, то каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но две границы не обязаны иметь один и тот же вещественный тип.
Для данного основания определена следующая каноническая форма отличного от нуля модельного числа плавающего типа:
знак *мантисса *(основание**порядок)
В этой форме: знак — либо +1, либо -1; мантисса выражена в системе счисления, заданной основанием; порядок — целое число (возможно, отрицательное), такое, что целая часть мантиссы равна нулю, а первая цифра ее дробной части не равна нулю.
Число D — минимальное требуемое число десятичных цифр после точки в десятичной мантиссе (т.е.' если основание равно десяти). Значение D в свою очередь определяет число В — минимальное требуемое число двоичных цифр после точки в двоичной мантиссе (т.е. если основание равно двум). Число В связано с D и равно такому минимальному значению, что относительная точность двоичной формы не меньше точности для десятичной формы. (Число В равно ближайшему целому, превышающему (D*log(10)/log(2)) +1.)
Модельные числа, заданные определением точности плавающего типа, включают нуль и все числа, у которых двоичная каноническая форма имеет точно В цифр после точки в мантиссе и порядок в диапазоне -4*В.. +4*В. Гарантированная минимальная точность операций над плавающим типом определена в терминах его модельных чисел с ограничением плавающего типа, которое формирует соответствующее определение вещественного типа (см. 7).
Предопределенные плавающие типы включают тип FLOAT. Реализация может иметь также предопределенные типы SHORT_FLOAT и LONG_FLOAT с точностью (существенно) меньшей и большей соответственно, чем у FLOAT. Базовым типом каждого предопределенного плавающего типа является он сам. Модельные числа каждого предопределенного плавающего типа определены числом D десятичных цифр, вырабатываемых атрибутом DIQITS (см. 8).
Для каждого предопределенного плавающего типа (а следовательно, и для каждого производного от него типа) набор хранимых чисел определен следующим образом. Хранимые числа имеют то же самое число цифр В мантиссы, что и модельные числа типа, а порядок — в диапазоне -Е.. +Е, где Е зависит от реализации и равно по крайней мере 4*В для модельных чисел. (Следовательно, хранимые числа включают модельные числа.) Правила определения точности операций над модельными и хранимыми числами Даны в разд. 7. Хранимые числа подтипа те же, что и для его базового типа.
Описание плавающего типа, представленное в одной из двух форм (т.е. с возможным ограничением диапазона, обозначенным квадратными скобками, или без него):
type Т is digits D [range L .. R];
по определению эквивалентно следующим описаниям:
type плавающий - тип is new предопределенный-плавающий-тип; subtype T is плавающий-тип digits D [range плавающий-тип (L). .плавающий -тип (R)];
где плавающий-тип является анонимным, а предопределенный плавающий тип неявно выбран реализацией так, что его модельные числа определяются значением D; кроме того, если добавлен диапазон L.-R, то L и R должны принадлежать диапазону хранимых чисел. Описание плавающего типа неправильно, если ни один из предопределенных плавающих типов не удовлетворяет этим требованиям, кроме типа универсальный-вещественный. Максимальное число цифр, которое может быть задано определением точности плавающего типа, определяется именованным числом SYSTEM.MAX_DIGITS (см. 1).
Предвыполнение описания плавающего типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение плавающего типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать плавающий тип или подтип. Ограничение плавающего типа совместимо с обозначением типа, только если число D в определении точности плавающего типа не больше соответствующего числа D для типа или подтипа в обозначении типа. Кроме того, если ограничение плавающего типа включает ограничение диапазона, то ограничение плавающего типа совместимо с обозначением типа, только если ограничение диапазона совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает подтип плавающего типа, модельные числа которого определены соответствующим определением точности плавающего типа. Значение плавающего типа принадлежит плавающему подтипу тогда у только тогда, когда оно принадлежит диапазону подтипа.
Одни и те же арифметические операции предопределены для всех плавающих типов (см. 4.5).
. Ограничение диапазона допустимо в указании плавающего подтипа непосредственно после обозначения типа либо как часть ограничения плавающего типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 35). Наложение ограничения плавающего типа на обозначение типа в указании подтипа не может уменьшить допустимый диапазон значений, если оно не включает ограничение диапазона (диапазон модельных чисел, которые соответствуют заданному числу цифр, может быть меньше, чем диапазон чисел обозначения типа). Принадлежащее плавающему подтипу значение не обязательно является модельным числом подтипа.
type COEFFICIENT is digits 10
type COEFFICIENT is digits 10 range -1.0 .. 1.0;type REAL is digits 8; type MASS is digits 7 range 0.0 .. 1.0Е35;subtype SHORTCOEFF is COEFFICIENT digits 5; -- подтип с меньшей точностью subtype PROBABILITY is REAL range 0.0 .. 1.0; -- подтип с меньшим диапазоном
к примерам. Реализованная точность для типа COEFFICIENT — это точность предопределенного типа, имеющего по меньшей мере 10 цифр мантиссы. Следовательно, спецификация пяти цифр точности для подтипа SHORT_COEFF допустима. Наибольшее модельное число для типа MASS равно приблизительно 1.ОЕ21 и, следовательно, меньше, чем заданная верхняя граница, (1.0Е35). Следовательно, описание этого типа правильно, только если эта верхняя граница принадлежит диапазону хранимых чисел предопределенного плавающего типа, имеющего по меньшей мере 7 цифр точности.
Ссылки: анонимный тип 1, арифметическая операция 5, 4.5, вещественный тип 6, граница диапазона 3.5, граница ошибки 6, литерал с основанием 2, модельное число 6, обозначение типа 2, ограничение диапазона 3.5, операция , описание подтипа 2, описание типа 3,3.1, определение вещественного типа 6, принадлежит подтипу 3.3, подтип 3.3, порядок 1, Предвыполнение 3.1, 3.9, предопределенная операция 4.5, предопределенный тип С, производный тип 3.4, простое выражение 4.4, совместимый 2, статическое выражение 4.9, тип 3.3, указание подтипа 2, хранимое число 6, целый тип 4, цифра
8. ОПЕРАЦИИ НАД ПЛАВАЮЩИМИ ТИПАМИ
Базовые операции над плавающим типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого плавающего типа и неявное преобразование значений типа универсальный-вещественный в значения этого типа.
Кроме того, для каждого плавающего типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом представлении Т — это подтип (подтип Т) для любого свойства, зависящего от наложенных на Т ограничений; другие свойства формулируются через базовый тип Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К атрибутам этой группы относятся атрибут ВАSЕ (см. 3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 2), а также следующие атрибуты:
T'DIGITS | Вырабатывает число десятичных цифр в десятичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число D, см. разд. 7.) Значение этого атрибута имеет тип универсальный-целый. |
T'MANTISSA | Вырабатывает число двоичных цифр в двоичной мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. разд. 7.) Значение этого атрибута имеет тип универсальный-целый. |
T'EPSILON | Вырабатывает абсолютное значение разности между модельным числом 1.0 и следующим модельным числом подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'EMAX | Вырабатывает наибольшее значение порядка двоичной канонической формы модельных чисел подтипа Т. (Этот атрибут вырабатывает произведение 4*В, см. разд. 7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL | Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE | Вырабатывает наибольшее положительное модельное - число подтипа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
Атрибуты второй группы вырабатывают характеристики хранимых чисел и включают следующие атрибуты:
T'SAFE-EMAX | Вырабатывает наибольшее значение порядка двоичной канонической формы хранимых чисел базового типа Т. (Этот атрибут вырабатывает число Е, см. разд. 7.) Значение этого атрибута имеет тип универсальный-целый. |
T'SAFE-SMALL | Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип унивеосальный- вещественный. |
T'SAFE_LARGE | Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный - вещественный. |
Кроме этого, для объекта А плавающего типа определены атрибуты A'SIZE и A'ADDRESS (см. 2). Для каждого плавающего типа существуют машинно-зависимые атрибуты, которые не относятся к модельным и хранимым числам. Они соответсвуют обозначениям атрибутовMACHINE_EMAX, MACHINE_EMIN, MACHINE_RADIX, MACHINE_MANTISSA,
MACHINE_ROUNDS и MACHINE_OVERFLOWS (см. 3).
Кроме базовых операций над плавающим типом определены операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции » и /, унарная операция abc и операция возведения в степень.
Операции над подтипом соответствуют операциям над типом, кроме следующих: присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результаты этих операций переопределены в терминах подтипа.
. Атрибуты ЕМАХ, SMALL, LARGE и EPSILON связаны с атрибутом MANTISSA следующими формулами:
Т'ЕМАХ = 4*T'MANTISSA
T'EPSILON = 2.0**(1 - T'MANTISSA)
T'SMALL = 2.0**(-Т'ЕМАХ - 1)
T'LARGE = 2.0**Т'ЕМАХ * (1.0 - 2.0**(-T'MANTISSA))
Атрибут MANTISSA, дающий число двоичных цифр в мантиссе, сам связан с атрибутом DIGITS.
Между характеристиками модельных и хранимых чисел справедливы следующие соотношения:
T'BASE_EMAX <= T'SAFE_EMAX T'BASE_SMALL >= T'SAFE_SMALL T'BASE_LARGE <= T'SAFE_LARGE
Атрибуты T'FIRST и T'LAST не обязательно вырабатывают модельные или хранимые числа. Если некоторое число цифр определено описанием типа или подтипа Т, то атрибут DIGITS вырабатывает это число.
Ссылки: арифметическая операция 5, 4.5, атрибут 4, базовая операция 3, базовый тип 3.3, бинарная аддитивная операция 4.5, 3, границы диапазона 3.5, квалифицированное выражение 4.7, модельное число 6, мультипликативная операция 4.5, 5, объект 3.2, ограничение 3.3, операция 3.3, операция возведения в степень 4.5, 6, операция отношения 4.5, 2, плавающий тип 7, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, тип 3.3, тип универсальный вещественный 6, тип универсальный целый 4, унарная аддитивная операция 4.5, 4, универсальный тип 4.10, хранимое число 6, цифра 2.1, числовой тип
9. ФИКСИРОВАННЫЕ ТИПЫ
Для фиксированных типов граница ошибки определяется абсолютной погрешностью, называемой дельтой фиксированного типа.
ограничение-фиксированного-типа :: =
определение - точности - фиксированного - типа [ограничение - диапазона]
определение - точности - фиксированного - типа:: = delta статическое- простое - выражение
Дельта определяется значением статического простого выражения в определении точности фиксированного типа. Это значение должно принадлежать некоторому вещественному типу и быть положительным (ненулевым). Если ограничение для фиксированного типа использовано как опеределение вещественного типа, то оно должно включать ограничение диапазона;каждая граница диапазона должна быть определена статическим выражением некоторого вещественного типа, но эти две границы не обязаны иметь один и тот же тип. Если ограничениедля фиксированного типа использовано в указании подтипа, то ограничение диапазона необязательно.
Для любого ненулевого модельного числа фиксированного типа определена каноническая форма. В этой форме: знак — это либо +1, либо -1; мантисса — положительное (ненулевое) целое; любое модельное число кратно некоторому положительному вещественному числу, называемому дискретом, определенному следующим образом:
знак*мантисса*дискрет
Для модельных чисел фиксированного типа дискрет выбран как наибольшая степень двух, которая не превышает дельту определения точности фиксированного типа. Дискрет можно также задать спецификатором длины (см. 13.2), в этом случае модельные числа кратны заданному значению. Гарантированная минимальная точность операций над фиксированным типом определена в терминах модельных чисел из ограничения для фиксированного типа, которое образует соответствующее определение вещественного типа (см. 7).
Для ограничения фиксированного типа с ограничением диапазона модельные числа включают нуль и все числа, кратные дискрету, мантисса которых может быть выражена точно В двоичными цифрами, а значение В выбрано как наименьшее целое число, для которого каждая граница заданного диапазона — либо модельное число, либо отличается не более чем на дискрет от модельного числа. Если ограничение для фиксированного типа не включает ограничение диапазона (это допустимо только после обозначения типа в указании подтипа), модельные числа определены дельтой определения точности фиксированного типа и диапазоном подтипа, заданного обозначением типа.
Реализация должна иметь по крайней мере один анонимный предопределенный фиксированный тип. Базовый тип каждого такого фиксированного типа — это сам этот тип. Модельные числа каждого предопределенного фиксированного типа включают нуль и все числа, для которых мантисса (в канонической форме) имеет число двоичных цифр, вырабатываемое атрибутом MANTISSA, и для которых дискрет имеет значение, возвращаемое атрибутом SMALL
Описание фиксированного типа в форме
type T is delta D range L .. R
по определению эквивалентно следующим описаниям:
type фиксированный-тип is new
предопределенный - фиксированный - тип;
subtype T is фиксированный-тип delta D range
фиксированный-тип (L) .. фиксированный-тип (R);
В этих описаниях фиксированный-тип — это анонимный тип, а предопределенный фиксированный тип неявно выбран реализацией так, чтобы его модельные числа включали описанные ограничением для фиксированного типа модельные числа (т. е. с помощью D, L и R, а возможно и спецификатора длины, определяющего дискрет).
Описание фиксированного типа неправильно, если не существует предопределенного типа, удовлетворяющего этим требованиям. Хранимые числа фиксированного типа — это модельные числа его базового типа.
Предвыполнение описания фиксированного типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Если ограничение для фиксированного типа следует за обозначением типа в указании подтипа, то обозначение типа должно задавать фиксированный тип или подтип. Ограничение для фиксированного типа совместимо с обозначением типа, только если дельта из определения точности фиксированного типа не меньше дельты для типа или подтипа, заданного обозначением типа. Более того, если ограничение для фиксированного типа включает ограничение диапазона, то ограничение для фиксированного типа совместимо с обозначением типа, только если само ограничение совместимо с обозначением типа.
Предвыполнение такого указания подтипа включает Предвыполнение ограничения диапазона, если оно есть; оно создает фиксированный подтип, модельные числа которого определены соответствующим ограничением для фиксированного типа, а также спецификатором длины, задающим дискрет, если он есть. Значение фиксированного типа принадлежит фиксированному подтипу тогда и только тогда, когда оно принадлежит диапазону, определенному подтипом.
Для всех фиксированных типов предопределены одни и те же арифметические операции (см. 4.5). Умножение и деление значений фиксированного типа дают результаты анонимного предопределенного фиксированного типа, который в данном стандарте называется универсальный-фиксированный; точность этого типа произвольна. Значения этого типа должны быть явно преобразованы в значения некоторого числового типа.
. Если S — подтип фиксированного типа или подтипа Т, то набор модельных чисел S — это подмножество модельных чисел Т. Если для Т был задан спецификатор длины, то Т и S имеют одно и то же значение дискрета. В противном случае поскольку дискрет равен степени двух, то дискрет для S равен дискрету для Т, умноженному на неотрицательную степень двух.
Ограничение диапазона допустимо в указании фиксированного подтипа либо непосредственно за обозначением типа, либо как часть ограничения для фиксированного типа. В обоих случаях границы диапазона должны принадлежать базовому типу обозначения типа (см. 3.5).
subtype ROUGH_VOLTAGE is VOLT delta
type VOLT is delta 0.125 range 0.0 .. 255.0; subtype ROUGH_VOLTAGE is VOLT delta 1.0; — диапазон, как у VOLT-- Правильная дробь, требующая полного машинного слова в -- дополнительном коде, может быть описана как тип FRACTION:DEL : constant := 1.0/2**(WORD_LENGTH - 1); type FRACTION is delta DEL range -1.0 .. 1.0 - DEL;
Ссылки: анонимный тип 1, арифметическая операция 5, 4.5, базовый тип 3.3, вещественный тип 6, граница диапазона 3.5, граница ошибки 6, модельное число 6, обозначение типа 2, ограничение диапазона 3.5, операция 3.3, описание подтипа 2, описание типа 1, определение вещественного типа 6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, принадлежит подтипу 3.3, простое выражение 4.4, совместимо 2, спецификатор длины 13.2, статическое выражение 4.9, тип 3.3, указание подтипа 2, хранимое число 6, числовой тип 3.
10. ОПЕРАЦИИ НАД ФИКСИРОВАННЫМИ ТИПАМИ
Базовые операции над фиксированным типом включают присваивание, проверку принадлежности, квалификацию, явное преобразование значений других числовых типов в значения этого фиксированного типа и неявное преобразование значений типа универсальный-вещественный в значение этого типа.
Кроме того, для каждого фиксированного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом представлении атрибутов Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений, наложенных Т; другие свойства установлены в терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. К этой группе относятся атрибуты ВАЗЕ (см. 3), FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 2) и следующие атрибуты:
T'DELTA | Вырабатывает значение дельты, заданной в определении точности фиксированного типа для подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'MANTISSA | Вырабатывает число двоичных цифр в мантиссе модельных чисел подтипа Т. (Этот атрибут вырабатывает число В, см. 9.) Значение этого атрибута имеет тип универсальный-целый. |
T'SMALL | Вырабатывает наименьшее положительное (ненулевое) модельное число подтипа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'LARGE | Вырабатывает наибольшее модельное число подтипа Т. Значение этого атрибута имеет тип универсальный,вещественный. |
T'FORE | Вырабатывает минимальное число символов, необходимых для десятичного представления целой части любого значения подтипа Т в предположении, что это представление не включает порядок, но включает один символ, который является либо знаком минус, либо пробелом. (Это минимальное число не учитывает предшествующие нули и подчеркивания и по меньшей мере равно двум.) Значение этого атрибута имеет тип универсальный-целый. |
T'AFT | Вырабатывает число десятичных цифр после точки, необходимых для обеспечения точности подтипа Т, если только DELTA подтипа Т не превышает 0.1, а для этого значения атрибут вырабатывает значение единицы. (T'AFT — это самое малое положительное целое К, для которого (10«*К)*Т'ОЕ1ТА больше или равно единице.) Значение этого атрибута имеет тип универсальный_целый. |
T'SAFE_SMALL | Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный-вещественный. |
T'SAFE_LARGE | Вырабатывает наибольшее положительное хранимое число базового типа Т. Значение этого атрибута имеет тип универсальный- вещественный. |
Кроме того, для объекта А фиксированного типа определены атрибуты A'SIZE и A'ADDRESS (см. 2). Для каждого фиксированного типа или подтипа Т существуют машинно-зависимые атрибуты T'MACHINE_ROUNDS и T'MACHINE_OVERFLOWS (см. 3).
Кроме базовых в состав операций над фиксированным типом входят операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции - и +, мультипликативные операции «и/и операция abs.
Операции над подтипом — это соответствующие операции над типом, кроме следующих:присваивания, проверки принадлежности, квалификации, явного преобразования и атрибутов первой группы; результат этих операций определен в терминах подтипа.
. Значение атрибута T'FORE зависит только от диапазона подтипа Т. Значение атрибута T'AFT зависит только от значения T'DELTA. Между атрибутами фиксированного типа существуют следующие соотношения:
T'LARGE = (2**Т'MANTISSА - 1) * T'SMALL T'SAFE_LARGE = T'BASE'LARGE T'SAFE_SMALL = T'BASE'SMALL
Ссылки: арифметическая операция 5, 4.5, базовая операция 3, базовый тип 3.3, бинарная аддитивная операция 4.5, 3, граница диапазона 3.5, дельта 9, квалифицированное выражение 4.7, модельное число 6, мультипликативная операция 4.5, 5, объект 3.2, операция 3.3, операция abs 4.5, 6, операция отношения 4.5, 2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, унарная аддитивная операция 4.5, 4, универсальный вещественный тип 6, универсальный целый тип 4, фиксированный тип 9, хранимое число 6, числовой тип
настраиваемый модуль 12, настраиваемый формальный
-- групповое описание объектов JOHN, PAUL : PERSON_NAME := new PERSON(SEX => M); -- CM. 1 -- эквивалентно единичным описаниям объектов, -- следующим в данном порядке JOHN : PERSON_NAME := new PERSON(SEX => M); PAUL : PERSON_NAME := new PERSON(SEX => M);
Ссылки: вход 9.5, выражение 4.4, идентификатор 2.3, компонента 3.3, настраиваемая подпрограмма 12.1, настраиваемый модуль 12, настраиваемый формальный объект 1, область действия 8.2, описание 3.1, описание исключения 11.1, описание одиночной задачи 9.1, описание параметра настройки 12.1, описание субконстанты 7.4, определение индексируемого типа 3.6, отрезок 2, параметр цикла 5.5, подпрограмма 6, простое имя 4.1, спецификация дискриминанта 1, спецификация параметра 6.1, ссылочный тип 3.8, статическое выражение 4.9, тип 3.3, тип универсальный вещественный 6, тип универсальный целый 4, указание подтипа 2, указывать 3.8, формальный объект настройки 1, формальный параметр 6.1, числовой тип
1. ОПИСАНИЯ ОБЪЕКТОВ
Описание объектов вводит объект, тип которого задан либо указанием подтипа, либо определением индексируемого типа. Если описание объекта включает составной ограничитель-присваивание, за которым следует выражение, то это выражение определяет начальное значение описываемого объекта; тип выражения должен быть тем же, что и тип объекта.
Описываемый объект — константа, если в описании объекта присутствует зарезервированное слово constant. В этом случае описание должно включать явную инициализацию. Значение константы не может быть изменено после инициализации. Формальные параметры вида in подпрограмм и входов, а также формальные параметры настройки вида in являются константами; параметр цикла — константа в соответствующем цикле; подкомпонента или отрезок константы тоже константа.
Объект, не являющийся константой, называется переменной (в частности, объект, заданный описанием объекта без зарезервированного слова constant, является переменной). Для-изменения значения переменной существует только два пути: непосредственное присваивание и косвенное изменение (см. 6.2) оператором вызова процедуры или входа (это действие может быть выполнено над самой переменной, над подкомпонентой переменной либо над другой переменной, для которой данная является подкомпонентой).
Предвыполнение описания объекта происходит следующим образом:
а. Устанавливается подтип объекта посредством предвыполнения указания подтипа или определения ограниченного индексируемого типа.
б. Если описание объекта включает явную инициализацию, то его начальное значение получается вычислением соответствующего выражения. В противном случае вычисляются неявные начальные значения (если они есть) объекта или его подкомпонент.
в. Создается объект.
г. Начальное значение (заданное явно или по умолчанию) присваивается объекту или соответствующей подкомпоненте.
Неявные начальные значения определяются для объектов, заданных описанием объекта, и для компонент таких объектов в следующих случаях:
• Для объекта ссылочного типа — его неявное начальное значение равно пустому значению ссылочного типа.
• Для объекта задачного типа — неявное начальное (и единственное) значение обозначает соответствующую задачу.
• Если тип объекта является типом с дискриминантами и его подтип ограничен, то неявное начальное (и единственное) значение каждого дискриминанта определяется подтипом объекта.
• Для объекта составного типа неявное начальное значение каждой компоненты, имеющей выражение по умолчанию, получается вычислением этого выражения, если только компонента не дискриминант ограниченного объекта (предыдущий случай).
Если компонента сама является составным объектом, значение которой не определено ни явной инициализацией, ни выражением по умолчанию, то неявное начальное значение компонент составного объекта определяется теми же самыми правилами, что и для описанного объекта.
Шаги от а до г выполняются в указанном порядке. Если на шаге б вычисляется выражение по умолчанию для дискриминанта, то это вычисление выполняется до вычисления выражений по умолчанию для зависимых от дискриминанта подкомпонент, а также до вычисления выражений по умолчанию, содержащих имя дискриминанта. Кроме предыдущего правила, порядок вычисления выражений по умолчанию языком не определен.
При инициализации описанного объекта или одной из его подкомпонент проверяется принадлежность начального значения подтипу объекта; для массива, описанного описанием объекта. сначала поименяется неявное преобразование подтипа, как пои выполнении оператораприсваивания, если только объект не является константой с подтипом неограниченного индексируемого типа. При отрицательном результате проверки возбуждается исключениеCONSTRAINT_ERROR.
Значение скалярной переменной после предвыполнения соответствующего описания объекта не определено, если начальное значение не было присвоено переменной при (явной илинеявной) инициализации.
Если операнд преобразования типа или квалифицированного выражения является составной переменной с неопределенными значениями скалярных подкомпонент, то значения соответствующих подкомпонент результата неопределенны. Выполнение программы ошибочно, если делается попытка вычислить скалярную переменную с неопределенным значением. Аналогично выполнение программы ошибочно, если делается попытка применить предопределенную операцию к составной переменной, имеющей скалярную подкомпоненту с неопределенным значением. Примеры описаний переменных:
COUNT, SUM : INTEGER; SIZE : INTEGER range 0 .. 10_000 := 0; SORTED : BOOLEAN := FALSE; COLOR TABLE : array(1 .. N) of COLOR; OPTION : BIT_VECTOR(1 .. 10) := (others => TRUE);Примеры описаний констант:LIMIT : constant INTEGER := 10_000; LOW LIMIT : constant INTEGER := LIMIT/10; TOLERANCE : constant REAL := DISPERSION(1.15);
Выражение для инициализации константы не обязательно является статическим выражением (см. 4.9). В приведенных выше примерах LIMIT и LOW-LIMIT инициализированы статическими выражениями, a TOLERANCE - нет, если DISPERSION - определенная пользователем функция.
Ссылки: видимый раздел 7.2, вид в 6.1, в некотором порядке 1.6, вход 9.5, выражение 4.4, выражение по умолчанию для дискриминанта 1, вычисление 4.5, дискриминант 3.3, зависимый от дискриминанта 1, задача 9, задачный тип 9.2, зарезервированное слово 2.9, исключение ошибка ограничения 11.1, квалифицированное выражение 4.7, компонента 3.3, лимитируемый тип 4, личный тип 7.4, настраиваемый модуль 12, начальное значение по умолчанию для ссылочного типа 3.8, ограниченный подтип 3.3, описание 3.1, определение ограниченного индексируемого типа 3.6, отрезок 2, пакет 7, первичное 4.4, подкомпонента 3.3, подпрограмма 6 подтип 3.3, Предвыполнение 3.9, предопределенная операция 4.5, преобразования 4.6, присваивание 5.2, скалярный тип 3.5, составной ограничитель присваивания 5.2, составной тип 3.3, ссылочный тип 3.8, тип 3.3, указание подтипа 2, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3, указывать
2. ОПИСАНИЕ ЧИСЛА
Описание числа — это специальная форма описания константы. Тип статического выражения, заданного для инициализации в описании числа, должен быть либо типом универсальный-целый, либо типом универсальный-вещественный. Константа, объявленная описанием числа, называется именованным числом и имеет тот же тип, что и статическоевыражение.
. Относящиеся к выражениям универсального типа правила изложены в разделе 4.10. Из этих правил следует, что именованное число имеет универсальный-целый тип, если каждое содержащееся в выражении первичное имеет этот тип. Аналогично если каждое первичное имеет тип универсальный-вещественный, то именованное число имеет этот тип.
Примеры описаний чисел:
pi : constant := 3.14159_26636; -- вещественное число TWO_PI : constant := 2.0*PI; -- вещественное число МАХ : constant := 500; -- целое число POWER16 : constant := 2**16; -- целое число 65-536 ONE, UN, EINS : constant := 1; -- три различных имени 1
Ссылки: идентификатор 2.3, первичное 4.4, статическое выражение 4.9, тип 3.3, тип универсальный вещественный 6, тип универсальный целый 4, универсальный тип 4.10.
базовые операции над типом STRING
STARS : STRING(1 .. 120) := (1 .. 120 => '*' ); QUESTION : constant STRING := "HOW MANY CHARACTERS?"; -- QUESTION'FIRST = 1, QUESTION'LAST = 20 (число СИМВОЛОВ)ASK_TWICE : conatant STRING := QUESTION & QUESTION; NINETY_SIX : constant ROMAN := "XCVI"; -- см. 3.6
. Строковые литералы (см. 2.6 и 4.2) — базовые операции над типом STRING и любым другим одномерным индексируемым типом, тип компонент которого — символьный тип. Операция катенации — предопределенная операция над типом STRING и для одномерных индексируемых типов; она представляется знаком &. Операции отношения <, < =, > и > = определены для значений этих типов в соответствии с лексикографическим порядком (см. 2).
Ссылки: агрегат 4.3, индекс 3.6, лексикографический порядок 2, массив 3.6, операция катенации 4.5, 3, операция отношения 4.5, 2, подтип 3.3, позиционный агрегат 4.3, предопределенная операция 4.5, предопределенный тип С, размерность 3.6, символьный тип 2, строковый литерал 2.6, тип 3.3, тип компоненты (массива)
type MIDWEEK is new DAY
type LOCAL-COORDINATE is new COORDINATE; —- Два различных типа type MIDWEEK is new DAY range TUE .. THU; —- CM. 1 type COUNTER is new POSITIVE; -- тот же диапазон, что и у POSITIVE type SPECIAL-KEY is new KEYMANAGER.KEY; — CM. 2 -- Производные подпрограммы имеют следующие спецификации:--procedure GETKEY(K : out SPECIAL_KEY); -—function "<"(X,Y : SPECIAL_KEY) return BOOLEAN;
. Из правил наследования базовых операций и литералов перечисления следует, что обозначения для литерала или агрегата производного типа те же самые, что и для родительского типа; такие литералы и агрегаты называются совмещенными. Из правил также следует, что обозначения компоненты, дискриминанта, входа, отрезка или атрибута одинаковы для производного и родительского типов.
Скрытие производной подпрограммы допустимо даже в одной и той же зоне описания (см. 8.3). Производная подпрограмма скрывает предопределенную операцию, имеющую тот же профиль типа параметров и результата (см. 6.6).
Описание настраиваемой подпрограммы не наследуется, поскольку оно описывает настраиваемый модуль, а не подпрограмму. С другой стороны, конкретизация настраиваемой подпрограммы является (ненастраиваемой) подпрограммой, которая является наследуемой, если она удовлетворяет требованиям наследуемости подпрограмм.
Если родительский тип является логическим, то предопределенные операции отношения над производным типом дают результаты предопределенного типа BOOLEAN (см. 2).
Если спецификатор представления дан для родительского типа и помещен за описанием производного типа, то соответствующий спецификатор представления неприменим к производному типу; следовательно, для такого производного типа допускается явный спецификатор представления.
Если параметр производной подпрограммы принадлежит производному типу, подтип это- .-, го параметра не обязан иметь значение, общее с производным подтипом.
Ссылки: агрегат 4.3, атрибут 4, базовая операция 3, базовый тип 3.3, вид 6.1, видимый раздел 7.2, вход 9.5, вызов функции 6.4, выражение по умолчанию 1, граница диапазона 3.5, дискриминант 3.3, зарезервированное слово 2.9, зона описания 8.1, класс типа 3.3, компонента 3.3, литерал 4.2, литерал перечисления 1, личный тип 7.4, логический тип 3, набор 3.8, начальное значение по умолчанию для ссылочного типа 3.8, непосредственно в 8.1, неявное описание 3.1, ограничение 3.3, ограничение диапазона 3.5, ограничение плавающего типа 7, ограничение фиксированного типа 9, оператор вызова процедуры 6.4, описание 3.1, описание настройки 12.1, определение типа 1, отрезок 2, пакет 7, подпрограмма 6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, процедура б, совмещение 6.6, 8.7, сопоставление параметров 6.4, составной тип 3.3, спецификатор представления 13.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, ссылочное значение 3.8, тип 3.3, указание подтипа 2, фактический параметр 1, формальный параметр
неполное описание типа 1, область
type BUFFER(SIZE : BUFFER_SIZE := 100) is -- см. 4 record POS : BUFFER_SIZE := 0; VALUE : STRING(1 .. SIZE); end record;type SQUARE(SIDE : INTEGER) is record MAT : MATRIX(1 .. SIDE, 1 .. SIDE); --CM. 3.6 end record:type DOUBLESQUARE(NUMBER : INTEGER) is record LEFT : SQUARE (NUMBER); RIGHT : SQUARE (NUMBER); end record;
type ITEM(NUMBER : POSITIVE) is record CONTENT : INTEGER; -- компонента не зависит от дискриминанта end record;
Ссылки: выражение 4.4, границы диапазона 3.5, дискретный тип 3.5, дискриминант 3.3, идентификатор 2.3, именуемый тип 3.7, имя 4.1, компонента 3.3, компонента записи 3.7, личный тип 7.4, настраиваемый формальный тип 12.1, неполное описание типа 1, область действия 8.2, обозначение типа 2, объект 3.2, ограничение дискриминанта 2, ограничение индекса 1, описание 3.1, описание компоненты 3.7, описание личного типа 7.4, описание параметра настройки 12.1, описание типа 1, подкомпонента 3.3, Предвыполнение 3.9, присваивание 5.2, простое имя 4.1, раздел вариантов 3, составной ограничитель присваивания 2.2, список идентификаторов 3.2, указание подтипа 2.
2. ОГРАНИЧЕНИЯ ДИСКРИМИНАНТОВ
Ограничение дискриминанта допустимо только в указании подтипа за обозначением типа. Это обозначение типа должно указывать либо тип дискриминанта, либо ссылочный тип, обозначающий тип с дискриминантом. Ограничение дискриминанта задает значения этих дискриминантов.
ограничение-дискриминанта ::= (сопоставление-дискриминанта {, сопоставление-дискриминанта})сопоставление-дискриминанта ::= [простое-имя-дискриминанта {|простое-имя-дискриминанта} =>] выражение
Каждое сопоставление дискриминанта связывает выражение с одним или несколькими дискриминантами. Сопоставление дискриминанта называется именованным, если дискриминанты заданы явно своими именами; иначе оно называется позиционным. Для позиционного сопоставления (единственный) дискриминант неявно задан позицией в текстуальном порядке. Именованные сопоставления могут быть даны в любом порядке, но если в одном и том же ограничении дискриминанта использованы позиционные и именованные сопоставления, то позиционные сопоставления должны стоять первыми, в их обычной позиции. Следовательно, если однажды было использовано именованное сопоставление, то в остальной части ограничения дискриминанта должны употребляться только именованные сопоставления.
Для именованного сопоставления дискриминанта имена дискриминантов должны обозначать дискриминанты того типа, для которого дано ограничение дискриминанта. Сопоставление дискриминанта с более чем одним именем дискриминанта допустимо, только если все дискриминанты имеют один и тот же тип. Более того, для каждого сопоставления дискриминанта (именованного или позиционного) выражение и связанные дискриминанты должны иметь один и тот же тип. Ограничение дискриминанта должно задавать точно одно значение для каждого дискриминанта типа.
Ограничение дискриминанта совместимо с типом, указанным обозначением типа, если и только если каждое значение дискриминанта принадлежит подтипу соответствующего дискриминанта. Более того, для каждой подкомпоненты, спецификация подтипа которой зависит от дискриминанта, дискриминант в этой спецификации подтипа компоненты заменяется значением дискриминанта и производится проверка совместимости результирующего указания подтипа.
Составное значение удовлетворяет ограничению дискриминанта, если и только если каждый дискриминант составного значения имеет налагаемое ограничением дискриминанта значение.
Начальные значения дискриминантов объекта, имеющего тип с дискриминантами, определены следующим образом:
• Для объявленной описанием объекта переменной указание подтипа должно быть ограничено ограничением дискриминанта, если выражения по умолчанию для дискриминантов отсутствуют; значения дискриминантов определены либо ограничением, либо при отсутствии его выражением по умолчанию. То же самое требование существует для указания подтипа в описании компоненты, если тип компоненты записи имеет дискриминанты, а также для указания подтипа компоненты индексируемого типа, если тип компоненты массива — тип с дискриминантами.
• Для объявленной описанием объекта константы значения дискриминантов берутся из начального значения, если подтип константы не ограничен; иначе они определяются из этого подтипа (в последнем случае возбуждается исключение, если начальное значение не принадлежит этому подтипу). То же правило применяется к параметру настройки вида in.
• Для указанного ссылочным значением объекта значения дискриминантов должны быть определены генератором, создающим объект. (Созданный объект ограничен соответствующими значениями дискриминантов.)
• Для формального параметра подпрограммы или входа дискриминанты формального параметра инициализированы значениями дискриминантов соответствующего фактического параметра. (Формальный параметр ограничен, если соответствующий фактический параметр ограничен, и ограничен в любом случае, если его вид in или если подтип формального параметра ограничен.)
• Для описания переименования и для формального параметра настройки вида in out дискриминанты — это дискриминанты переименованного объекта или соответствующего фактического параметра настройки.
Порядок вычислений выражений, данных в сопоставлениях дискриминантов, при предвы-полнении ограничения дискриминанта в языке не определен; выражение именованного сопоставления вычисляется по одному разу для каждого именованного дискриминанта.
Примеры {использующие типы, описанные в предыдущем разделе}:
LARGE : ВUFFЕР(200); -- всегда ограничен, 200 символов -- это явное значение дискриминанта MESSAQE: BUFFER; -- не ограничен, вначале 100 символов -- это значение дискриминанта по -- умолчаниюBASIS : 8QUАRЕ(5); -- ограничен, всегда 5 на 5 ILLEGAL : SQUARE; -- неправильно, SQUARE -- должен быть ограничен
. Приведенные правила и правила, определяющие предвыполнение описания объекта (см. 3.2), гарантируют, что дискриминанты всегда имеют значения. В частности, если ограничение дискриминанта входит в описание объекта, то каждый дискриминант инициализирован значением, определяемым ограничением. Аналогично если подтип компоненты имеет ограничение дискриминанта, то дискриминанты этой компоненты соответственно инициализированы.
Ссылки: Вид 6.1, вид In out 6.1, вход 9.5, выражение 4.4, выражение по умолчанию для дискриминанта 3.7, вычисление 4.5, генератор 4.8, граница диапазона 3.5, дискриминант 3.3, зависит от дискриминанта 1, зарезервированное слово 2.9, имя 4.1, компонента 3.3, константа 1, обозначение типа 2, указываемый тип 3.8, объект 3.2, ограничение 3.3, ограниченный подтип 3.3, описание 3.1, описание компоненты 3.7, описание объекта 1, описание переименования 8.5, определение индексируемого типа 3.6, определение ссылочного типа 3.8, переменная 1, подкомпонента 3.3, подпрограмма 6, подтип 3.3, предвыполнение 3.9, простое имя 4.1, совместимый 2, составное значение 3.3, ссылочное значение 3.8, ссылочный тип 3.8, тип 3.3, удовлетворять 3.3, указание подтипа 2, указание подтипа компоненты 3.7, указываемый тип 3.8, указывать 3.8, фактический параметр 1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки 12.1,
3. РАЗДЕЛЫ ВАРИАНТОВ
Именуемый тип с разделом вариантов задает альтернативные списки компонент. Каждый вариант определяет компоненты для соответствующего значения или значений дискриминанта.
раздел-вариантов ::= case простое-имя-дискриминанта is вариант {вариант} end case;вариант ::= when выбор {|выбор} => список_компонентвыбор ::= простое-выражение |дискретный-диапазон | others | простое-имя-компоненты
Каждый вариант начинается со списка выборов, которые должны быть того же типа, что и дискриминант раздела вариантов. Тип дискриминанта раздела вариантов не должен быть настраиваемым формальным типом настройки. Если подтип дискриминанта статический, то каждое значение этого подтипа должно быть представлено в наборе выборов раздела вариантов один и только один раз и другие значения недопустимы. Другими словами, каждое значение (базового) типа дискриминанта должно быть представлено один и только одинраз в наборе вариантов.
Простые выражения и дискретные диапазоны, данные как выборы в разделе вариантов, должны быть статическими. Определенный дискретным диапазоном выбор задает все значения соответствующего диапазона (и ни одного, если диапазон пустой). Выбор others допустим только для последнего варианта и только как его единственный выбор; он задает все остальные значения (возможно, и ни одного), не упомянутые в выборах предыдущих вариантов. Простое имя компоненты недопустимо в качестве выбора варианта (хотя оно присутствуетв синтаксисе выбора).
Значение записи содержит значения компонент данного варианта тогда и только тогда, когда значение дискриминанта равно одному из значений, заданных выборами варианта. Это правило применимо в свою очередь к любому вложенному варианту, который сам включен в список компонент данного варианта. Если список компонент варианта задан как null, то вариант не имеет компонент.
Примеры именуемого типа с разделом вариантов:
type DEVICE is (PRINTER, DISK, DRUM); type STATE is (OPEN, CLOSED);type PERIPHERAL(UNIT : DEVICE := DISK) is record STATUS : STATE; case UNIT is whenPRINTER => LINECOUNT : INTEGER range1 .. PAGESIZE; when others => CYLINDER : CYLINDERINDEX; TRACK : TRACKNUMBER; end case; end record:
Примеры подтипов записей:
subtype DRUMUNIT is PERIPHERAL(DRUM); subtype DISKUNIT is PERIPHERAL(DISK);
Примеры ограниченных переменных именуемого типа:
WRITER : PERIPHERAL(UNIT => PRINTER); ARCHIVE : DISK_UNIT;
. Выборы с дискретными значениями используются также в операторах выбора и в агрегатах массива. Выборы с простыми именами компонент используются в агрегатахзаписей.
Ссылки: агрегат записи 1, агрегат массива 2, базовый тип 3.3, выражение 4.4, дискретный диапазон 3.6, диапазон 3.5, дискриминант 3.3, именуемый тип 3.7, компонента 3.3, настраиваемый формальный тип 2, подтип 3.3, простое выражение 4.4, простое имя 4.1, пустой диапазон 3.5, список компонент 3.7, статическое выражение 4.9, статический дискретный диапазон 4.9, статический подтип
4. ОПЕРАЦИИ НАД ИМЕНУЕМЫМИ ТИПАМИ
Базовые'операции над именуемым типом включают присваивание и агрегаты (если тип не лимитируемый тип), проверку принадлежности, именование компонент записи, квалификацию и преобразование типа (для производных типов).
Для любого объекта А типа с дискриминантами базовые операции включают также следующий атрибут:
A'CONSTRAINED | Вырабатывает значение TRUE, если ограничение дискриминанта наложено на объект А или если объект — константа (включая формальный параметр или формальный параметр настройки вида in); вырабатывает значение FALSE в противном случае. Если А — формальный параметр настройки вида in oirt или если А — формальный параметр вида in out или out и данное в соответствующей спецификации параметра обозначение типа обозначает неограниченный тип с дискриминантами, то значение этого атрибута получается из значения атрибута соответствующего фактического параметра. Значение этого атрибута имеет предопределенный тип BOOLEAN. |
Кроме того, атрибуты T'BASE и T'SIZE опеределены для именуемого типа или подтипа Т (см. 3); атрибуты A'SIZE и A'ADDRESS определены для записи А (см. 2).
Кроме базовых операции над именуемым типом включают предопределенное сравнение на равенство и неравенство, если тип не является лимитируемым.
. Именуемый тип ~ лимитируемый, если тип хотя бы одной из его компонент — лимитируемый (см. 4).
Ссылки: агрегат 4.3, атрибут 4, базовая операция 3, вид 6.1, дискриминант 3.3, именуемая компонента 3, именуемый тип 3.7, квалифицированное выражение 4.7, константа 1, лимитируемый тип 4, логический тип 3, объект 1, ограничение дискриминанта 2, операция 3.3, операция отношения 4.5, 4,5.2, подкомпоненТа 3.3, подтип 3.3, предопределенная операция 4.5, предопределенный тип С, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, производный тип 3.4, тип 3.3, фактический параметр 1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3
И GREEN совмещеныtype HEXA is
type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN); type SUIT is (CLUBS, DIAMONDS, HEARTS, SPADES); type GENDER is (M, F); type LEVEL is (LOW, MEDIUM, URGENT); type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE, BROWN, BLACK); type LIGHT is (RED, AMBER, GREEN); -- RED И GREEN совмещеныtype HEXA is ('A', 'B', 'C', '0', 'E', 'F'); type MIXED is ('A', 'B', '*', B, NONE, '?', '%');subtype WEEKDAY is DAY range MON .. FRI; subtype MAJOR is SUIT range HEARTS .. SPADES: subtype RAINBOW is COLOR range RED .. BLUE; -- цвет, НО не свет
. Если литерал перечисления встречается в контексте, недостаточном для определения типа литерала, то один из путей разрешения неоднозначности — это применение квалифицированного выражения с именем перечислимого типа (см. 4.7).
Ссылки: идентификатор 2.3, имя 4.1, квалифицированное выражение 4.7, номер позиции 3.5, обозначение 6.1, операция отношения 4.5, 2, описание 3.1, определение типа 1, пред-выполнение 3.9, 6.1, символьный литерал 2.5, совмещение 6.6, 8.7, тип 3.3, функция
2. СИМВОЛЬНЫЕ ТИПЫ
Перечислимый тип называется символьным, если хотя бы один из его Питералов перечисления является символьным литералом. Предопределенный тип CHARACTER — символьный тип, значения которого представляют собой 128 символов стандартного набора ASCII. Каждый из 95 графических символов этого символьного набора обозначен соответствующим символьным литералом.
Пример:
type ROMAN_DIGIT is (Т, 'V. 'X', 'L', 'С', 'D', 'М');
. Предопределенный пакет ASCII включает описания констант, обозначающих управляющие символы, а также констант, обозначающих графические символы, не входящие в основной набор символов.
Другой символьный набор, например EBCDIC, можно описать как символьный тип; внутренние коды символов можно задать спецификатором представления перечислимых, как пояснено в разд.
Ссыпки: графический символ 2.1, идентификатор 2.8, константа 1, литерал 4.2, описание 3.1, основной символ 2.1, перечислимый тип 1, предопределенный пакет С, предопределенный тип С, символьный литерал 2.5, тип
3. ЛОГИЧЕСКИЕ ТИПЫ
Существует предопределенный перечислимый тип, именуемый BOOLEAN. Он содержит два литерала FALSE и TRUE, упорядоченные соотношением FALSE < TRUE. Логический тип — это тип BOOLEAN или производный непосредственно или косвенно от логического типа.
Ссылки: литерал перечисления 1, операция отношения 4.5, 2, перечислимый тип 1, производный тип 3.4, тип
4. ЦЕЛЫЕ ТИПЫ
Определение целого типа задает целый тип, набор значений которого включает значения заданного диапазона.
определение-целого-типа ::= ограничение-диапазона
Границы диапазона должны определяться статическими выражениями некоторого, не обязательно одного и того же, целого типа. (Допускаются отрицательные границы.) Описание типа в форме
type Т is range L .. R ;
по определению эквивалентно следующим описаниям:
type целый- тип is new предопределенный-целый-тип;
subtype Т is целый-тип range целый- тип (L) .. целый-тип (R);
где целый-тип — это анонимный тип, а предопределенный целый тип выбран реализацией и содержит значения от L до R включительно. Описание целого типа неправильно, если ни один из предопределенных целых типов не удовлетворяет этому требованию, за исключением типа универсальный-целый. Предвыполнение описания целого типа состоит из предвыполне-ния эквивалентных описаний типа и подтипа.
Предопределенные целые типы включают тип INTEGER. Реализация может также иметь предопределенные типы SHORT-INTEGER и LONG-INTEGER, диапазоны которых соответственно (существенно) уже и шире, чем у типа INTEGER. Диапазон этих типов должен быть симметричным относительно нуля, кроме наименьшего из отрицательных значений, которое может существовать в некоторых реализациях. Базовым для каждого из этих типов является он сам.
Целые литералы — это литералы анонимного предопределенного целого типа, который в данном руководстве называется универсальным-целым. Другие целые типы не имеют литералов. Однако для каждого целого типа существует неявное преобразование универсального-целого значения в соответствующее значение (если оно есть) целого типа. Обстоятельства, в которых применяются такие неявные преобразования, описаны в разд.
Номер позиции целого значения — это соответствующее значение типа универсальный-цепый.
Для всех целых типов предопределены одни и те же арифметические операции (см. 4.5). Исключение NUMERIC-ERROR возбуждается при выполнении операции (в частности, неявного преобразования), которая не может передать корректный результат (т.е. значение, соответствующее математическому результату, не является значением целого типа). Однако от реализации не требуется возбуждения исключения NUMERIC_ERROR, если операция является частью большего выражения, результат которого может быть вычислен корректно, как пояснено в разд.
type FRAME is access MATRIX;
type FRAME is access MATRIX; -- см. 3.6 type BUFFERNAME is access BUFFER; -- см. 1
. Ссылочное значение, передаваемое генератором, может быть присвоено нескольким ссылочным объектам. Следовательно, объект, созданный генератором, может быть указан более чем одной переменной или константой ссылочного типа. Ссылочное значение может указывать только объект, созданный генератором, в частности, оно не может указывать объект, объявленный описанием объекта.
Если тип объектов, указанных ссылочными значениями, — индексируемый тип или тип с дискриминантами, то эти объекты ограничены либо границами массива, либо значениями дискриминантов, заданными неявно или явно соответствующими генераторами (см. 4.8).
Ссылочные значения в некоторых других языках называются указателями или ссылками.
Ссылки: генератор 4.8, зарезервированное слово 2.9, имя 4.1, индексируемый тип 3.6, константа 1, лимитируемый тип 4, литерал 4.2, объект 1, ограничение 3.3, ограничение дискриминанта 2, ограничение индекса 1, описание объекта 1, переменная 1, подкомпонента 3.3, подтип 3.3, Предвыполнение 3.9, принадлежит подтипу 3.3, присваивание 5.2, простое имя 4.1, спецификация индекса 3.6, тип 3.3, удовлетворять 3.3, указание подтипа 2.
1. НЕПОЛНЫЕ ОПИСАНИЯ ТИПОВ
Никаких конкретных ограничений на тип, указываемый ссылочным типом, не существует. В частности, тип компоненты указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или описания личного типа) для одного или нескольких типов.
неполное-описание-типа ::= type идентификатор [раздел-дискриминантов];
Для каждого неполного описания типа должно быть соответствующее описание типа с тем же идентификатором. Соответствующее описание должно быть либо полным описанием, либо описанием задачного типа. В оставшейся части главы пояснения даны в терминах полных описаний типа; те же правила применяются к описаниям задачного типа. Если неполное описание типа встречается непосредственно в разделе описаний или видимом разделе спецификации пакета, то полное описание типа должно встретиться позже непосредственно в этом разделе описаний или видимом разделе. Если неполное описание типа встречается непосредственно в личном разделе пакета, то полное описание типа должно быть позже непосредственно в самом личном разделе или же в разделе описаний соответствующего тела пакета.
Раздел дискриминантов должен быть дан в полном описании типа тогда и только тогда, когда он дан в неполном описании типа; если разделы дискриминантов даны, то они должны быть согласованы (см. 1 для правил согласования). До конца полного описания типа использование имени, обозначающего" тип, объявленный неполным описанием типа, допустимо только как обозначение типа в указании подтипа определения ссылочного типа; единственной формой ограничения, допустимой в указании подтипа, являются ограничения дискриминанта.
Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел дискриминантов, то это Предвыполнение включает Предвыполнение раздела дискриминантов: в этом случае раздел дискриминантов полного описания типа не предвыпол-няется.
11 явно или неявно, прямо или косвенно. — Прим. ред.
Пример рекурсивного типа:
type CELL; — неполное описание типа type LINK is access CELL;type CELL is record VALUE : INTEGER; SUCC : LINK; PRED : LINK; end record;HEAD : LINK := new CELL'(O, null, null); NEXT : LINK := HEAD.SUCC;
Примеры взаимозависимых ссылочных типов:
type PERSON(SEX : GENOER); — неполное описание типа type CAR; — неполное описание типаtype PERSONNAME is access PERSON; type CARNAME is access CAR;type CAR is record NUMBER : INTEGER; OWNER : PERSONNAME; end record;type PERSON(SEX : GENDER) is record NAME : STRING(1 .. 20); BIRTH : DATE; AGE : INTEGER range 0 .. 130; VEHICLE : CAR_NAME; casa SEX is when M => WIFE : PERSON_NAME(SEX => F); when F => HUSBAND ; PERSON_NAME(SEX => M); end case: end record;MYCAR, YOURCAR, NEXTCAR : CARNAME; — неявно инициированы — пустым значением
Ссылки: идентификатор 2.3, имя 4.1, компонента 3.3, обозначение типа 2, ограничение 3.3, ограничение дискриминанта 2, описание 3.1, определение ссылочного типа 3.8, предвы-полнение 3.9, раздел дискриминантов 1, согласован 1, ссылочный тип 3.8, тип 3.3, указание подтипа 2, указывать 3.8, элемент описания
2. ОПЕРАЦИИ НАД ССЫЛОЧНЫМИ ТИПАМИ
Базовые операции над ссылочным типом включают присваивание, генераторы для этого ссылочного типа, проверку принадлежности, явное преобразование, квалификацию и литерал null. Если указываемый тип — тип с дискриминантами, то базовые операции включают именование соответствующих дискриминантов; если указываемый тип — именуемый тип, то они включают именование соответствующих компонент; если указываемый тип — индексируемый тип, то они включают образование индексируемых компонент и отрезков; если указываемый тип — задачный тип, то они включают именование входов и семейств входов. Кроме того, базовые операции включают образование именуемой компоненты с зарезервированным словом аll (см. 3).
Если указываемый тип — индексируемый тип, то базовые операции включают атрибуты с обозначениями FIRST, LAST, RANGE и LENGTH (и эти же атрибуты с параметром N для номера измерения). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики указываемого объекта (см. 2).
Если указываемый тип — задачный тип, то базовые операции включают атрибуты с обозначениями TERMINATED и CALLABLE (см. 9.9). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики задачных объектов.
Кроме того, атрибут T'BASE (см. 3) и атрибуты представления T'SIZE и T'STORAGE-SIZE (см. 2) определены для ссылочного типа или подтипа Т; атрибуты A'SIZE и A'ADDRESS определены для ссылочного объекта А (см. 2).
Кроме базовых операции над ссылочным типом включают предопределенное сравнение на равенство и неравенство.
Ссылки: атрибут 4, базовая операция 3, базовый тип 3.3, генератор 4.8, дискриминант 3.3, задачный тип 9.1, именуемая компонента 3, именуемый тип 3.7, индексируемая компонента 1, индексируемый тип 3.6, квалифицированное выражение 4.7, литерал 4.2, личный тип 7.4, набор 3.8, обозначение атрибута 4, объект 1, ограниченный индексируемый подтип 3.6, операция 3.3, отрезок 2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, ссылочный тип 3.8, тип 3.3, указываемый подтип 3.8, указываемый тип 3.8, указывать
Производные типы
Определение производного типа задает новый (базовый) тип, свойства которого наследуют свойства родительского типа: новый тип называется производным типом. Определение производного типа создает одновременно производный подтип, являющийся подтипом производного типа.
определение-производного-типа ::= new указание-подтипа
Указание подтипа после зарезервированного слова new определяет родительский подтип. Родительский тип является базовым для родительского подтипа. Если для родительского подтипа существует ограничение, то подобное ограничение существует и для производного подтипа; разница состоит только в том, что для ограничения диапазона и для ограничения плавающего или фиксированного типов, которое включает ограничение диапазона, значение каждой границы заменяется на соответствующее значение производного типа. Производный тип обладает следующими свойствами:
• Производный тип относится к тому же самому классу типов, что и родительский тип. Набор возможных значений для производного типа есть копия набора возможных значений для родительского типа. Если родительский тип составной, то такие же компоненты существуют и у производного типа, а подтип соответствующих компонент тот же самый.
• Для каждой базовой операции над родительским типом существует соответствующая базовая операция над производным типом. Допускается явное преобразование значения родительского типа в соответствующее значение производного типа и наоборот, как поясняется в разд.
• Для каждого литерала перечисления или предопределенной операции над родительским типом существует соответствующая операция над производным типом.
• Если родительский тип — задачный тип, то для каждого входа родительского типа существует соответствующий вход производного типа.
• Если выражение по умолчанию существует для компоненты объекта, имеющего родительский тип, то то же самое выражение используется для соответствующей компоненты объекта производного типа.
• Если родительский тип — ссылочный тип, то родительский и производный типы имеют один и тот же набор; существует пустое ссылочное значение для производного типа, которое по умолчанию является значением этого типа.
• Если существует явный спецификатор представления для родительского типа и если этот спецификатор расположен до (но не после) определения производного типа, то соответствующий спецификатор представления неявно задан и для производного типа.
• Подпрограммы, которые являются операциями над родительским типом, называются наследуемыми. Для каждой наследуемой подпрограммы родительского типа имеется соответствующая производная подпрограмма над производным типом. Могут быть выделены два сорта наследуемых подпрограмм. Во-первых, если родительский тип описан непосредственно в видимом разделе пакета, то подпрограмма, явно описанная непосредственно в видимом разделе, становится наследуемой после конца видимого раздела (если подпрограмма — операция над родительским типом). (Явное описание — это описание подпрограммы, описание переименования подпрограммы или конкретизация настройки.) Во-вторых, если родительский тип сам является производным и не описан в видимом разделе пакета, то подпрограмма, которая стала наследуемой, и она не скрыта наследуемой подпрограммой первого сорта, является далее наследуемой.
Описание производного типа неявно описывает операции над производным типом. Неявные описания любых производных подпрограмм следуют за описанием производного типа.
Спецификация производной подпрограммы неявно получается систематическим замещением родительского типа на производный тип в спецификации наследуемой подпрограммы. Любой подтип родительского типа подобным образом замещается подтипом производного типа с аналогичными ограничениями (как при замене ограничения родительского подтипа на соответствующее ограничение производного подтипа). Наконец, любое выражение родительского типа можно использовать как операнд преобразования типа, которое вырабатывает результат производного типа.
Вызов производной подпрограммы эквивалентен вызову соответствующей подпрограммы родительского типа, в котором каждый фактический параметр производного типа заменяется преобразованием типа этого фактического параметра на родительский тип (это означает, что преобразование к родительскому типу происходит перед вызовом параметров вида in и in out; обратное преобразование к производному типу происходит после вызова параметров вида in out и out, см. 1). Дополнительно, если результат вызванной функции имеет родительский тип, то он преобразуется к производному типу.
Если производный или личный тип описан непосредственно в видимом разделе пакета, то в нем этот тип не должен использоваться как родительский тип в определении производного типа. (Для личных типов см. также разд. 1.)
При предвыполнении определения производного типа сначала предвыполняется указание подтипа, затем создается производный подтип.
Разделы описаний
Раздел описаний содержит элементы описания (возможно, и ни одного).
раздел-описаний ::= {основной-элемент-описания} {дополнительный - элемент - описания}основной-элемент-описания ::= основное-описание | спецификатор-представления | спецификатор-использованиядополнительный-элемент-описания ::= тело | описание-подпрограммы | описание-пакета | описание-задачи | описание-настройки | спецификатор-использования | конкретизация-настройкитело ::= соответствующее-тело | след-тела соответствующее-тело ::= тело-подпрограммы | тело-пакета | тело-задачи
Предвыполнение раздела описаний состоит из предвыполнения элементов описания, если они есть, в порядке их следования в разделе описаний. После своего предвыполнения элемент описания называется предвыпопненным. До окончания своего предвыполнения (включая фазу перед предвыполнением) элемент описания еще не предвыполнен.
Для нескольких форм элементов описания правила языка (в частности, правило определения области действия и правила видимости) таковы, что использование понятия до предвыполнения элемента описания, который объявляет это понятие, либо невозможно, либо является неправильным. Например, невозможно использование имени типа для описания объекта, если соответствующее описание типа еще не предвыполнено. В случае тел осуществляются следующие проверки:
• При вызове подпрограммы проверяется, предвыполнено ли уже тело подпрограммы.
• При активизации задачи проверяется, предвыполнено ли уже тело соответствующего за-дачного модуля.
• При конкретизации настраиваемого модуля, имеющего тело, проверяется, предвыполнено ли уже тело настраиваемого модуля.
Если одна из этих проверок дает отрицательный результат, возбуждается исключение PROGRAM_ERROR.
Если описание подпрограммы, описание пакета, описание задачи или описание настраиваемого понятия являются элементами описания данного раздела описаний, то тело (если оно существует) программного модуля, описанного элементом описания, должно само быть элементом описания этого раздела описаний (и должно помещаться ниже). Если тело представлено следом тела, то для этого программного модуля необходим раздельно компилируемый субмодуль, содержащий соответствующее тело (см. 10.2).
Ссылки: активизация 9.3, видимость 8.3, вызов подпрограммы 6.4, исключение PROGRAM_ERROR 11.1, конкретизация 12.3, область действия 8.2, тип
Предвыполнение описаний: 3.1, конкретизация настройки 12.3, неполное описание типа 1, описание входа 9.5, описание задачи 9.1, описание компоненты 3.7, описание личного типа 1, описание настройки 12.1, описание объекта 1, описание пакета 7.2, описание переименования 8.5, описание подпрограммы 6.1, описание подтипа 2, описание субкон-станты 3, описание типа 1, описание числа 2, спецификация дискриминанта 1, спецификация литерала перечисления 1, спецификация параметра 6.1, спецификация параметра цикла
Предвыполнение определений типа: 1, определение вещественного типа 6, определение именуемого типа 3.7, определение индексируемого типа 3.6, определение перечислимого типа 1, определение производного типа 3.4, определение ссылочного типа 3.8, определение целого типа 4.
Предвыполнение других конструкций: библиотечный модуль 10.5, задача 9.2, компилируемый модуль 10.1, настраиваемое тело 12.2, раздел дискриминантов 1, след тела 10.2, спецификатор использования 8.4, спецификатор контекста 10.1, спецификатор представления 13.1, спецификатор совместности 1, спецификация задачи 9.1, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, формальный параметр настройки 12.1,
Скалярные типы
Под скалярными типами подразумеваются перечислимые, целые и вещественные типы. Перечислимые и целые типы называются дискретными типами; каждое значение дискретного типа имеет номер позиции — целое значение. Целые и вещественные типы называются числовыми типами. Все скалярные типы упорядочены, т.е. для их значений предопределены все операции отношения.
ограничение-диапазона ::= range диапазон диапазон ::= атрибут-диапазона |простое-выражение .. простое-выражение
Диапазон определяет подмножество значений скалярного типа. Диапазон L. .R определяет значения от L до R включительно, если истинно отношение L < = R. Значения L и R называются соответственно нижней границей и верхней границей диапазона. Значение V удовлетворяет ограничению диапазона, если оно принадлежит диапазону; говорят, что значение V принадлежит диапазону, если одновременно истинны отношения L<=V и V<=R. Пустой диапазон — это диапазон, для которого истинно отношение R < L; пустому диапазону не принадлежит никакое значение. Операции < = и < в вышеприведенных определениях являются предопределенными операциями над скалярными типами.
Если ограничение диапазона используется в указании подтипа либо непосредственно, либо как часть ограничения плавающего или фиксированного типа, тип простых выражений (а также границ атрибута диапазона) должен быть тем же, что и базовый тип в обозначении типа указания подтипа. Ограничение диапазона совместимо с подтипом, если каждая граница диапазона принадлежит подтипу или если ограничение диапазона определяет пустой диапазон; иначе ограничение диапазона не совместимо с подтипом.
Предвыполнение ограничения диапазона состоит из вычисления диапазона. Вычисление диапазона определяет его нижнюю и верхнюю границы. Если границы заданы простыми выражениями, вычисление диапазона вычисляет эти выражения в порядке, который не определен в языке.
Атрибуты
Для любого скалярного типа Т или для любого подтипа Т скалярного типа определены следующие атрибуты:
Т'FIRST | Вырабатывает значение нижней границы Т. Значение этого атрибута имеет тип Т. |
Т'LAST | Вырабатывает значение верхней границы Т. Значение этого атрибута имеет тип Т. |
. Индексирование и правила итерации используют значения дискретных типов.
Ссылки: атрибут 4, атрибут диапазона 2, вещественный тип 6, вычисление 4.5, индекс 3.6, обозначение типа 2, ограничение 3.3, ограничение плавающего типа 7, ограничение фиксированного типа 9, оператор цикла 5.5, операция отношения 4.5, 2, ошибочный 1.6, перечислимый тип 1, простое выражение 4.4, удовлетворяет ограничению 3.3, указание подтипа 2, целый тип 4.
1. ПЕРЕЧИСЛИМЫЕ ТИПЫ
Определение перечислимого типа задает перечислимый тип
определение - перечислимого - типа:: =
(спецификация -литерала-перечисления (, спецификация - литерала - перечисления))
спецификация-литерала-перечисления ::= литерал-перечисления литерал-перечисления ::= идентификатор|символьный-литерал
Идентификаторы и символьные литералы, перечисленные в определении перечислимого типа, должны быть различными. Каждая спецификация литерала перечисления является его описанием; это описание эквивалентно описанию функции без параметров, обозначение которой — литерал перечисления, а тип результата — перечислимый тип. Предвыполнение определения перечислимого типа создает перечислимый тип; это Предвыполнение включает пред-выполнение каждой спецификации литерала перечисления.
Каждый литерал перечисления вырабатывает отличное от других перечислимое значение. Предопределенные операции отношения упорядоченности между перечислимыми значениями следуют порядку, соответствующему номерам позиций; номер позиции первого значения в списке литералов перечисления равен нулю; номер каждого следующего литерала перечисления на единицу больше номера предыдущего литерала в списке.
Если один и тот же идентификатор или символьный литерал задан в нескольких определениях перечислимого типа, соответствующие литералы называются совмещенными. В тексте программы тип совмещенного литерала перечисления должен быть определимым из контекста (см. 8.7).
Ссылочные типы
Объявленный описанием объект создается предвыполнением этого описания и обозначается простым именем или некоторой другой формой имени. В противоположность этому существуют объекты, создаваемые вычислением генераторов (см. 4.8) и не имеющие простого имени. Доступ к такому объекту осуществляется посредством возвращаемого генератором ссылочного значения; говорят, что ссылочное значение указывает объект.
определение-ссылочного-типа ::= access указание-подтипа
Для каждого ссылочного типа существует литерал null, имеющий пустое ссылочное значение, вообще не указывающее объект. Пустое значение ссылочного типа — начальное значение этого типа по умолчанию. Другие значения ссылочного типа получаются вычислением специальной операции над типом, называемой генератором. Каждое такое ссылочное значение указывает объект подтипа, обозначенного указанием подтипа определения ссылочного типа; этот подтип называется указываемым подтипом; базовый тип этого подтипа называется указываемым типом. Указанные значением ссылочного типа объекты образуют набор, неявно связанный с типом.
Предвыполнение определения ссылочного типа состоит из предвыполнения указания подтипа и создания ссылочного типа.
Если ссылочный объект — константа, то ссылочное значение не может быть изменено и всегда указывает один и тот же объект. С другой стороны, значение указываемого объектане обязательно остается одним и тем же (присваивание указываемому объекту допустимо, если указываемый тип нелимитируемый).
Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, — это ограничения индексов и ограничения дискриминантов (см. разд. 1 и 2 для правил, применимых к этим указаниям подтипа). Ссылочное значение принадлежит соответствующему подтипу ссылочного типа, если либо ссылочное значение — пустое значение, либо если значение указываемого объекта удовлетворяет ограничению.
Типы и подтипы
Тип характеризуется множеством значений и множеством операций.
Существует несколько классов типов. Скалярные типы — это целые и вещественные типы и типы, определенные перечислением своих значений; значения этих типов не имеют компонент. Индексируемый и именуемый типы являются составными. Значение составного типа состоит из значений компонент. Ссылочный тип — это тип, значения которого обеспечивают доступ к объектам. Личные типы — это типы, для которых полностью определяется набор возможных значений, но непосредственный доступ к ним пользователей невозможен. Наконец, существуют задачные типы. (Личные типы описаны в гл. 7, задачные — .в гл. 9, остальные — в гл. 3.)
Именуемые и личные типы могут иметь специальные компоненты, называемые дискриминантами, значения которых различают альтернативные формы значений одного из этих типов. Если личный тип имеет дискриминанты, они известны пользователям типа. Следовательно, личный тип известен только своим именем, своими дискриминантами, если они есть, и соответствующим набором операций.
Набор возможных значений данного типа может зависеть от условия, которое называется ограничением (сюда не относятся случаи без ограничения), значение удовлетворяет ограничению, если оно удовлетворяет соответствующему условию. Подтип — это тип вместе с ограничением; говорят, что значение принадлежит подтипу, если оно принадлежит типу и удовлетворяет ограничению; данный тип называется базовым типом подтипа. Тип является подтипом самого себя; такой подтип называется неограниченным; он соответствует условию, которое не налагает никаких ограничений. Базовым типом является он сам.
Множество операций, определенных над конкретным типом, определено и для любого его подтипа; однако переменной данного подтипа можно присвоить значение только этого подтипа. Дополнительные операции, например квалификация (в квалификационном выражении), неявно определяются описанием подтипа.
Для объектов некоторых типов определено начальное значение по умолчанию, некоторые другие типы имеют выражения по умолчанию, определенные для всех или части своих компонент. Некоторые операции над типами и подтипами называются атрибутами; эти операции обозначаются именами, описанными в разд. 4.
Термин подкомпонента используется в описании языка вместо термина компонента, чтобы указать компоненту другой компоненты или подкомпоненты. Если нет других подкомпонент, используется термин компонента.
Подкомпонента значения данного типа не должна быть этого же типа.
Имя класса типов используется в описании языка для квалификации объектов и значений, принадлежащих к типу рассматриваемого класса. Например, термин индексируемый объект используется для объекта индексируемого типа; аналогично термин ссылочное значение используется для значения ссылочного типа.
. Набор значений подтипа — это подмножество значений базового типа. Это подмножество не обязано быть собственным подмножеством; оно может быть пустым.
Ссылки: атрибут 4, вещественный тип 6, задачный тип 9,1, именуемый тип 3.7, индексируемый тип 3.6, квалифицированное выражение 4.7, компонента записи 3.7, компонента массива 3.6, личный тип 7.4, объект 1, ограничение дискриминанта 2, описание подтипа 2, описание типа 1, перечислимый тип 1, присваивание 5.2, ссылочный тип 3.8, целый тип 4.
1. ОПИСАНИЯ ТИПОВ
Описание типа объявляет тип.
описание-типа ::= полное-описание-типа | неполное-описание-типа | описание-личного-типаполное-описание-типа ::= type идентификатор [раздел-дискриминантов] is определение-типа; определение-типа ::= определение-перечислимого-типа | определение-целого-типа | определение-вещественного-типа | определение-индексируемого-типа | определение-именуемого-типа | определение-ссылочного-типа | определение-производного-типа
Предвыполнение полного описания типа состоит из предвыполнения раздела дискриминантов, если он есть (исключая случай использования полного описания типа для неполного описания типа или описания личного типа), и предвыполнения определения типа.
Типы, созданные в результате предвыполнения различных определений, являются различными. Более того, Предвыполнение определения типа для числовых или производных типов' создает как базовый тип, так и подтип базового типа; то же самое выполняется для определения ограниченного индексируемого типа (одной из двух форм определения индексируемого типа).
Простое имя в полном описании типа обозначает описанный тип, если только описание типа не объявляет базовый тип и подтип базового типа; в этом случае простое имя обозначает подтип, а базовый тип является анонимным. Тип называется анонимным, если он не имеет простого имени. Для наглядности в этом стандарте время от времени используется псевдоимя анонимного типа, написанное курсивом, там, где обычно по синтаксису требуется идентификатор.
Примеры определений типов:
(WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK)
range 1 .. 72
array (1 .. 10) of INTEGER
Примеры описаний типов:
type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK):
type COLUMN is range 1 .. 72; type TABLE is array (1 .. 10) of INTEGER;
. Два определения типа всегда определяют два различных типа, даже если они текстуально идентичны. Таким образом, данные ниже описания А и В задают различные индексируемые типы:
А : array (1 .. 10) of BOOLEAN;
В : array (1 .. 10) of BOOLEAN;
Если А и В описаны в групповом описании объектов, то их типы (анонимные) тем не менее различны, так как это групповое описание объектов эквивалентно двум приведенным выше единичным описаниям.
А, В : array (1 .. 10) of BOOLEAN;
Неполные описания типов используются для определения рекурсивных и взаимосвязанных типов (см. 1). Описания личных типов используются в спецификациях пакетов и в описаниях параметров настройки .(см. 7.4 и 12.1).
Ссыпки: базовый тип 3.3, групповое описание объектов 3.2, зарезервированное слово 2.9, идентификатор 2.3, неполное описание типа 1, ограниченный подтип 3.3, описание 3.1, описание личного типа 7.4, определение вещественного типа 6, определение индексируемого ограниченного типа 3.6, определение индексируемого типа 3.6, определение перечислимого типа 1, определение производного типа 3.4, определение ссылочного типа 3.8, определение целого типа 4, Предвыполнение 3.9, производный тип 3.4, раздел дискриминантов 1, тип 3.3, числовой тип
2. ОПИСАНИЯ ПОДТИПОВ
Описание подтипа объявляет подтип.
описание-подтипа ::= subtype идентификатор is указание-подтипа; указание-подтипа ::= обозначение-типа [ограничение] обозначение-типа ::= имя -типа|имя- подтипа ограничение ::= ограничение-диапазона | ограничение-плавающего-типа | ограничение - фиксированного - типа | ограничение-индекса | ограничение-дискриминанта
Обозначение типа обозначает тип или подтип. Если обозначение типа — имя типа, то оно обозначает этот тип, а также соответствующий неограниченный подтип. Базовым типом, соответствующим обозначению типа, является по определению базовый тип типа или подтипа, указанного обозначением типа.
Указание подтипа определяет подтип базового типа, соответствующего обозначению типа.
Если в указании подтипа после обозначения типа стоит ограничение индекса, то обозначение типа не должно обозначать подтип с уже ограниченным индексом. Аналогично для ограничения дискриминанта: обозначение типа не должно иметь ограничение дискриминанта.
Предвыполнение описания подтипа состоит из предвыполнения указания подтипа. Это предвыполнение создает подтип. Если указание подтипа не включает ограничение, то определяемый подтип тот же, что и указанный обозначением типа подтип. Предвыполнение указания подтипа, содержащего ограничение, происходит следующим образом:
а) вначале предвыполняется ограничение;
б) ограничение проверяется на совместимость с типом или подтипом, заданным обозначением типа.
После предвыполнения ограничения получается условие, наложенное ограничением. (Правила предвыполнения ограничения таковы, что выражения и диапазоны ограничений вычисляются при предвыполнении всех этих ограничений.) Правила определения совместимости даны в соответствующих разделах для каждой формы ограничения. Эти правила таковы, что если ограничение совместимо с подтипом, то наложенное ограничением условие не может противоречить никакому условию, уже заданному для значений этого подтипа. В противном случае возбуждается исключение CONSTRAINT_ERROR.
Примеры описаний подтипов:
subtype RAINBOW is COLOR range RED .. BLUE; -- см. 1 subtype REOBLUE is RAINBOW; subtype INT is INTEGER; subtype SMALUNT is INTEGER range -10 .. 10; subtype UPTOK is COLUMN range 1 .. К; -- см. 1 subtype SQUARE is MATRIX(1 .. 10, 1 .. 10); -- см. 3.6 subtype MALE is PERSON(SEX => M); -- см. 3.8
. Описание подтипа не определяет нового типа.
Ссылки: базовый тип3, выражение 4.4, вычисление 4.5, дискриминант 3.3, зарезервированное слово 2.9, имя типа 1, исключение CONSTRAINT_ERROR 11.1, неограниченный подтип 3.3, ограничение диапазона 3.5, ограничение дискриминанта 2, ограничение индекса 1, ограничение плавающего типа 7, ограничение фиксированного типа 9, описание 3.1, подтип 3.3, предвыполнение 3.9, совместимость с ограничением диапазона 3.5, совместимость с ограничением дискриминанта 2, совместимость с ограничением индекса 1, совместимость с ограничением плавающего типа 7, совместимость с ограничением фиксированного типа 9, тип
3. КЛАССИФИКАЦИЯ ОПЕРАЦИЙ
Множество операций над типом включает явно описанные подпрограммы с параметромили результатом этого типа; такие подпрограммы необходимо описывать после описания типа.
Остальные операции неявно описываются сразу после каждого описания типа. К ним относятся базовые операции, предопределенные операции (см. 4.5) и литералы перечисления. Описанием производного типа неявно задаются операции, включающие производные подпрограммы. Считается, что описания операций расположены между описанием типа и последующим описанием, если таковое имеется. Неявные описания производных подпрограмм расположены последними. Базовыми операциями являются:
• Присваивание (в операторах присваивания и инициализациях), генератор, проверка принадлежности или форма управления с промежуточной проверкой.
• Именуемая компонента, индексируемая компонента или отрезок.
• Квалификация (в квалифицированных выражениях), явное преобразование типа или неявное преобразование значения типа универсальный-целый или универсальный-вещественный в соответствующее значение другого числового типа.
• Числовой литерал (для универсального типа), литерал null (для ссылочного типа), строковый литерал, агрегат или атрибут.
Для каждого типа или подтипа Т определен следующий атрибут:
Т'BASE | Базовый тип Т. Этот атрибут допустим только в качестве префикса имени другого атрибута, например T'BASE'FIRST. |
. Каждый литерал — это операция, в результате выполнения которой вырабатывается сооветствующее значение (см. 4.2). Подобно этому, агрегат — это операция, в результате выполнения которой вырабатывается значение составного типа (см. 4.3). Некоторые операции оперируют со значениями данного типа, например предопределенные операции и некоторые подпрограммы и атрибуты. Некоторые операции возвращают значение данного типа, например литералы и некоторые функции, атрибуты и предопределенные операции. Присваивание — это операция, которая оперирует с объектом и значением. В результате вычисления операции, соответствующей именуемой компоненте, индексируемой компоненте или отрезку, вырабатывается объект или значение, обозначенное этой формой имени.
Ссылки: агрегат 4.3, атрибут 4, генератор 4.8, именуемая компонента 3, индексируемая компонента 1., квалифицированное выражение 4.7, литерал 4.2, литерал перечисления 1, начальное значение 1, объект 1, 3.2, описание типа 1, отрезок 2, подпрограмма 6, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 2, производная подпрограмма 3.4, пустой литерал 3.8, символьный литерал 2.5, составной тип 3.3, строковый литерал 2.6, тип 3.3, универсальный вещественный тип 6, универсальный тип 4.10, универсальный целый тип 4, управление с промежуточной проверкой 4.5, 1, формальный параметр 6.1, функция 6.5, числовой литерал 2.4, числовой тип