Справочное руководство по языку Ада-83

         

Агрегаты


Агрегат — это базовая операция, которая объединяет значения компонент в составное значение именуемого или индексируемого типа.

агрегат ::= (сопоставление-компонент {, сопоставление-компонент}) сопоставление-компонент ::= [выбор { | выбор} = > ] выражение

Каждое сопоставление компонент связывает выражение с компонентами. Сопоставление компонент называется именованным, если компоненты явно определены выборами, и позиционным в противном случае. При позиционном сопоставлении каждой отдельно взятой компоненте неявно соответствует некоторая позиция: именуемым компонентам — в порядке следования их описаний, индексируемым компонентам — по возрастанию индекса.

Именованные сопоставления могут стоять в произвольном порядке (исключая выбор others), но если в агрегате одновременно используются позиционные и именованные сопоставления, то первыми должны стоять позиционные сопоставления, каждое на своем месте. Следовательно, за именованными сопоставлениями в агрегате могут следовать только именованные сопоставления. В агрегатах, содержащих единственное сопоставление, должно всегда использоваться именованное сопоставление. Правила для сопоставления компонент агрегатов именуемого типа и агрегатов индексируемого типа определены в разд. 1 и 2.

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

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

Тип агрегата должен быть определим исключительно из контекста, в котором встречается агрегат, без учета самого агрегата, используя только тот факт, что его тип должен быть составным и нелимитированным. Тип агрегата в свою очередь определяет требуемый тип для каждой его компоненты.



Примечание. Приведенное выше правило означает, что для определения типа агрегата не может быть использована информация, которую несет в себе агрегат. В частности, это определение не может использовать тип выражения в сопоставлении компонент, формы или типы выборов. Агрегат с одной компонентой всегда можно отличить от выражения, заключенного в скобки, благодаря обязательному именованию компоненты такого агрегата.

Ссылки: агрегат записи 1, агрегат массива 2, базовая операция типа 3, выбор 3, выражение 4.4, дискретный диапазон 3.6, именуемый тип 3.7, индекс 3.6, индексируемый тип 3.6, компонента 3.3, лимитируемый тип 4, первичное 4.4, простое выражение 4.4, простое имя 4.1, раздел вариантов 3, составное значение 3.3, составной тип 3.3, тип

1. АГРЕГАТЫ ЗАПИСЕЙ

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

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

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

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

(4, JULY, 1776) -- см. 3.7 Примеры агрегатов записи с именованными сопоставлениями:(DAY => 4, MONTH => JULY, YEAR => 1776) (MONTH => JULY, DAY => 4, YEAR => 1776)(DISK, CLOSED, TRACK => 5, CYLINDER => 12) -— см. 3 (UNIT => DISK, STATUS => CLOSED, CYLINDER => 9, TRACK => 1) Примеры сопоставления компонент с несколькими выборами:(VALUE => 0, SUCCIPRED => new CELL'IO, null, null)) —- см. 1—- Генератор вычисляется дважды: SUCC и PRED обозначают разные ячейки

Примечание: В агрегате с позиционными сопоставлениями первыми идут значения дискриминантов, так как раздел дискриминантов идет первым в описании именуемого типа; они должны быть в том же порядке, что и в разделе дискриминантов.

Ссылки: агрегат 4.3, в некотором порядке 1.6, возбуждение исключения 11, выбор 3, выражение 4.4, вычисление 4.5, генератор 4.8, дискриминант 3.3, зависит от дискриминанта 1, именуемый тип 3.7, имя компоненты 3.7, исключение CONSTRAINT_ERROR 11.1, компонента записи 3.7, ограничение 3.3, подкомпонента 3.3, подтип 2, программа 10, раздел вариантов 3, раздел дискриминантов 1, сопоставление компонент 4.3, статическое выражение 4.9, тип 3.3, удовлетворять

2. АГРЕГАТЫ МАССИВОВ

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

Если тип агрегата — многомерный индексируемый тип, то n-мерный агрегат записывается как одномерный, в котором выражения, задающие сопоставления компонент, сами записываются как (n - 1)-мерный агрегат, называемый подагрегатом; подтип индекса одномерного агрегата задается первой позицией индекса индексируемого типа. То же правило используется для следующей позиции индекса при записи подагрегатов, если они опять многомерные. В многомерном агрегате допустимо использование строкового литерала в качестве одномерного массива символьного типа. В дальнейшем связанные с агрегатами массивов правила формулируются в терминах одномерных агрегатов.

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

Границы агрегата массива, имеющего выбор others, определяются соответствующим ограничением индекса. Использование выбора others допускается только тогда, когда агрегат находится в одном из следующих контекстов (контекст определяет соответствующее ограничение индекса):

а) Агрегат — это фактический параметр, фактический параметр настройки, выражение, являющееся результатом функции, или выражение, которое следует за составным ограничителем присваивания, и подтип соответствующего формального параметра, формального параметра настройки, результат функции или объекта — ограниченный индексируемый подтип.

Для агрегата, помещенного в такой контекст и содержащего сопоставление с выбором others, другие именованные сопоставления допускаются только в случае фактического параметра (не являющегося фактическим параметром настройки) или результата функции. Если' агрегат — многомерный массив, то это ограничение распространяется и на все подагрегаты.

б) Агрегат — это операнд квалифицированного выражения, обозначение типа которого указывает ограниченный индексируемый подтип.

в) Агрегат — это выражение в сопоставлении компонент другого агрегата индексируемого или именуемого типа, и если этот объемлющий агрегат — многомерный агрегат индексируемого типа, то сам он заключен в один из этих трех видов контекста.

Границы агрегата массива без выбора otners определяются следующим образом. Для агрегата с именованными сопоставлениями границы определяются наименьшим и наибольшим из заданных выборов. Нижняя граница позиционного агрегата определяется соответствующим ограничением индекса, если агрегат помещен в один из контекстов а), б) или в); в противном случае нижняя граница задается как S'FIRST, где S — подтип индекса; в обоих случаях верхняя граница определяется числом компонент.

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

При вычислении непустого агрегата массива производится проверка того, что значения задаваемых выборами индексов принадлежат соответствующему подтипу индекса, а также того, что значение каждой подкомпоненты агрегата принадлежит подтипу этой подкомпоненты. Для n-мерного агрегата производится проверка того, что все (n - 1)-мерные подагрегаты имеют одинаковые границы. Если хотя бы одна из этих проверок дает отрицательный результат, возбуждается исключение CONSTRAINT_ERROR.

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

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

(7, 9, 5, 1, 3, 2, 4, 8, 6, 0) ТАВLЕ'(5, 8, 4,1, others => 0) -- см. 3.6

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

(1 .. 5 => (1 .. 8 => 0.0)) —- двумерный (1 .. N => new CELL) -— N новых ячеек, в частности для N = 0ТАВLЕ'(2 | 4 | 10 => 1, others => 0) SСHEDULE'(MON .. FRI => TRUE, others => FALSE) --см. 3.6 SCHEDULE'(WED | SUN => FALSE, others => TRUE )

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

-- три агрегата с одним значением типа MATRIX, см. 3.6((1.1, 1.2, 1.3), (2.1, 2.2, 2.3)) (1 => (1.1, 1.2, 1.3), 2 => (2..1. 2.2, 2.3)) (1 ==> (1 => 1.1, 2 => 1.2, 3 => 1.3), 2 => (1 => 2.1, 2 => 2.2, 3 => 2.3))

Примеры агрегатов в качестве значений инициализации:

А : TABLE := (7, 9, 5, 1, 3, 2, 4, 8, 6, 0); -- А(1)=7, А(10)=0 В : TABLE := ТАВLЕ'(2 | 4 | 10 => 1, others => 0); -- В(1)=0, В(10)=1 С : constant MATRIX := (1 .. 5 => (1 .. 8 => 0.0)); -- С'FIRSТ(1)=1, С'LАSТ(2)=8D : BIT_VECTOR(M .. N) := (M .. N => TRUE); -- см. 3.6 E : BIT_VECTOR(M .. N) := (others => TRUE); F : STRING(1 .. 1) := (1 => 'F'); --однокомпонентный агрегат:то же, что и <F>

Ссылки: агрегат 4.3, в некотором порядке 1.6, возбуждение исключений 11, выбор 3, выражение 4.4, вычислить 4.5, диапазон индекса 3.6, именованное сопоставление компонент 4.3, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, квалифицированное выражение 4.7, компонента 3.3, объект 3.2, ограничение 3.3, ограничение индекса 1, ограниченный индексируемый подтип 3.6, подкомпонента 3.3, подтип индекса 3.6, позиционное сопоставление компонент 4.3, пустой массив 1, размерность 3.6, сопоставление компонент 4.3, составной ограничитель присваивания 5.2, статическое выражение 4.9, тип 3.3, тип индекса 3.6, тип компоненты 3.3, фактический параметр 1, формальный параметр 6.1, функция



Генераторы


Вычисление генератора создает объект и вырабатывает ссылочное значение, которое указывает на этот объект.

генератор ::= new указатель-подтипа | new квалифицированное - выражение

Тип порожденного генератором объекта — это базовый тип обозначения типа, заданного либо в указании подтипа, либо в квалифицированном выражении. Для генератора с квалифицированным выражением это выражение задает начальное значение создаваемого объекта. Тип ссылочного значения, вырабатываемого генератором, должен быть определимым только из контекста с учетом того, что это значение является ссылкой на указанный в генераторе тип.

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

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

При вычислении генератора сначала производится предвыполнение указания подтипа или вычисление квалифицированного выражения. Затем создается новый объект. Далее осуществляется инициализация, как для описанного объекта (см. 1): явно — для квалифицированного выражения, неявно — для указания подтипа. Наконец, возвращается ссылочное значение, указывающее на созданный объект.

Реализация должна гарантировать сохранение объекта, созданного при вычислении генератора, до тех пор, пока объект, или хотя бы одна из его подкомпонент, доступен непосредственно или косвенно, т. е. пока он может быть обозначен некоторым именем. Кроме того, если объект или одна из его подкомпонент принадлежит задачному типу, он считается доступным, пока не завершена эта задача. Реализация может (но не обязана) освобождать память, занятую объектом, созданным генератором, как только этот объект становится недоступным.

В случаях когда требуется более точное управление распределением памяти под указанные значениями ссылочного типа объекты, оно может быть обеспечено следующими средствами:

а. Общий объем памяти, доступный для набора объектов ссылочного типа, может быть установлен с помощью спецификатора длины (см. 13.2).

б. Прагма CONTROLLED указывает реализации на то, что для объектов, указанных значениями ссылочного типа, автоматическое возвращение памяти производиться не должно, исключая случаи выхода из самого вложенного оператора блока, тела подпрограммы или тела задачи, содержащих описание этого ссылочного типа, или выхода из главной программы.

pragma CONTROLLED (простое-имя-ссылочного-типа);

Эта прагма для данного ссылочного типа допустима в тех же местах, что и спецификатор представления этого типа (см. 13.1).

в. Явного освобождения памяти, занимаемой объектом, указанным ссылочным значением, можно достичь вызовом процедуры, полученной настройкой предопределенной библиотечной процедуры UNCHECKED_DEALLOCATION (см. 1). /

При исчерпании памяти генератором возбуждается исключение STORAGE_ERROR. Заметим также, что исключение CONSTRAINT_ERROR может быть возбуждено при вычислении квалифицированного выражения, во время предвыполнения указания подтипа или при инициализации.

Примеры (ссылочных типов, описанных в разд. 3.8):

new CELL'(0, null, null) -- явная инициализация new CELL'(VALUE => 0, SUCC => null, PRED => null) -- явная инициализация new CELL -- нет инициализацииnew MATRIX(1 .. 10, 1 .. 20) -- даны только границы new MATRlX'(1 .. 10 => (1 .. 20 => 0.0)) -— явная инициализацияnew BUFFER(100) -- дан только дискриминант new BUFPER'(SIZE => 80, POS => 0, VALUE => (1 .. 80 => 'А')) -- явная инициализация

Ссылки: библиотечный модуль 10.1, возбуждение исключений 11, вычисление квалифицированного выражения 4.6, главная программа 10.1, граница массива 1, дискриминант 3.3, завершенная задача 9.4, задачный тип 9.2, имя 4.1, индексируемый тип 3.6, инициализация 1, исключение CONSTRAINT_ERROR 11.1, исключение STORAGE_ERROR 11.1, квалифицированное выражение 4.7, конкретизация 12.3, контекст разрешения совмещения 8.7, набор 3.8, настраиваемая процедура 12.1, начальное значение 1, обозначение типа 2, объект 1, ограничение 3.3, ограничение дискриминанта 2, ограничение индекса 1, ограниченный подтип 3.3, оператор блока 5.6, описание объекта 1, описание типа 1, определение ссылочного типа 3.8, подкомпонента 3.3, подтип 3.3, прагма 2.8, предвыполнение 3.9, производный тип 3.4, простое имя 4.1, процедура 6, спецификатор длины 13.2, спецификатор представления 13.1, ссылочное значение 3.8, ссылочный тип 3.8, тело задачи 9.1, тело подпрограммы 6.7, тип 3.3, тип с дискриминантами 3.3, указание подтипа 2, указывать



Имена


Имена могут обозначать понятия, описанные явно или неявно (см. 3.1). Имена могут обозначать также объекты, указанные ссылочными значениями, подкомпоненты и отрезки объектов и значений, одиночные входы, семейства входов и входы семейства входов. Наконец, имена могут обозначать атрибуты этих понятий и объектов.

имя ::= простое-имя | символьный-литерал | знак-операции | индексируемая-компонента | отрезок | именуемая-компонента | атрибут простое-имя ::= идентификатор префикс ::= имя | вызов-функции

Простое имя понятия — это либо идентификатор, связанный с понятием описанием, либо другой идентификатор, связанный с понятием описанием переименования.

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

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

Говорят, что префикс соответствует некоторому типу в одном из следующих случаев:

• Тип префикса — это рассматриваемый тип.

• Тип префикса — ссылочный тип, который указывает на рассматриваемый тип. Вычисление имени определяет понятие, обозначенное этим именем. Для простого имени, символьного литерала или знака операции вычисление имени не имеет другого результата.

Вычисление имени, имеющего префикс, включает в себя вычисление префикса, т. е. соответствующего имени или вызова функции. Если тип префикса — ссылочный тип, то вычисление префикса включает в себя определение объекта, указанного соответствующим ссылочным значением; если значение префикса является пустым ссылочным значением, исключая случай префикса атрибута представления (см. 2), то возбуждается исключение CONSTRAINED-ERROR (см. 2).

Примеры простых имен:

Pl - - простое имя числа (см. 1)
LIMIT - - простое имя константы (см. 1)
COUNT - - простое имя скалярной переменной (см. 1)
BOARD - - простое имя массива (см. 1)
MATRIX - - простое имя типа (см. 3.6)
RANDOM - - простое имя функции (см. 6.1)
ERROR - - простое имя исключения (см. 11.1)

Ссыпки: атрибут 4, вид 6.1, возбуждение исключения 11, .вход 9.5, вызов функции o.t, вычисление 4.5, знак операции 6.1, идентификатор 2.3, именуемая компонента 3, индексируемая компонента 1, исключение CONSTRAINT-ERROR 11.1, компонента 3.3, объект 1, описание 3.1, описание переименования 8.5, отрезок 2, подкомпонента 3.3, понятие 3.1, принадлежит типу 3.3, ссылочное значение null 3.8, семейство входов 9.5, символьный литерал 2.5, ссылочное значение 3.8, ссылочный тип 3.8, тип 3.3, формальный параметр 6.1, указанный тип 3.8, указывать

1. ИНДЕКСИРУЕМЫЕ КОМПОНЕНТЫ

Индексируемая компонента обозначает компоненту массива или вход семейства входов.

индексируемая-компонента ::= префикс(выражение (, выражение))

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

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

Примеры индексируемых компонент:

MY-SCHEDULEtSAT) - - компонента одномерного массива (см. 1)
РАПЕ(10) - - компонента одномерного массива (см. 3.6)
BOARD(M, J + 1) - - компонента двумерного массива (см. 1)
PAGE(10) (20) - - компонента компоненты (см. 3.6)
REQUESTfMEDIUM) -- вход семейства входов (см. 9.5)
NEXT_FRAME(L) (M, N) - - компонента вызова функции (CM. 6.1)

Примечание к примеру. Для компонент многомерных массивов (таких, как BOARD) и массива массивов (таких, как PAGE) используются различные обозначения. Компонентами массива массивов являются массивы, и они могут быть индексированы. Так, РАGЕ(10) (20) задает двадцатую компоненту массива РАGЕ(10). В последнем примере NEXT_FRAME(L) — вызов функции, возвращающей ссылочное значение, указывающее двумерный массив.

Ссылки: возбуждение исключения 11, возвращаемое значение 5.8, 6.5, вход 9.5, вызов функции 6.4, выражение 4.4, вычисление 4.5, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента 3.3, компонента массива 3.6, объект задачного типа 9.2, префикс 4.1, размерность 3.6, семейство входов 9.5, соответствует типу

2. ОТРЕЗКИ

Отрезок обозначает одномерный массив нескольких последовательных компонент одномерного массива. Отрезок переменной — переменная, отрезок константы — константа, отрезок значения — значение.

отрезок ::= префикс(дискретный-диапазон)

Префикс отрезка должен соответствовать одномерному индексируемому типу. Тип отрезка — это базовый тип этого индексируемого типа. Границы дискретного диапазона определяют границы отрезка и должны быть того же типа, что и тип индекса; отрезок является пустым, т. е. обозначает пустой массив, если дискретный диапазон является пустым.

Порядок вычисления префикса и дискретного диапазона при вычислении имени отрезка в языке не определяется. Если при вычислении отрезка хотя бы одна из границ дискретного диапазона не принадлежит диапазону индексов, определяемому префиксом отрезка, то (кроме случая пустого отрезка) возбуждается исключение CONSTRAINT_ERROR. (Границы пустого отрезка могут не принадлежать подтипу индекса.)

Примеры отрезков:

SТАRS(1..15) - - отрезок из 15 символов (см. 3)
РАGЕ(10..10 + SIZE) - - отрезок из (1 + SIZE) компонент (см. 3.6 и 1)
РАGЕ(L) (А..В) - - отрезок массива РАОЕ(1) (см. 3.6)
SТАRS(1..0) - - пустой отрезок (см. 3)
MY_SCHEDULE(WEEKDAY) - - границы задаются подтипом (см. 3.6 и 1)
SТАRS(5..15) (К) - - аналогично SТАRS(К), если К
- - в диапазоне 5..15 (см. 3.6)

Примечание. Для одномерного массива А имя A(N..N) задает отрезок, состоящий из одной компоненты; его тип соответствует базовому типу массива А. С другой стороны, A(N) — компонента массива и имеет соответствующий тип.

Ссылки: базовый тип 3.3, возбуждение исключения 11, вычисление 4.5, граница дискретного диапазона 1, диапазон индекса 3.6, дискретный диапазон 3.6, значение массива 3.8, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента 3.3, константа 1, массив 3.5, ограничение 3.3, переменная 1, префикс 4.1, принадлежит подтипу 3.3, пустой диапазон 3.5, пустой массив 1, размерность 3.6, соответствует типу 4.1, тип 3.3, тип компоненты

3. ИМЕНУЕМЫЕ КОМПОНЕНТЫ

Именуемые компоненты используются для обозначения компонент записей, входов, семейств входов и объектов, указанных ссылочными значениями; они используются также в качестве расширенных имен, как это описано ниже.

именуемая-компонента ::= префикс.постфикс постфикс ::= простое-имя | символьный-литерал | знак-операции | all

Для обозначения дискриминанта, компоненты записи, входа или объекта, указанного ссылочным значением, используются следующие четыре формы именуемых компонент:

а. Дискриминант.

Постфикс должен быть простым именем, обозначающим дискриминант объекта или значения. Префикс должен соответствовать типу этого объекта или значения.

б. Компонента записи.

Постфикс должен быть простым именем, обозначающим компоненту именуемого объекта или значения. Префикс должен соответствовать типу этого объекта или значения. Для компонент варианта делается проверка: являются ли значения дискриминантов такими, что запись имеет эту компоненту. В противном случае возбуждается исключение CONSTRAINT_ERROR.

в. Одиночный вход или семейство входов задачи.

Постфикс должен быть простым именем, обозначающим одиночный вход или семейство входов задачи. Префикс должен соответствовать типу этой задачи.

г. Объект, указанный ссылочным значением.

Постфикс должен быть зарезервированным словом аll. Значение префикса должно принадлежать ссылочному типу.

Именуемая компонента одной из двух нижеуказанных форм называется расширенным именем. В каждом случае постфикс должен быть либо простым именем, либо символьным литералом, либо знаком операции. Вызов функции в качестве префикса расширенного имени не допускается. Расширенное имя может обозначать:

д. Понятие, описанное в видимом разделе описания пакета.

Префикс должен обозначать пакет. Постфикс должен быть простым именем, символьным литералом или знаком операции понятия.

е. Понятие, описание которого находится непосредственно в поименованной конструкции.

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

Данная форма расширенного имени допустима только в самой конструкции (включая тело и любые субмодули в случае программного модуля). Не допускается использование в качестве префикса имен, описанных с помощью описания переименования. Если префикс — это имя подпрограммы или оператора принятия и если существует более одной видимой объемлющей подпрограммы или оператора принятия с таким именем, то расширенное имя не определено, независимо от постфикса.

Если в соответствии с правилами видимости возможна по крайней мере одна интерпретация префикса именуемой компоненты как имени объемлющей подпрограммы или оператора принятия, то рассматриваются только те интерпретации, которые соответствуют правилу е, т. е. расширенные имена. (Интерпретация префикса как вызова функции не рассматривается).

Вычисление имени, являющегося именуемой компонентой, включает вычисление префикса.

Примеры именованных компонент:

TOMORROW.MONTH -- компонента записи (см. 3.7) NEXT_CAR.OWNER -- компонента записи (см. 1) NEXT_CAR.OWNER.AGE -- компонента записи (см. 1) WRITER.UNIT -- компонента записи (дискриминант) (см. 3) MIN_CELL(H).VALUE -- компонента записи результата -- вызова функции (см. 6.1 и 1) CONTROL.SEISE -- вход задачи CONTROL (см. 9.1 и 9.2) РOOL(К).WRIТЕ -- вход задачи РООЦК) (см. 9.1 и 9.2) NEXT_CAR.all -- объект, указанный ссылочной пере- -- менной NEXT-CAR (см. 1)

Примеры расширенных имен:

TABLE_MANAGER.INSERT -- процедура видимого раздела пакета (см. 7.5) КЕY_МАNАGЕR."<" -- операция видимого раздела пакета (см. 2) DOT_PRODUCT.SUM -- переменная, описанная в теле процедуры (см. 6.5) BUFFER.POOL -- переменная, описанная в задачном модуле (см. 9.12) BUFFER.READ -- вход задачного модуля (см. 9.12) SWAP.TEMP -- переменная оператора блока (см. 5.6) STANDARD.BOOLEAN -- имя предопределенного типа (см. 8.6 и приложение С)

Примечание. Для записей, компонентами которых являются другие записи, перечисленные правила означают, что простое имя должно быть дано для каждого уровня имени подкомпоненты. Например, имя NEXT_CAR.OWNER.BIRTH.MONTH не может быть укорочено (имя NEXT_CAR.OWNER.MONTH недопустимо).

Ссылки: вариант 3, видимость 8.3, видимый раздел 3, возбуждение исключений 11, вход 9.5, вызов функции 6.4, дискриминант 3.3, задача 9, задачный модуль 9, запись 3.7, зарезервированное слово 2.9, знак операции 6.1, именуемая компонента 3.7, индекс 3.6, исключениеCONSTRAINT_ERROR 11.1, компонента записи 3.7, непосредственно входит в 8.1, объект 1, объект задачного типа 9.2, оператор блока 5.6, оператор принятия 9.5, оператор цикла 5.5, операция 4.5, описание 3.1, описание переименования 8.5, пакет 7, переменная 3, подпрограмма 6, понятие 3.1, предопределенный тип С, префикс 4.1, программный модуль 6, простое имя 4.1, семейство входов 9.5, символьный литерал 2.5, совмещение 8.3, соответствует типу 4.1, субмодуль 10.2, ссылочное значение 3.8, ссылочный тип 3.8, тело программного модуля 3.9, тело процедуры 6.3, указывать

4. АТРИБУТЫ

Атрибут обозначает базовую операцию над понятием, задаваемым префиксом.

атрибут ::= префикс'обозначение-атрибута обозначение-атрибута :: = простое-имя [(универсальное_статическое_выражение)]

Применимые обозначения атрибутов зависят от конкретного префикса. Атрибут может быть базовой операцией, вырабатывающей значение, но может быть и функцией, типом или диапазоном. Смысл префикса атрибута должен быть определим независимо от обозначения атрибута и независимо от того, что это есть префикс именно атрибута.

Определенные в языке атрибуты приведены в приложении А. Конкретная реализация может ввести дополнительные атрибуты, описание которых должно быть дано в приложении F. Обозначения таких атрибутов должны отличаться от обозначений атрибутов, определенных в языке.

Вычисление имени, являющегося атрибутом, состоит из вычисления префикса.

Примечание. Обозначения атрибутов DIGITS, DELTA и RANGE им&ют идентификаторы, совпадающие с зарезервированными словами. Однако неоднозначность устранится, если перед обозначением атрибута будет стоять апостроф. Единственными предопределенными обозначениями атрибутов, содержащими универсальное выражение, являются те, которые соответствуют некоторым определенным операциям типа над индексируемыми типами (см. 2).

Примеры атрибутов:

COLOR'FIRST -- минимальное значение перечислимого типа -- COLOR (см. 1 и 3.5) RAINBOW'BASE'FIRST -- то же, что и атрибут COLOR'FIRST (см. 2 и 3) REAL'DIGITS -- точность типа REAL (см. 7 и 8) BOARD'LAST(2) -- верхняя граница диапазона 2-го индекса -- для BOARD (см. 1 и 2) BOARD'RANGE(1) -- диапазон первого индекса для BOARD (см. 1 и 2) POOL(K).TERMINATED -- TRUE, если задача РООL(К) завершена (см. 9.2 и 9.9) DATA'SIZE -- количество битов под записи типа DATA (см. 3.7 и 2) MESSAGE'ADDRESS -- адрес переменной MESSAGE именуемого типа (см. 2 и 2)

Ссылки: базовая операция 3, зарезервированное слово 2.9, имя 4.1, описанное понятие 3.1, префикс 4.1, простое имя 4.1, соответствует типу 4.1, статическое выражение 4.9, тип 3.3, универсальное выражение 4.10.



Квалифицированные выражения


Квалифицированное выражение используется для явного указания типа и, возможно, подтипа операнда, заданного выражением или агрегатом.

квалифицированное-выражение ::= обозначение-типа' (выражение) | обозначение-типа'агрегат

Тип операнда должен совпадать с базовым типом обозначения типа. Значение квалифицированного выражения — это значение операнда. Вычисление квалифицированного выражения выдает операнд и проверяет, принадлежит ли его значение подтипу, заданному в обозначении типа. При отрицательном результате проверки возбуждается исключениеCONSTRAINT_ERROR.



Литералы


Литерал — это либо числовой литерал, либо литерал перечисления, либо литерал null, либо строковый литерал, либо символьный литерал. Вычисление литерала вырабатывает соответствующее значение.

Числовые литералы — это литералы типов универсальный-целый и универсальный-вещественный. Литералы перечисления включают символьные литералы и вырабатывают значения соответствующих перечислимых типов. Литерал null вырабатывает пустое ссылочное значение, которое не указывает ни на какой объект вообще.

Строковый литерал — это базовая операция, которая преобразует последовательность символов в значение одномерного массива символьного типа; границы этого массива определяются в соответствии с правилами для позиционных агрегатов массива (см. 2). Для пустого строкового литерала верхняя граница массива совпадает с нижней границей предшествен-ника задаваемого атрибутом PRED. Вычисление пустого строкового литерала возбуждает исключение CONSTRAINT_ERROR, если нижняя граница не имеет предшественника (см. 5).

Тип строкового литерала и тип литерала null должны определяться исключительно из контекста, в котором эти литералы встречаются, без учета самого литерала, но используя при этом только тот факт, что литерал null — это значение ссылочного типа, а строковый литерал — значение одномерного массива, тип компонент которого — символьный.

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



Операции и вычисление выражения


В языке определяется шесть классов операций. При описании функций, определяющих пользовательские операции, 6 качестве обозначений могут быть использованы приведенные ниже знаки операций (исключая /=). Шесть классов операций приведены в порядке возрастания их старшинства.

логическая-операция ::= and | ог | xor операция-отношения ::= = | /= | <|<=|>|>= бинарная-аддитивная-операция ::= + | - | & унарная-аддитивная-операция ::= + | - мультипликативная-операция ::= * | / | mod | геm операция-высшего-приоритета ::= ** | abs | лоt

Формы управления промежуточной проверкой and then и ог else имеют тот же порядок старшинства, что и логические операции. Проверки принадлежности in и not in имеют то же старшинство, что и операции отношения.

В слагаемом, простом выражении, отношении или выражении группирование операций с их операндами проводится сначала для операций с большим старшинством, а затем для операций с меньшим старшинством. В случае последовательных операций с одинаковым старшинством группирование операций с их операндами производится в порядке их текстуального следования слева направо; для изменения порядка группирования могут использоваться скобки.

В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управленияпромежуточной проверки (но вычисление производится до применения соответствующей операции). Правый операнд формы управления промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 1).

Для каждой формы описания типа некоторые из перечисленных операций являются предопределенными, т. е. неявно вводятся описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именуется RIGHT. В разд. 1 — 7 поясняются результаты предопределенных операций.

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

Примеры старшинства:

not SUNNY or WARM -- совпадает с (not SUNNY) or WARM Х > 4.0 and Y > 0.0 -- совпадает с (X > 4.0) and (Y > 0.0) -4.0 * А ** 2 -- совпадает с -(4.0 * (А ** 2)) abs (1 + А) + В -- совпадает с (abs (1 + А)) + В Y ** (-3) -- скобки необходимы А/В * С -- совпадает с (А/В) * С А + (В + С) -- вычисляется В + С, а затем к результату -- прибавляется А

Ссылки: вещественный тип 6, в некотором порядке 1.6, возбуждение исключения 11, выражение 4.4, диапазон 3.5, имя 4.1, исключение NUMERIC-ERROR 11.1, множитель 4.4, неявное описание 3.1, обозначение 6.1, описание типа 1, отношение 4.4, проверка вхождения 2, простое выражение 4.4, слагаемое-4.4, совмещение 6.6, 8.7, тип 3.3, универсальный-вещественный тип 6, универсальный-целый тип 4, форма управления промежуточной проверкой 4.5, 1, хранимое число 6, целый тип 4.

1. ЛОГИЧЕСКИЕ ОПЕРАЦИИ И ФОРМЫ УПРАВЛЕНИЯ ПРОМЕЖУТОЧНОЙ ПРОВЕРКОЙ

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

Знак операции Операция Тип операнда Тип результата
and Конъюнкция Любой логический тип Массив логических компонент Тот же логический тип Тот же индексируемый тип
ог Дизъюнкция Любой логический тип Массив логических компонент Тот же логический тип Тот же индексируемый

тип

хог Исключающая дизъюнкция Любой логический

ТИП

Массив логических компонент

Тот же логический

Тот же индексируемый тип

Операции над массивами выполняются покомпонентно, если компоненты имеются (как для равенства, см. 2). Границы массива-результата совпадают с границами левого операнда. Для каждой компоненты левого операнда проверяется наличие соответствующей компоненты правого операнда, и наоборот. При нарушении соответствия компонент возбуждается исключение CONSTRAINT_ERROR.

Формы управления промежуточной проверкой and then и or else определены для двух операндов логического типа и вырабатывают результат того же самого типа. Левый операнд формы управления промежуточной проверкой всегда вычисляется первым. Если левый операнд выражения с формой and then дает значение FALSE, то правый операнд не вычисляется и значением выражения является FALSE. Если левый операнд с формой or else дает TRUE то правый операнд не вычисляется и значением выражения является TRUE. Если вычисляют ся оба операнда, то результат and then такой же, как and, а результат or else — как ог.

Примечание. Обычный смысл логических операций задается следующей таблицей истинности:

А В A and B A or B A xor B
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE FALSE TRUE TRUE
FALSE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE

Примеры логических операций:

SUNNY or WARM FILTER(1 .. 10) and FILTER(15 .. 24) -- см. 1

Примеры форм управления с промежуточной проверкой:

NEXT_CAR.OWNER /= null and then NEXT_CAR.OWNER.AGE > 25 N = 0 or else A(N) = HIT_VALUE -- см. 1

Ссыпки: возбуждение исключений 11, граница диапазона индекса 1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента массива 3.6, логический тип 3, логическое значение FALSE 3, логическое значение TRUE 3, операция 4.5, операция типа 3.3, подтип индекса 3.6, предопределенная операция 4.5, пустой массив 1, размерность 3.6, сопоставимые компоненты массивов 2, тип

2. ОПЕРАЦИИ ОТНОШЕНИЯ И ПРОВЕРКИ ПРИНАДЛЕЖНОСТИ

Операции равенство и неравенство предопределены для любого типа, не являющегося лимитируемым. Остальные операции отношения являются операциями упорядочивания:< (меньше), < = (меньше или равно), > (больше), > = (больше или равно). Операции упорядочивания предопределены для любого скалярного типа и любого дискретного индексируемого типа (одномерного индексируемого типа с компонентами дискретного типа). Операнды каждой предопределенной операции отношения имеют один и тот же тип. Тип результата — предопределенный тип — BOOLEAN.

Смысл операций отношения традиционный: результат равен TRUE, если соответствующее отношение удовлетворено, результат равен FALSE в противном случае. Операция нер-зенства дает результат, противоположный результату операции равенства: FALSE, если операнды равны; TRUE — если не равны.

Знак операции Операция Тип операнда Тип результата
= /= Равенство и неравенство Любой тип BOOLEAN
< < = > > = Проверка упорядоченности Любой скалярный

ТИП

BOOLEAN
Дискретный индексируемый ТИП BOOLEAN

Равенство для дискретных типов — это равенство значений. Результаты предопределенных операций отношения для вещественных операндов, значения которых равны приблизительно, приводятся в разд. 7. Два ссылочных значения равны, когда они указывают на один и тот же объект либо когда они равны пустому значению ссылочного типа.

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

Для сравнения двух записей одинакового типа сопоставленными компонентами являются компоненты [5] с одинаковыми идентификаторами компонент.

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

Если равенство явно определено для лимитируемого типа, оно не распространяется на составные типы, имеющие подкомпоненты лимитируемого типа (допускается явное определение равенства для таких составных типов).

Операции упорядочивания <, <= , > и >=, которые определены для дискретных индексируемых типов, соответствуют лексикографическому порядку, основанному на предопределенном отношении порядка для типов компонент. Пустой массив лексикографически меньше массива, имеющего по крайней мере одну компоненту. Для непустых массивов левый операнд лексикографически меньше правого операнда, если первая компонента левого операнда меньше первой компоненты правого операнда или если их первые компоненты равны, а хвост левого операнда лексикографически меньше правого (хвост состоит из оставшихся компонент, исключая первую, и может быть пустым).

Проверки принадлежности in и not in предопределены для всех типов. Типом результата является предопределенный тип BOOLEAN. Для проверки принадлежности диапазону простое выражение и границы диапазона должны быть одного и того же скалярного типа; для проверки принадлежности с обозначением типа тип простого выражения должен быть базовым для этого обозначения. Вычисление проверок принадлежности in вырабатывает результат TRUE, если значение простого выражения принадлежит данному диапазону или это значение принадлежит подтипу, заданному обозначением типа; в противном случае вычисление вырабатывает результат FALSE (для значений вещественного типа см. 7). Проверка принадлежности not in вырабатывает результат, противоположный результату проверки принадлежности in.



Преобразование типа


Вычисление явного преобразования типа — это вычисление выражения, заданного в качестве операнда, и преобразование результата в значение указанного целевого типа. Явные преобразования типов допустимы между взаимосвязанными типами.

преобразование-типа ::= обозначение-типа (выражение)

Целевой тип преобразования типа — это базовый тип обозначения типа. Тип операнда преобразования типа должен быть определимым независимо от контекста (в частности, независимо от целевого- типа). Более того, недопустимо, чтобы операнд преобразования типа был литералом null, генератором, агрегатом или строковым литералом; задание в качестве операнда преобразования типа выражения, заключенного в скобки, допускается, только если само выражение является допустимым.

Преобразование к подтипу состоит в преобразовании к целевому типу с последующей проверкой принадлежности результата этому подтипу. Допускается преобразование операнда заданного типа к тому же самому типу.

Другие явные преобразования типов допустимы в следующих трех случаях:

а. Числовые типы.

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

б. Производные типы.

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

в. Индексируемые типы.

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

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

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

Если допустимо преобразование одного типа в другой, то также допустимым является и обратное преобразование. Это обратное преобразование используется тогда, когда фактический параметр вида in out или out имеет форму преобразования типа имени (переменной), как это поясняется в разд. 1.

Единственной допустимой формой неявного преобразования типа является преобразование значения универсального-целого или универсального-вещественного типов в значение другого числового типа. Неявное преобразование операнда универсального-целого типа в другой целый тип или операнда универсального-вещественного типа в другой вещественный тип возможно только для операнда, являющегося либо числовым литералом, либо именованным числом, либо атрибутом; в этом разделе такой операнд называется преобразуемым универсальным операндом. Неявное преобразование преобразуемого универсального операнда применимо тогда и только тогда, когда самый сложный полный контекст (см. 8.7) определяет единственный (числовой) целевой тип для этого неявного преобразования и, кроме этого преобразования, не существует иной, предписанной языком правильной интерпретации этого контекста.

Примечание. Правила для неявных преобразований подразумевают, что для операнда явного преобразования типа не производится никаких неявных преобразований. Аналогично не производится никаких неявных преобразований для операндов предопределенных операций отношения, являющихся преобразуемыми универсальными операндами.

Для индексируемых типов в языке допускается неявное преобразование подтипов (см. 1). Последствием явного преобразования типа может быть изменение представления (в частности, см. 13.6). Явные преобразования используются также для фактических параметров (см. 6.4).

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

RЕАL(2 * J) -- значение преобразуется к плавающему типу INТЕGЕR(1.6) -- значение равно 2 INТЕGЕR(-0.4) -- значение равно 0

Примеры преобразования производных типов:

type A_FORM is new BFORM;X : AFORM; Y : BPORM;X := A_FORM(Y); Y := B_FORM(X); -- обратное преобразование

Примеры преобразования индексируемых типов:

type SEQUENCE is array (INTEGER range <>) of INTEGER: subtype DOZEN is SEQUENCE(1 .. 12); LEDGER : array(1 .. 100) of INTEGER;SEQUENCE(LEDGER) -- с границами как у LEDGER SEQUENCE(LEDGER(31 .. 42)) -- с границами 31—42 DOZEN(LEDGER(31 .. 42)) -- с границами как у DOZEN

Примеры неявных преобразований:

Х : INTEGER := 2; X + 1 + 2 -- неявное преобразование каждого целого литерала 1 + 2 + X -- неявное преобразование каждого целого литерала X + (1 + 2) -- неявное преобразование каждого целого литерала2 = (1 + 1) -- тип - универсальный-целый -- неявных преобразований нет A'LENGTH = B'LENGTH -- то же, что и выше С : constant := 3 + 2 -- то же, что и выше X = 3 and 1 = 2 -- неявное преобразование 3, но не 1 и 2

Ссылки: атрибут 4, базовый тип 3.3, вещественный тип 6, вид 6.1, возбуждение исключений 11, выражение 4.4, именованное число 3.2, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINED-ERROR 11.1, компонента 3.3, неограниченный индексируемый тип 3.6, обозначение типа 2, ограниченный индексируемый подтип 3.6, оператор 5, переменная 1, плавающий тип 7, подтип 3.3, подтип индекса 3.6, представление 13.1, принадлежать подтипу 3.3, производный тип 3.4, пустой массив 1, размерность 3.6, сопоставленная компонента 2, тип 3.3, тип индекса 3.6, универсальный вещественный тип 6, универсальный целый тип 4, фактический параметр 1, целый тип 4, числовой литерал 2.4, числовой тип



литерал перечисления 1, литерал целого



Примечание

3.14159_26536 - - литерал вещественного типа
1_345 - - литерал целого типа
КЛУБЫ - - литерал перечисления
'А' - - символьный литерал
"НЕКОТОРЫЙ_ТЕКСТ" - - строковый литерал

Ссылки: агрегат 4.3, видимость 8.3, граница массива 3.6, графический символ 2.1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, литерал вещественного типа 2.4, литерал перечисления 1, литерал целого типа 2.4, массив 3.6, объект 1, ссылочное значение null 3.8, пустой литерал 3.8, размерность 3.6, символьный литерал 2.5, символьный тип 2, ссылочный тип 3.8, строковый литерал 2.6, тип 3.3, тип компоненты 3.3, указывать 3.8, универсальный вещественный тип 6, универсальный целый тип 4, числовой литерал

если оба автомобиля идентичныN not



Примечание

X /= Y"" < "А" and "А" < "АА" -- TRUE "АА" < "В" and "А" < "А " -- TRUEMY_CAR = null --истина, если MY_CAR пуст (см. 1) MY_CAR = YOUR_CAR -- истина, если используется один и тот же автомобиль MY_CAR.all = YOUR_CAR.all -- истина, если оба автомобиля идентичныN not in 1..10 -- проверка принадлежности диапазону TODAY in MON .. FRI -- проверка принадлежности диапазону TODAY in WEEKOAY -- проверка принадлежности подтипу (см. 1) ARCHIVE in DISKUNIT -- проверка принадлежности подтипу (см. 3) Примечание. Предопределенные операции отношения и проверка принадлежности не возбуждают исключений, но исключение может быть возбуждено при вычислении операндов этих операций.
Если именуемый тип имеет компоненты, зависящие от дискриминантов, то компоненты двух значений сопоставлены тогда и только тогда, когда равны их дискриминанты. Компоненты непустых массивов сопоставлены, если и только если значения атрибута LENGTH(N) для каждой позиции индекса одинаковы у обоих массивов.
Ссылки: базовый тип 3.3, возбуждение исключения 11, вычисление 4.5, граница диапазона 3.5, диапазон 3.5, диапазон индекса 3.6, дискретный тип 3.5, идентификатор компоненты 3.7, именуемый тип 3.7, индекс 3.6, индексируемый тип 3.6, исключение 11, компонента 3.3, лимитируемый тип 4, обозначение типа 2, объект 1, операция 4.5, операция типа 3.3, подкомпонента 3.3, предопределенная операция 4.5, предопределенный логический тип 3, принадлежать подтипу 3.3, простое выражение 4.4, пустая запись 3.7, пустой массив 1, размерность 3.6, скалярный тип 3.5, следующий 5, составной тип 3.3, ссылочное значение 3.8, ссылочное значение null 3.8, тип 3.3, тип компоненты 3.3, указывать
3. БИНАРНЫЕ АДДИТИВНЫЕ ОПЕРАЦИИ
Бинарные аддитивные операции + и - предопределены для любого числового типа и имеют свой обычный смысл. Операция катенации & предопределена для любого одномерного нелимитируемого индексируемого типа.
Знак Операция Тип левого Тип правого Тип результата
операции операнда операнда
+ сложение Любой числовой ТИП Тот же числовой ТИП Тот же числовой ТИП
- вычитание Любой числовой ТИП Тот же числовой ТИП Тот же числовой ТИП
& катенация Любой индексируемый
ТИП
Тот же индексируемый
ТИП
Тот же индексируемый
ТИП
Любой индексируемый
ТИП
Тип компоненты Тот же индексируемый
ТИП
Тип компоненты Любой индексируемый
ТИП
Тот же индексируемый
ТИП
Тип компоненты Тип компоненты Любой индексируемый
ТИП

Для вещественных типов точность результата определяется типом операндов (см. 7).
Если оба операнда — одномерные массивы, то результатом катенации является одномерный массив, длина которого равна сумме длин операндов, а его компоненты составлены из компонент левого операнда и следующих за ними компонент правого операнда. Нижняя граница этого результата совпадает с нижней границей левого операнда, если левый операнд — не пустой массив; в противном случае результатом катенации является правый операнд.
Если один из операндов имеет тип компоненты индексируемого типа, то результат катенации определяется по приведенным выше правилам, где вместо этого операнда используется массив, имеющий этот операнд в качестве своей единственной компоненты, и с нижней границей, совпадающей с нижней границей подтипа индекса.
Операцией катенации возбуждается исключение CONSTRAINT_ERROR, если верхняя граница результата выходит за диапазон подтипа индекса, кроме того случая, когда результат — не пустой массив, а также когда какой-либо операнд, тип которого есть тип компоненты, имеет значение, не принадлежащее данному подтипу компоненты.

вещественный тип 6, возбуждение исключений



Примечание

Z + 0.1 -- Z должен иметь вещественный тип "А" & "BCD" -- катенация двух строковых литералов 'А' & "BCD" -- катенация символьного и строкового -- литералов 'А' & 'А' -- катенация двух символьных литералов
Ссылки: вещественный тип 6, возбуждение исключений 11, диапазон подтипа индекса 1, длина массива 2, индексируемый тип 3.6, исключение CONSTRAINT-ERROR 11.1, лимитируемый тип 4, операция 4.5, операция типа 3.3, подтип индекса 3.6, предопределенная операция 4.5, пустой массив 1, размерность 3.6, символьный литерал 2.5, строковый литерал 2.6, тип 3.3, тип компоненты 3.3, числовой тип
4. УНАРНЫЕ АДДИТИВНЫЕ ОПЕРАЦИИ
Унарные аддитивные операции + и - предопределены для любого числового типа и имеют свой обычный смысл. Для этих операций операнд и результат имеют один и тот же тип.
Знак операции Операция Тип операнда Тип результата
+ Сохранение знака Любой числовой тип Тот же числовой тип
- Изменение знака Любой числовой тип Тот же числовой тип

Ссылки: операция 4.5, операция типа 3.3, предопределенная операция 4.5, тип 3.3, числовой тип
5. МУЛЬТИПЛИКАТИВНЫЕ ОПЕРАЦИИ
Операции • и / предопределены для любого целого и любого плавающего типа и понимаются в обычном смысле. Операции mod и геm предопределены для любого целого типа. Для каждой из этих операций операнды и результат имеют один и тот же базовый тип. Для плавающих типов точность результата определяется типом операндов (см. 7).
Знак операции Операция Тип операнда Тип результата
* Умножение Любой целый тип Тот же целый тип
- Любой плавающий тип Тот же плавающий тип
/ Деление нацело Любой целый тип Тот же целый тип
Деление плавающих Любой плавающий тип Тот же плавающий тип
mod Вычет по модулю Любой целый тип Тот же целый тип
rem Остаток Любой целый тип Тот же целый тип

Деление нацело и остаток связаны следующим соотношением:
А = (А/В)*В + (А rem В)
где (А rem В) имеет знак значения А и абсолютное значение, меньшее абсолютного значения В. Деление нацело удовлетворяет следующему тождеству:
(-А)/В = -(А/В) = А/(-В)
Результат операции вычета по модулю таков, что (А mod В) имеет знак значения В и абсолютное значение, меньшее абсолютного значения В, и существует целое значение N такое, что должно удовлетворяться следующее соотношение:
А = В . N + (А mod В)
Для каждого фиксированного типа предопределены операции умножения и деления на операнд предопределенного типа INTEGER.
Знак операции Операция Тип левого операнда Тип правого операнда Тип результата
* Умножение Любой фиксированный ТИП INTEGER Тип левого операнда
INTEGER Любой фиксированный ТИП Тип правого операнда
/ Деление Любой фиксированный ТИП INTEGER Тип левого операнда

Умножение значения фиксированного типа на целое эквивалентно повторению операции сложения. Деление значения фиксированного типа на целое является приближенным и не меняет типа (см. 7).
Две специальные операции умножения и деления, применимые к операндам любых фиксированных типов, описаны в предопределенном пакете STANDARD (они не могут быть переименованы или даны в качестве фактических параметров настройки).
Знак операции Операция * Тип левого операнда Тип правого операнда Тип результата
* Умножение Любой фиксированный ТИП Любой фиксированный ТИП Универсальный- фиксированный ТИП
/ Деление Любой фиксированный ТИП Любой фиксированный ТИП Универсальный - фиксированный ТИП

Операнды умножения могут быть одного и того же или различных фиксированных типов, а тип результата — анонимный предопределенный универсальный-фиксированный тип, дельта которого произвольно мала. Результат любого такого умножения всегда должен быть явно преобразован в значение некоторого числового типа. Это обеспечивает явное управление точностью вычислений. То же относится к делению значения фиксированного типа на значение фиксированного типа. Никакие другие операции для типа универсальный-фиксированный не определены.
Исключение NUMERIC_ERROR возбуждается операциями целого деления rem и mod, если правый операнд равен нулю.

Тот же, что тип F,



Примечание

I : INTEGER := 1; J : INTEGER := 2; К : INTEGER := 3;X : REAL diglts 6 := 1.0; — СМ. 7 Y : REAL diglts 6 := 2.0;F : FRACTION delta 0.0001 := 0.1; — СМ. 9 G : FRACTION delta 0.0001 := 0.1;
Выражение Значение Тип результата
I . J 2 Тот же, что тип I и J, т. е. INTEGER
K/J 1 Тот же, что тип К и J, т.е. INTEGER
К mod J 1 Тот же, что тип К и J, т. е. INTEGER
X/Y 0.5 Тот же, что тип Х и Y, т. е. REAL
F/2 0.05 Тот же, что тип F, т.е. FRACTION
3 *. F 0.3 Тот же, что тип F, т. е. FRACTION
F * G 0.01 Универсальный-фиксированный требуется
преобразование
FRACTION (F * G)0.01 FRACTION в результате преобразования  
REAL(J) * Y 4.0 REAL, как и тип обоих операндов после
преобразования

Примечание. Для положительных А и В частное задается выражением А/В, а остаток от деления А на В задается А rem В. Операция rem удовлетворяет следующим соотношениям:
А rem (-В) = А rem В (-А) rem В = -(А rem В) Для некоторого целого К справедливо следующее тождество:
А mod В = (А + К*В) mod В
Соотношения между делением нацело, остатком и вычетом по модулю иллюстрируются следующей таблицей:
А В А/В А rem В A mod B А В А/В А rem В A mod B
10 5 2 0 0 -10 5 -2 0 0
11 5 2 1 1 -11 5 -2 -1 4
12 5 2 2 2 -12 5 -2 -2 3
13 5 2 3 3 -13 5 -2 -3 2
14 5 2 4 4 -14 5 -2 -4 1
10 -5 -2 0 0 -10 -5 2 0 0
11 -5 -2 1 -4 -11 -5 2 -1 -1
12 -5 -2 2 -3 -12 -5 2 -2 -2
13 -5 -2 3 -2 -13 -5 2 -3 -3
14 -5 -2 4 -1 -14 -5 2 -4 -4

Ссылки: базовый тип 3.3, возбуждение исключений 11, дельта фиксированного типа 9, исключение NUMERIC_ERROR 11.1, описание 3.1, описание переименования 8.5, плавающий тип 7, предопределенная операция 4.5, предопределенный пакет STANDARD 8.6, преобразование типа 4.6, фактический параметр 1, фиксированный тип 9, формальная подпрограмма настройки 12.1, целый тип 4, числовой тип
6. ОПЕРАЦИИ ВЫСШЕГО ПРИОРИТЕТА
Унарная операция высшего приоритета abs предопределена для любого числового типа. Унарная операция высшего приоритета not предопределена для любого логического типа и одномерного индексируемого типа с компонентами логического типа.
Знак операции Операция Тип операнда Тип результата
abs Абсолютное значение Любой числовой тип Тот же числовой тип
not Логическое отрицание Любой логический тип Тот же логический тип
Массив с логическими компонентами Тот же индексируемый тип

Операция поt, применяемая к одномерному массиву с логическими компонентами, вырабатывает одномерный логический массив с теми же самыми границами; каждая компонента результата получается как логическое отрицание соответствующей компоненты операнда (т. е. компоненты с тем же значением индекса).
Операция возведения в степень »• предопределена для каждого целого и для каждого плавающего типов. В обоих случаях правый операнд, называемый показателем степени, имеет предопределенный тип INTEGER.
Знак операции Операция Тип левого операнда Тип правого операнда Тип результата
** Возведение в степень Любой целый тип INTEGER Тип левого операнда
Любой плавающий тип INTEGER Тип левого операнда

Возведение в степень с положительным показателем эквивалентно кратному умножению левого операнда на себя слева направо в соответствии со значением показателя. Для операнда плавающего типа порядок может быть отрицательным, в этом случае результат — обратная величина результата с положительной степенью. Возведение в нулевую степень дает в результате единицу. Возведение в степень значения плавающего типа является приближенным (см. 7). При возведении целого значения в отрицательную степень возбуждается исключение CONSTRAINT_ERROR.
Ссылки: возбуждение исключений 11, граница массива 1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента массива 3.6, логический тип 3, операция умножение 5, плавающий тип 9, предопределенная операция 4.5, размерность 3.6, целый тип 4.
7. ТОЧНОСТЬ ОПЕРАЦИЙ С ВЕЩЕСТВЕННЫМИ ОПЕРАНДАМИ
Вещественный подтип определяет множество модельных чисел. В терминах модельных чисел определяются точность, с которой базовые и предопределенные операции вырабатывают вещественный результат, и результат предопределенных операций отношения с вещественными операндами.
Модельный интервал подтипа — это интервал с границами, заданными модельными числами этого подтипа. Связанный с принадлежащими вещественному подтипу значениями модельный интервал является наименьшим модельным интервалом (данного подтипа), который содержит эти значения (модельный интервал, связанный с модельным числом некоторого подтипа, состоит только из этого числа).
Для любой базовой или предопределенной операции, вырабатывающей результат вещественного подтипа, требуемые границы результата задаются модельным интервалом, который определяется следующим образом:
• Модельный интервал результата — это наименьший модельный интервал (подтипа результата), который включает в себя минимальное и максимальное из всех значений, получаемых при применении (точной) математической операции, где каждый операнд,— это любое значение из модельного интервала (подтипа операнда), определенного для этого операнда.
• Модельный интервал операнда, который сам является результатом операции, отличной от неявного преобразования, является модельным интервалом результата этой операции.
• Модельный интервал операнда, значение которого получено неявным преобразованием универсального выражения, является модельным интервалом, соответствующим этому значению из подтипа операнда.
Модельный интервал результата не определен, если абсолютное значение хотя бы одного из упомянутых выше математических результатов превышает наибольшее хранимое число типа результата. Всякий раз, когда модельный интервал результата не определен и реализация не может обеспечить, чтобы фактический результат лежал в диапазоне хранимых чисел, крайне желательно возбуждение исключения NUMERIC_ERROR. Правила языка, однако, этого не требуют, так как для некоторых объектных машин нет простых методов обнаружения переполнения. Значение атрибута MACHINE_OVERFLOWS указывает, возбуждает ли объектная машина исключение NUMERIC_ERROR в ситуациях переполнения (см. 3).
Хранимые числа вещественного типа определены (см. 6) как надмножество модельных чисел, границы ошибок которых подчиняются тем же правилам, что и для модельных чисел. Любое задаваемое в этом разделе в терминах модельных интервалов определение может поэтому быть распространено на хранимые интервалы хранимых чисел. Следствием такого распространения является то, что для реализации не допускается возбуждение исключения NUMERIC_ERROR, если интервал результата является хранимым интервалом.
Для результата операции возведения в степень модельный интервал, определяющий границы результата, определяется по приведенным выше правилам, которые применяются к последовательным умножениям при вычислении степени и к заключительному делению, если показатель степени — отрицательное число.
Для результата операции отношения между двумя вещественными операндами рассмотрим модельный интервал (подтипа операнда), определенный для каждого такого операнда; результат может быть любым значением, полученным при применении математической операции сравнения к значениям, произвольно выбранным в соответствующих модельных интервалах операндов. Если один или оба модельных интервала операндов не определены (и если при вычислении операндов не было возбуждено исключение), то в качестве результата сравнения допустимо любое возможное значение (т. е. либо TRUE, либо FALSE).
Результат проверки принадлежности определен в терминах сравнения значения операнда с нижней и верхней границами заданного диапазона или обозначения типа (к таким сравнени-ям применяются обычные правила).
Примечание. Для плавающего типа числа 15.0, 3.0 и 5.0 всегда являются модельными числами. Следовательно, X/Y, где Х равно 15.0, а Y — 3.0, согласно приведенным выше правилам, вырабатывает в результате точно В общем случае деление не вырабатывает в результате модельные числа, и, следовательно, нельзя рассчитывать, что выполнено равенство (1.0/Х)'Х =
Ссылки: атрибут 4, атрибут MACHINE_OVERFLOWS 1, базовая операция типа 3, вещественный тип 6, возбуждение исключений 11, граница диапазона 3.5, граница ошибки 6, диапазон 3.5, исключение NUMERIC_ERROR 11.1, логическое значение FALSE 3, логи-' ческое значение TRUE 3, модельное число 6, обозначение типа 2, операция возведения в степень 6, операция отношение 4.5, 2, операция умножение 5, отношение 4.4, плавающий тип 9, подтип 3.3, предопределенная операция типа 3, преобразование типа 4.6, проверка вхождения 2, универсальное выражение 4.10, хранимое число 6.

[5] Если они есть. - Прим. ред.

квалификация необходима либо для FIX,



Примечание

type MASK is (FIX, DEC, EXP, SIGNIP); type CODE is (FIX, CLA, DEC, TNZ, SUB);PRINT (MASK'(DEC)); -- DEC типа MASK PRINT (СОDЕ'(DЕC)); -- DЕС типа CODEfor J in CODE'(FIX) .. CODE'(DEC) loop ... — квалификация необходима либо для FIX, либо для DEC for J in. CODE range FIX .. DEC loop ... — квалификация не нужна for J in CODE'(FIX) .. DEC loop ... — квалификация для DEC не нужнаDOZEN'(1 | 3 | 5 | 7 => 2, others => 0) -- см. 4.6 Примечание. Когда тип литерала перечисления или агрегата неизвестен из контекста, квалифицированное выражение может быть использовано для явного установления типа. Например, совмещенный литерал перечисления должен быть квалифицирован в следующих случаях: при использовании его в качестве параметра в вызове совмещенной подпрограммы, которая не может быть идентифицирована на основе типов остальных параметров и типа результата; в отношении, в котором оба операнда — совмещенные литералы перечисления; в массиве или диапазоне параметра цикла, в которых обе границы — совмещенные литералы перечисления. Явная квалификация используется также для определения совмещенной функции без параметров или для ограничения значения данным подтипом.
Ссылки: агрегат 4.3, базовый тип 3.3, возбуждение исключений 11, вызов подпрограммы 6.4, выражение 4.4, граница диапазона 3.5, диапазон 3.3, исключение CONSTRAINT_ERROR 11.1, контекст разрешения совмещения 8.7, литерал перечисления 1, массив 3.6, обозначение типа 2, отношение 4.4, параметр цикла 5.5, подпрограмма 6, подтип 3.3, совмещение 8.5, тип 3.3, функция

атрибут 4, вещественный тип 6,



Примечание

1+1 -- 2 аbs(-10)*3 -- 30KILO : constant := 1000; MEGA : constant := KILO*KILO; -- 1 000 000 LONG : constant := FLOАТ'DIGIТS*2;HALF_PI : constant := Р1/2; -- см. 2. DEG_TO_RAD : constant := HALF_Р1/90; RAD_TO_DEG : constant := 1.0/DЕG_ТО_RАD; --- эквивалентно 1.0/((3.14159_26536/2)/90) Ссылки: атрибут 4, вещественный тип 6, вычисление выражения 4.5, мультипликативная операция 4.5, 5, первичное 4.4, плавающий тип 9, предопределенная операция типа 3, SYSTEM.MAX-INT 13.7, SYSTEM.MIN-INT 13.7, тип 3.3, универсальный-вещественный тип 6, универсальный-целый тип 4, фактический параметр 1, функция 6.5, хранимое число 6, целый тип 4.

Статические выражения и статические подтипы


Некоторые выражения скалярного типа называются статическими. Аналогично статическими называют некоторые дискретные диапазоны, а обозначения типов для некоторых скалярных подтипов называют обозначающими статические подтипы.

Выражение скалярного типа называется статическим тогда и только тогда, когда каждое первичное является одним из перечисленных в пунктах от а до з, а каждая операция — это предопределенная операция и вычисление выражения дает значение (т. е. не возбуждает исключения).

а. Литерал перечисления (включая символьный литерал).

б. Числовой литерал.

в. Именованное число.

г. Заданная явным описанием константа статического подтипа и инициализированная статическим выражением.

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

е. Определяемый в языке атрибут статического подтипа; если атрибут — функция, фактические параметры должны быть также статическими выражениями.

ж. Квалифицированное выражение, обозначение типа которого задает статический подтип, а операнд — статическое выражение.

з. Заключенное в скобки статическое выражение.

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

Примечание. Точность вычисления статического выражения вещественного типа определена правилами, данными в разд. 7. Если результат не является модельным (или хранимым) числом этого типа, то значение выражения, полученное при вычислении во время компиляции, не обязано совпадать со значением, которое получится при вычислении во время счета.

Атрибуты массивов не являются статическими, в частности статическим не является атрибут RANGE.

Ссылки: атрибут 4, базовый тип 3.3, возбуждение исключений 11, выражение 4.4, граница диапазона 3.5, дискретный диапазон 3.6, дискретный тип 3.5, именованное число 3.2, инициализация 1, исключение 11, квалифицированное выражение 4.7, константа 1, литерал перечисления 1, модельное число 6, неявное описание 3.1, обозначение типа 2, ограничение диапазона 3.5, описание константы 1, подтип 3.3, предопределенная операция 4.5, символьный литерал 2.5, скалярный тип 3.5, фактический параметр 1, фактический параметр настройки 12.3, формальный параметр настройки 2, функция 6.5, хранимое число 6, числовой литерал



Универсальные выражения


Универсальное выражение — это выражение, вырабатывающее результат универсального-целого или универсального-вещественного типа.

Для универсального-целого типа предопределены те же операции, что и для любого целого типа. Для универсального-вещественного типа предопределены те же операции, что и для любого плавающего типа. Кроме того, эти операции включают операции умножения и деления.

Знак Операция операции Тип левого операнда Тип правого операнда Тип результата
* Умножение Универсальный-вещественный Универсальный- целый Универсальный- вещественный
Универсальный - целый Универсальный- вещественный Универсальный - вещественный
/ Деление Универсальный-вещественный Универсальный-целый Универсальный-вещественный

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

При вычислении операций универсального выражения, не являющегося статическим, возбуждение исключения NUMERIC_ERROR реализацией допускается только в том случае, если результат операции — вещественное число с абсолютным значением, превышающим наибольшее хранимое число самого точного предопределенного плавающего типа (исключая универсальный-вещественный), или целое значение, большее, чем SYSTEM.MAX_INT, либо меньшее, чем SYSTEM.MIN_INT.

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



Выражения


Выражение — это формула, которая определяет процесс вычисления значения.

выражение ::= отношение {and отношение} | отношение {and then отношение} | отношение {ог отношение} | отношение {or else отношение} | отношение {хог отношение}отношение ::= простое-выражение [операция-отношения простое - выражение] | простое-выражение [not] in диапазон | простое-выражение [not] in обозначение-типапростое - выражение :: = [унарная-аддитивная-операция] слагаемое {бинарная-аддитивная-операция слагаемое}слагаемое ::= множитель {мультипликативная-операция множитель}множитель ::= первичное [** первичное] | abs первичное | not первичноепервичное ::= числовой-литерал | null | агрегат | строковый-литерал | имя |генератор | вызов-функции | преобразование-типа | квалифицированное-выражение | (выражение)

Каждое первичное имеет значение и тип. Использование имен в качестве первичного допускается только для именованных чисел, атрибутов, которые вырабатывают значения, а также имен, обозначающих объекты (значением такого первичного является значение объекта) или обозначающих значения. Не допускается в качестве первичных использование имен формальных параметров вида out, а использование имен их подкомпонент допускается только в случае дискриминантов.

Тип выражения зависит только от типа его составных частей и применяемых операций; для совмещенных операндов или операций определение типа операнда или идентификация операции зависят от контекста. Для каждой предопределенной операции типы операндов и результата приведены в разд.

Примеры первичных:

4.0 -- литерал вещественного типа PI -- именованное число (1..10 => 0) -- агрегат массива SUM -- переменная INTEGER'LAST -- атрибут SINE(X) -- вызов функции COLOR'(BLUE) -- квалифицированное выражение РЕАL(М*N) -- преобразование типа (LINE_COUNT+10) -- выражение в скобках

Примеры выражений:

VOLUME -- первичное not DISTROYED -- множитель 2 * LINE_COUNT -- слагаемое -4.0 -- простое выражение -4.0 + А -- простое выражение В ** 2-4.0 * А * С -- простое выражение PASSWORD(1..3) = "BWV" -- отношение COUNT in SMALL_INT -- отношение COUNT not in SMALL_INT -- отношение INDЕХ=0 ог IТЕМ_НIТ -- выражение (COLD and SUNNY) or WARM -- выражение (скобки обязательны) А ** (В ** С) -- выражение (скобки обязательны)

Ссылки: агрегат 4.3, агрегат массива 2, атрибут 4, бинарная аддитивная операция 4.5, 3, вызов функции 6.4, генератор 4.8, диапазон 3.5, именованное число 3.2, имя 4.1, квалифицированное выражение 4.7, контекст для разрешения совмещения 8.7, литерал вещественного типа 2.4, мультипликативная операция 4.5, 5, обозначение типа 2, объект 3.2, операция 4.5, операция возведения в степень 4.5, 6, операция отношения 4.5, 2, отношение 1, переменная 1, преобразование типа 4.6, пустой литерал 3.8, совмещение 8.3, совмещение операций 6.7, строковый литерал 2.6, тип 3.2, тип результата 6.1, унарная аддитивная операция 4.5, 4, числовой литерал