Императивное расширение

Императивное расширение языка P определяет дополнительные языковые конструкции, возникающие в программе в результате проведения трансформаций предикатной программы (см. введение). Использование этих конструкций в исходной программе недопустимо.

ЗАГОЛОВОК-ПРЕДИКАТА ::=

ИМЯ-ПРЕДИКАТА ( [ОПИСАНИЯ-АРГУМЕНТОВ] [: ОПИСАНИЯ-РЕЗУЛЬТАТОВ] )

ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ ::=

ИДЕНТИФИКАЦИЯ-ПРЕДИКАТА ( [АРГУМЕНТЫ] [: РЕЗУЛЬТАТЫ] )

В императивном расширении для предиката-функции допускается отсутствие результатов. Это отражено в приведенных определениях, расширяющие определения, данные в разд. 6.3.1. Отсутствие результатов возможно, например, после склеивания результатов с глобальными переменными.

Определим дополнительные операторы императивного расширения.

ОПЕРАТОР-ИМПЕРАТИВНОГО-РАСШИРЕНИЯ ::=

break | ОПЕРАТОР-FOR | ОПЕРАТОР-ЕСЛИ

В императивной программе, полученной в результате трансформации, в позиции оператора исходной предикатной программы может также находиться оператор императивного расширения. Отметим, что групповой оператор присваивания, возникающий при подстановке тела предиката на место вызова предиката, является частным случаем оператора присваивания, когда в левой части - мультипеременная, а в правой - мультивыражение.

ОПЕРАТОР-FOR ::= for ( ЗАГОЛОВОК-ЦИКЛА ) { ОПЕРАТОР [; ОПЕРАТОР] }

ЗАГОЛОВОК-ЦИКЛА ::= [[ИЗОБРАЖЕНИЕ-ТИПА] ПАРАМЕТР-ЦИКЛА = ВЫРАЖЕНИЕ] ;

[УСЛОВИЕ-ЗАВЕРШЕНИЯ] ;

[ПЕРЕСЧЕТ-ПАРАМЕТРА]

ПАРАМЕТР-ЦИКЛА ::= ИДЕНТИФИКАТОР

УСЛОВИЕ-ЗАВЕРШЕНИЯ ::= ВЫРАЖЕНИЕ

ПЕРЕСЧЕТ-ПАРАМЕТРА ::= ОПЕРАТОР

В императивном расширении используются также операторы перехода и помеченные операторы. Синтаксис и семантика определены в разд. 10.

Семантика цикла for соответствует языку C++. Выход из цикла for может также быть реализован оператором break из тела цикла.

ЦИКЛ-WHILE ::= while ( ВЫРАЖЕНИЕ ) ОПЕРАТОР

Тело цикла while исполняется, пока логическое выражение в его заголовке истинно.


sum (list (int) a : int r) {

if (len (a) > 0) {

r = a [0];

int i = 1;

while (i < len (a)) {

r = r + a [i];

i = i + 1;

}

} else {

r = 0;

}

}

Пример 18.Использование цикла while

 

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

Циклы for и while часто используектся для представления циклов, реализуемых с помощью операторов перехода, в целях улучшения структуры программы.