ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::=
КОНСТАНТА | ПЕРЕМЕННАЯ | АГРЕГАТ | ИМЯ-ПРЕДИКАТА |
ГЕНЕРАТОР-ПРЕДИКАТА | ВЫЗОВ-ФУНКЦИИ | ( ВЫРАЖЕНИЕ ) | ИМЯ-ТИПА |
МОДИФИКАЦИЯ | ЭЛЕМЕНТ-СПИСКА | ОПРЕДЕЛЕНИЕ-МАССИВА |
КОНСТРУКТОР | РАСПОЗНАВАТЕЛЬ | ПОЛЕ-ОБЪЕДИНЕНИЯ
Имя типа может быть аргументом вызова предиката и изображения типа. Определение ЭЛЕМЕНТА-СПИСКА дается в разд. 6.7. Операция ОПРЕДЕЛЕНИЕ-МАССИВА описывается в разд. 6.8.3. Последние три альтернативы в определении ПЕРВИЧНОГО-ВЫРАЖЕНИЯ относятся к объектам типа объединения и описаны в разд. 6.7.
ПЕРЕМЕННАЯ ::= ИМЯ-ПЕРЕМЕННОЙ | ЭЛЕМЕНТ-МАССИВА | ПОЛЕ-СТРУКТУРЫ |
ПЕРЕМЕННАЯ-КЛАССА | ВЫРЕЗКА-МАССИВА |
МУЛЬТИПЕРЕМЕННАЯ
ВЫРЕЗКА-МАССИВА определена в разд. 6.8.
ИМЯ-ПЕРЕМЕННОЙ ::= ИДЕНТИФИКАТОР [’]
Переменная вида имя’ используется для именования результата предиката. Переменная имя’ склеивается с переменной имя, являющейся аргументом предиката (см. разд. 6.3.1).
ЭЛЕМЕНТ-МАССИВА ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ [ ИНДЕКСЫ-МАССИВА ]
ИНДЕКСЫ-МАССИВА ::= СПИСОК-ВЫРАЖЕНИЙ
Значением ПЕРВИЧНОГО-ВЫРАЖЕНИЯ является переменная типа “массив”. Значения ИНДЕКСОВ-МАССИВА должны принадлежать типам индексов соответствующего типа массива.
ПОЛЕ-ПЕРЕМЕННОЙ ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ . ИМЯ-ПОЛЯ
Значением ПЕРВИЧНОГО-ВЫРАЖЕНИЯ является переменная типа “структура”.
ИМЯ-ПОЛЯ ::= ИДЕНТИФИКАТОР
ПЕРЕМЕННАЯ-КЛАССА ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ . ПЕРЕМЕННАЯ
Значением ПЕРВИЧНОГО-ВЫРАЖЕНИЯ является переменная типа “класс”.
МУЛЬТИПЕРЕМЕННАЯ ::= | СПИСОК-ПЕРЕМЕННЫХ ||
СПИСОК-ПЕРЕМЕННЫХ
Два разных способа представления мультипеременной считаются равноценными.
СПИСОК-ПЕРЕМЕННЫХ ::= ПЕРЕМЕННАЯ [, СПИСОК-ПЕРЕМЕННЫХ ]
Мультипеременная определяет упорядоченный набор переменных. Число переменных в наборе должно быть больше 1.
АГРЕГАТ ::= АГРЕГАТ-СТРУКТУРА | АГРЕГАТ-МАССИВ |
АГРЕГАТ-МНОЖЕСТВО | АГРЕГАТ-СПИСОК
Агрегат определяет значение структурного типа. Агрегат-массив определяет массив, агрегат-множество - подмножество некоторого множества - значение типа set (см. разд. 6.7), агрегат-структура - структуру (как набор полей), агрегат-список - список, заданный последовательностью элементов.
АГРЕГАТ-СТРУКТУРА ::= [ИЗОБРАЖЕНИЕ-ТИПА] ( [ЭЛЕМЕНТЫ-АГРЕГАТА] )
АГРЕГАТ-МАССИВ ::= [ИЗОБРАЖЕНИЕ-ТИПА] [ [ЭЛЕМЕНТЫ-АГРЕГАТА] ]
АГРЕГАТ-МНОЖЕСТВО ::= [ИЗОБРАЖЕНИЕ-ТИПА] { [ЭЛЕМЕНТЫ-АГРЕГАТА] }
АГРЕГАТ-СПИСОК ::= [ИЗОБРАЖЕНИЕ-ТИПА] [[ ЭЛЕМЕНТЫ-АГРЕГАТА ]]
Агрегат [ ] обозначает пустой массив (когда верхняя граница индексов меньше нижней). Агрегат { } определяет пустое множество. Если пара скобок [[ или ]] встречается рядом при изображении АГРЕГАТ-МАССИВА, то соседние скобки дожны быть разделены пробелом.
ЭЛЕМЕНТЫ-АГРЕГАТА ::= ЭЛЕМЕНТ-АГРЕГАТА [, ЭЛЕМЕНТЫ-АГРЕГАТА]
Значением агрегата является набор значений элементов агрегата, перечисленных в скобках. Агрегат может иметь иерархическую структуру, поскольку элементом агрегата может быть агрегат. Тип агрегата определяется типом позиции, в которой находится агрегат. Значение агрегата должно соответствовать типу позиции. Тип агрегата может быть указан явно ИЗОБРАЖЕНИЕМ-ТИПА - это не является необходимым, но может улучшить восприятие программы.
ЭЛЕМЕНТ-АГРЕГАТА ::= [ИНДЕКС-ЭЛЕМЕНТА-АГРЕГАТА :] ВЫРАЖЕНИЕ
ИНДЕКС-ЭЛЕМЕНТА-АГРЕГАТА ::= ВЫРАЖЕНИЕ | ИМЯ-ПОЛЯ
Индексы элементов, если присутствуют, должны соответствовать индексам элементов массива или именам полей структуры.
type Ar4 = array (real, 1..4);
Ar4 x = [ 0, 1, 2, 3];
Пример 5. Задание агрегата
ГЕНЕРАТОР-ПРЕДИКАТА ::=
predicate ОПИСАНИЕ-ПРЕДИКАТА
Исполнение генератора предиката создает новый предикат, операторная часть которого определяется телом предиката, находящегося в составе ОПИСАНИЯ-ПРЕДИКАТА; см. разд. 6.3.1. В теле предиката фиксируются значения свободных переменных (отличных от аргументов и результатов) на момент исполнения генератора. Новый предикат становится значением генератора предиката.
УНАРНОЕ-ВЫРАЖЕНИЕ ::= УНАРНАЯ-ОПЕРАЦИЯ ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ
УНАРНАЯ-ОПЕРАЦИЯ ::= + | - | ! | ~
БИНАРНОЕ-ВЫРАЖЕНИЕ ::= ВЫРАЖЕНИЕ БИНАРНАЯ-ОПЕРАЦИЯ ВЫРАЖЕНИЕ
БИНАРНАЯ-ОПЕРАЦИЯ ::= * | / | % | + | - | << | >> | in |
< | > | <= | >= | = | != | & | ^ | or | xor | => | <=>
Семантика операций и их приоритеты определены ниже в таблице. Типы аргументов каждой операции должны соответствовать операции. Операция “+” для объединения массивов описана в разд. 6.8.4.
МОДИФИКАЦИЯ ::= МОДИФИКАЦИЯ-СТРУКТУРЫ | МОДИФИКАЦИЯ-МАССИВА
МОДИФИКАЦИЯ-СТРУКТУРЫ ::= ВЫРАЖЕНИЕ with АГРЕГАТ
МОДИФИКАЦИЯ-МАССИВА ::=
ВЫРАЖЕНИЕ with АГРЕГАТ |
ВЫРАЖЕНИЕ with ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ
В структурном значении выражения, обозначающего массив или структуру, меняются компоненты, представленные АГРЕГАТОМ или ОПРЕДЕЛЕНИЕМ-МАССИВА-ПО-ЧАСТЯМ (см. разд. 6.8.3 ). Значением операции является обновленный массив или структура.
type ar0_4 = array (int, 0..4);
ar0_4 ones = [ 1, 1, 1, 2, 1 ];
ar0_4 ones1 = ones [3: 1]; // [ 1, 1, 1, 1, 1 ]
type Vec(nat n) = array (real, 1..n);
perm(nat n, Vec(n) b, nat m, k : Vec(n) b')
{ b' = b with [k: b [m], m: b [k]] };
Пример 6. Замена части структурного значения
УСЛОВНОЕ-ВЫРАЖЕНИЕ ::= ВЫРАЖЕНИЕ ? ВЫРАЖЕНИЕ : ВЫРАЖЕНИЕ
Первое выражение имеет тип “логический”. Если первое ВЫРАЖЕНИЕ завершается илентификатором, то идентификатор и последующий символ “?” должны быть разделены пробелом.
МУЛЬТИВЫРАЖЕНИЕ ::= | СПИСОК-ВЫРАЖЕНИЙ | |
СПИСОК-ВЫРАЖЕНИЙ
Значением мультивыражения является набор значений, получающихся в результате вычисления перечисленных выражений. Выражения вычисляются независимо, т. е. параллельно. Мультивыражение может находиться в правой части оператора присваивания, если в левой находится мультипеременная.
ВЫРАЖЕНИЕ ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ | УНАРНОЕ-ВЫРАЖЕНИЕ |
БИНАРНОЕ-ВЫРАЖЕНИЕ | УСЛОВНОЕ-ВЫРАЖЕНИЕ |
МУЛЬТИВЫРАЖЕНИЕ
Таблица 1.Операции в порядке уменьшения приоритета
^ | Возведение в степень |
+, -, !, ~ | Унарные плюс и минус, логическое отрицание и поэлементное дополнение для множеств, побитовое дополнение для ограниченных целых |
*, /, % | Арифметическое умножение, деление и остаток от целочисленного деления |
+, - | Арифметическое сложение и вычитание; объединение и вычитание множеств; конкатенация строк; объединение массивов с непересекающимися типами индексов |
<<, >> | Побитовый (поэлементный) сдвиг влево и вправо для целых |
<- | Обновление элемента массива или поля структуры |
in | Проверка вхождения элемента в множество |
<, >, <=, >= | Операции арифметического сравнения |
=, != | Проверка на равенство и неравенство |
& | Пересечение множеств, логическая конъюнкция, побитовое И для ограниченных целых |
xor | Симметрическая разность для множеств, исключительное ИЛИ для логических выражений и ограниченных целых (побитовое) |
or | Объединение множеств, логическая дизъюнкция, побитовое ИЛИ для ограниченных целых |
=> | Импликация |
<=> | Логическое тождество |
?: | Трёхместная условная операция |