Лекция: Операторы
БЛОК ::= { ОПЕРАТОР }
ОПЕРАТОР ::= [ОПИСАНИЕ-ПЕРЕМЕННЫХ ;]{ ЗАМКНУТЫЙ-ОПЕРАТОР |
[ОПИСАНИЕ-ПЕРЕМЕННЫХ ;] ПАРАЛЛЕЛЬНЫЙ-ОПЕРАТОР |
[ОПИСАНИЕ-ПЕРЕМЕННЫХ ;] ОПЕРАТОР-СУПЕРПОЗИЦИИ
Описанные переменные считаются локальными в теле предиката. Тип локальной переменной может быть также определен описателем var (см. разд. 6.3.3) в случае, когда тип легко определяется из контекста дальнейшего использования переменной.
ЗАМКНУТЫЙ-ОПЕРАТОР ::=
ОПЕРАТОР-ПРИСВАИВАНИЯ | ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ |
ВЫЗОВ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ [ОПЕРАТОР-ОБРАБОТКИ-ВЕТВЕЙ] |
УСЛОВНЫЙ-ОПЕРАТОР | БЛОК [ОПЕРАТОР-ОБРАБОТКИ-ВЕТВЕЙ] |
ОПЕРАТОР-ВЫБОРА | ОПРЕДЕЛЕНИЕ-ЛОКАЛЬНОГО-ПРЕДИКАТА
ОПЕРАТОР-ПРИСВАИВАНИЯ ::= ПЕРЕМЕННАЯ = ВЫРАЖЕНИЕ
В результате исполнения оператора присваивания переменной присваивается значение выражения. Типы выражения и переменной должны быть совместимы (см. разд. 6.7).
УСЛОВНЫЙ-ОПЕРАТОР ::=
ОПЕРАТОР-ЕСЛИ else ЗАМКНУТЫЙ-ОПЕРАТОР [ОПЕРАТОР-ПЕРЕХОДА]
ОПЕРАТОР-ЕСЛИ ::= if ( ВЫРАЖЕНИЕ ) ОПЕРАТОР [ОПЕРАТОР-ПЕРЕХОДА]
В операторе перехода указывается либо метка ветви гиперфункции, либо метка ветви обработчика, следующего за блоком, содержащим данный условный оператор.
if (x > 0) s = 1
else if (x < 0) s = -1
else s = 0
Пример 3. Использование условного оператора
ПАРАЛЛЕЛЬНЫЙ-ОПЕРАТОР ::=
ЗАМКНУТЫЙ-ОПЕРАТОР (|| ЗАМКНУТЫЙ-ОПЕРАТОР)+
Операторы, образующие параллельный оператор, должны иметь непересекающиеся наборы результирующих переменных. Исполнение параллельного оператора слагается из исполнения входящих в него операторов. Операторы выполняются независимо друг от друга; они могут исполняться параллельно.
ОПЕРАТОР-СУПЕРПОЗИЦИИ ::= ОПЕРАТОР (; ОПЕРАТОР)+
В цепочке операторов, составляющих оператор суперпозиции, каждый следующий оператор использует значения локальных переменных, присвоенных предыдущими операторами. Каждая пара соседних операторов в цепочке должна быть связана хотя бы одной локальной переменной; если такой связи нет, их композиция должна быть оформлена параллельным оператором.
ЗАГОЛОВОК-ОПЕРАТОРА-ВЫБОРА ::= switch ( ВЫРАЖЕНИЕ )
ОПЕРАТОР-ВЫБОРА ::= ЗАГОЛОВОК-ОПЕРАТОРА-ВЫБОРА
{ ОПЕРАТОР-АЛЬТЕРНАТИВЫ+
[default : ОПЕРАТОР [ОПЕРАТОР-ПЕРЕХОДА]]
}
ОПЕРАТОР-АЛЬТЕРНАТИВЫ ::=
case АЛЬТЕРНАТИВА (, АЛЬТЕРНАТИВА)* : ОПЕРАТОР [
ОПЕРАТОР-ПЕРЕХОДА]
АЛЬТЕРНАТИВА ::= ВЫРАЖЕНИЕ | ОПРЕДЕЛЕНИЕ-КОНСТРУКТОРА
Выполняется тот оператор альтернативы, для которого значение АЛЬТЕРНАТИВЫ совпадает со значением выражения в заголовке оператора выбора. Оператор после default выполняется в случае, когда нет ОПЕРАТОРА-АЛЬТЕРНАТИВЫ с требуемым значением
АЛЬТЕРНАТИВЫ. Трактовка операторов перехода та же, что и для условного оператора.
Если в позиции выражения в заголовке оператора выбора находится переменная типа объединения, то в качестве АЛЬТЕРНАТИВЫ указывается ОПРЕДЕЛЕНИЕ-КОНСТРУКТОРА. Особенности выполнения ОПЕРАТОРА-АЛЬТЕРНАТИВЫ определены в разд. 6.7.
ОПЕРАТОР-ОБРАБОТКИ-ВЕТВЕЙ ::=
(case [МЕТКА-ВЕТВИ-ОБРАБОТЧИКА :] ОПЕРАТОР)+
МЕТКА-ВЕТВИ-ОБРАБОТЧИКА ::= МЕТКА
Оператор обработки ветвей следует за вызовом гиперфункции либо за блоком, содержащем операторы перехода. Если предыдущий оператор нормально завершается, то оператор обработки ветвей игнорируется. Нормальное завершение возможно и для вызова гиперфункции, когда на одной из ветвей гиперфункции опущена метка перехода, что означает суперпозицию (или параллельную композицию) с последующим оператором, а на другой ветви имеется переход на метку ветви обработчика или на метку ветви гиперфункции, в теле которой находится данный оператор.
Исполнение оператора обработки ветвей инициируется оператором перехода, находящимся в предыдущем операторе. При этом исполняется оператор, помеченный соответствующей меткой, после чего исполнение оператора обработки ветвей и предыдущего оператора считается завершившимся.
В вызове гиперфункции могут быть опущены переходы, а в последующем операторе обработки ветвей — метки ветвей обработчика. В этом случае порядок ветвей обработчика соответствует порядку ветвей вызова гиперфункции.
A(i: y #1: #2)
case 1: B(y, i: u)
case 2: D(i: u);
Пример 4.Вызов гиперфункции с обработчиком ветвей
ОПРЕДЕЛЕНИЕ-ЛОКАЛЬНОГО-ПРЕДИКАТА ::= ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА
Определение локального предиката допускает использование параметров и локальных переменных предиката, в теле которого это определение находится. Локальный предикат доступен лишь в теле предиката, внутри которого он описан.