Тип строкового литерала и тип литерала null должны определяться исключительно из контекста, в котором эти литералы встречаются, без учета самого литерала, используя при этом только тот факт, что литерал null — это значение ссылочного типа, а строковый литерал — значение одномерного массива, тип компонентов которого - символьный.
Символьные литералы, содержащиеся в строковом литерале и соответствующие графическим символам, должны быть видимы в месте нахождения строкового литерала (хотя сами эти символы для определения типа данного строкового литерала не используются).
Примеры:
-
3.14159-26536
1-345
ТРЕФЫ 'А' „НЕКОТОРЫЙ—ТЕКСТ”
- литерал вещественного типа - - литерал целого типа- литерал перечисления
--символьный литерал
- строковый литерал
Агрегаты
Агрегат - это базовая операция, которая объединяет значения компонентов в составное значение именуемого или индексируемого типа.
агрегат : : = (сопоставление—компонентов £ , сопоставление—компонентов } )
сопоставление—компонентов : : = [выбор {| выбор} = > ] выражение
Каждое сопоставление компонентов связывает выражение с компонентами. Сопоставление компонентов называется именованным, если компоненты явно определены выборами, и позиционным в противном случае. При позиционном сопоставлении каждому отдельно взятому компоненту неявно соответствует некоторая позиция: именуемым компонентам — в порядке следования их описаний, индексируемым компонентам — по возрастанию индекса.
Именованные сопоставления могут стоять в произвольном порядке (исключая выбор others), но если в агрегате одновременно используются позиционные и именованные сопоставления, то первыми должны стоять позиционные сопоставления, каждое на своем месте. Следовательно, за именованными сопоставлениями в агрегате должны следовать только именованные сопоставления. В агрегатах, содержащих единственное сопоставление, должно всегда использоваться именованное сопоставление. Правила для сопоставления компонентов агрегатов именуемого типа и агрегатов индексируемого типа определены в разд. 4.3.1 и 4.3.2.
Синтаксис выборов сопоставления компонентов совпадает с синтаксисом разделов вариантов (см. 3.7.3). Выбор, являющийся простым именем компонента, допустим только в агрегатах именуемого типа. Выбор, являющийся простым выражением или дискретным диапазоном, допустим только в агрегатах индексируемого типа; выбор, являющийся простым выражением, задает значение индекса; дискретный диапазон задает диапазон значений индекса. Выбор others допустим только в последнем сопоставлении компонентов в качестве единственного выбора и определяет все оставшиеся компоненты, если они есть.
Каждый компонент значения, определяемого агрегатом, должен встретиться в агрегате один и только один раз. Следовательно, каждый агрегат должен быть полным и не допускается, чтобы данный компонент был задан более чем одним выбором.
Тип агрегата должен быть определимым исключительно по контексту, в котором встречается агрегат, без учета самого агрегата, используя только тот факт, что его тип должен быть составным и не лимитируемым. Тип агрегата в свою очередь определяет требуемый тип каждого его компонента.
Примечание. Приведенное выше правило означает, что для определения мпа агрегата не может быть использована «формация, которую несет в себе агрегат. В частности, это определение не может использовать тип выражения в.сопоставлении компонентов, формы или типы выборов. Агрегат с одним компонентом всегда можно отличите, от выражения, заключенного в скобки, благодаря обязательному именованию компонента такого агрегата.
Агрегаты записей
Для агрегата именуемого типа (агрегата записи)' имена компонентов, заданные выборами, должны обозначать компоненты (включая дискриминанты) именуемого типа. Выбор ©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)-мерный агрегат, называемый подагрегатом; подтип индекса одномерного агрегата задается первой позицией индекса индексируемого типа. То же правило используется для следующей позиции индекса при записи подагрегатов, если они опять многомерные. В многомерном агрегате допустимо использование строкового литерала в качестве одномерного массива с компонентами символьного типа. В дальнейшем связанные с агрегатами массивов правила формулируются в терминах одномерных агрегатов.
За исключением последнего сопоставления компонентов с единственным выбором ©there остальные сопоставления (если они есть) агрегата массива должны быть либо все позиционными, либо все именованными. Для агрегата массива, имеющего одно именованное сопоставление компонентов с одним выбором, допускается задание только такого выбора, который не является статическим или является пустым диапазоном. Выбор ©there является статическим, если статическим является соответствующее ограничение индекса.
Границы агрегата массива, имеющего выбор others, определяются соответствующим ограничением индекса. Использование выбора others допускается только тогда, когда агрегат находится в одном из следующих контекстов (контекст определяет соответствующее ограничение индекса).
Агрегат — это фактический параметр, фактический параметр настройки, выражение, являющееся результатом функции, или выражение, которое следует за составным ограничителем присваивания, и подтип соответствующего формального параметра, формального параметра настройки, результата функции или объекта - ограниченный индексируемый подтип.
Для агрегата, помещенного в такой контекст и содержащего сопоставление с выбором others, другие именованные сопоставления допускаются только в случае фактического параметра (не являющегося фактическим параметром настройки) или результата функции. Если агрегат — многомерный массив, то это требование распространяется и на все его подагрегаты.
Агрегат — это операнд квалифицированного выражения, обозначение типа которого указывает ограниченный индексируемый подтип.
Агрегат — это выражение в сопоставлении компонентов другого агрегата индексируемого или именуемого типа и, если этот объемлющий агрегат — многомерный агрегат индексируемого типа, то сам он заключен в один из этих трех видов контекста.
Границы агрегата массива без выбора 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
ТАБЛИЦА: = ТАБЛИЦА'(214| 10 => 1, others => 0) ; - - В (1) = 0, В(10) =1;
constant МАТРИЦА: = (1. .5 => (1. .8 =>0.0));--C'FIRST(l) = 1,C'LAST(2) = 8
ВЕКТОР_БИТ (М. .К) : = (М. .К => TRUE); - - см. 3.6
ВЕКТОР_БИТ (М. .К) : = (others => TRUE);
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. Операции и вычислете выражеим
В языке определены шесть классов операций. При описании функций, определяющих' пользовательские операции, в качестве обозначений могут быть использованы приведенные ниже знаки операций (исключая / =). Шесть классов операций приведены в порядке возрастания их старшинства.