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

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

Примеры:

-

3.14159-26536

1-345

ТРЕФЫ 'А' „НЕКОТОРЫЙ—ТЕКСТ”

- литерал вещественного типа - - литерал целого типа
  • - литерал перечисления

--символьный литерал

  • - строковый литерал

  1. Агрегаты

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

агрегат : : = (сопоставление—компонентов £ , сопоставление—компонентов } )

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

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

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

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

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

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

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

  1. Агрегаты записей

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

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

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

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

(4, ИЮЛЬ, 1776) --см. 3.7

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

(ДЕНЬ => 4, МЕСЯЦ => ИЮЛЬ, ГОД = > 1776)

(МЕСЯЦ => ИЮЛЬ, ДЕНЬ => 4, ГОД => 1776)

(ДИСК, ЗАКРЫТ, ТРАКТ = > 5, ЦИЛИНДР => 12) - - см. 3.7.3

(УСТРОЙСТВО => ДИСК, СОСТОЯНИЕ => ЗАКРЫТ, ЦИЛИНДР => 9, ТРАКТ = > 1)

Примеры сопоставления компонентов с несколькими выборами: (ЗНАЧЕНИЕ => О, СЛЕД | ПРЕД => new ЯЧЕЙКА'(0, null, null)) - - см. 3.8.1 -- генератор вычисляется дважды: СЛЕД и ПРЕД обозначают разные ячейки

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

  1. А г р е г а т ы массивов

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

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

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

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

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

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

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

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

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

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

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

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

Примеры агрегатов массивов с позиционными сопоставлениями: (7,9,5, 1,3, 2,4,8, 6,0)

ТАБЛИЦА1 (5, 8,4, 1, others => 0) - - см. 3.6

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

(1. .5 => (1. .8 => 0.0)) - - двумерный

(1. .К => new ЯЧЕЙКА) - - К новых ячеек, в частности, для К = 0

ТАБЛИЦА' (214110 => 1, others => 0)

РАСПИСАНИЕ'(ПНД. .ПТН => TRUE, others => FALSE) - - см. 3.6

РАСПИСАНИЕ' (СРДIВСК = > FALSE, others => TRUE)

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

- - три агрегата для одного значения типа МАТРИЦА, см. 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))

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

А: ТАБЛИЦА : = (7,9,5, 1,3, 2,4, 8,6,0); --А(1) = 7, А(10) = 0

  1. ТАБЛИЦА: = ТАБЛИЦА'(214| 10 => 1, others => 0) ; - - В (1) = 0, В(10) =1;

  2. constant МАТРИЦА: = (1. .5 => (1. .8 =>0.0));--C'FIRST(l) = 1,C'LAST(2) = 8

  3. ВЕКТОР_БИТ (М. .К) : = (М. .К => TRUE); - - см. 3.6

  4. ВЕКТОР_БИТ (М. .К) : = (others => TRUE);

  5. STRING (1. .1) : = (1 => 'F') ; - - однокомпонентний агрегат; то же, что и ,,F”

4.4. Выражения

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

выражение : : = отношение {amd отношение}

I отношение {and then отношение} |отношение{ог отношение}

I отношение {or else отношение}] отношение {хог отношение} отношение : : =

простое_выражение [операция_отношения простое—выражение]

I простое—выражение [not] in диапазон

I простое_выражение [not] in обозначение—типа простое_выражение : : = [унарная_аддитивная—операция] слагаемое {бинарная_аддитивная—операция слагаемое} слагаемое : : =

множитель {мультипликативная—операция множитель}

множитель : : = первичное [* » первичное]

I abs первичное | not первичное первичное : : = числовой—литерал | null | агрегат'

I строковый-литерал | имя | генератор

I вызов—функции I преобразование_типа

I квалифицированное—выражение I (выражение)

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

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

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

4.0 --литерал вещественного типа

ПИ - - именованное число

(1. . 10 = > 0) - - агрегат индексируемого типа

СУММА - - переменная

INTEGER'LAST - -атрибут

СИНУС (X) - - вызов функции

ЦВЕТ' (СИНИЙ) - - квалифицированное выражение ВЕЩЕСТВ (М*К) - - преобразование типа (СЧЕТ_СТРОЧЕК +10) - - выражение в скобках

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

  • -

    ТОМ not ИСПОРЧЕН

    ,2 * СЧЕТ_СТРОЧЕК

    -4.0

    -4.0 + А

    В ** 2-4.0 * А * С

    ПАРОЛЬ (1. .3) = ”АБВ”

    СЧЕТ in МАЛОЕ_ЦЕЛ

    СЧЕТ not in МАЛОЕ-ЦЕЛ ИНДЕКС = 0 от ЭЛЕМЕНТ_ГР (ХОЛОД and СОЛНЦЕ) ог ТЕПЛО А **(В »* С)

    первичное
  • - множитель

  • - слагаемое

  • - простое выражение

  • - простое выражение

  • - простое выражение

  • - отношение

  • - отношение

  • - отношение

  • - выражение

  • - выражение (скобки обязательны)

  • - выражение (скобки обязательны)

4.5. Операции и вычислете выражеим

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