Выражения

ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ ::=

КОНСТАНТА | ПЕРЕМЕННАЯ | АГРЕГАТ | ИМЯ-ПРЕДИКАТА |

ГЕНЕРАТОР-ПРЕДИКАТА | ВЫЗОВ-ФУНКЦИИ | ( ВЫРАЖЕНИЕ ) | ИМЯ-ТИПА |

МОДИФИКАЦИЯ | ЭЛЕМЕНТ-СПИСКА | ОПРЕДЕЛЕНИЕ-МАССИВА |

КОНСТРУКТОР | РАСПОЗНАВАТЕЛЬ | ПОЛЕ-ОБЪЕДИНЕНИЯ

Имя типа может быть аргументом вызова предиката и изображения типа. Определение ЭЛЕМЕНТА-СПИСКА дается в разд. 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 Объединение множеств, логическая дизъюнкция, побитовое ИЛИ для ограниченных целых
=> Импликация
<=> Логическое тождество
?: Трёхместная условная операция