<заголовск UHKMa>:: = for <идеитификатор переменной;» : = <список цикла > do
<оператор цикла> :: = <заголовок цикла > <оператор>| <метка>: <оператор цикла>
Примеры
for Q: = 1 step S until N do A [Q]: = В [Q]
for K: = 1, VI X2 while VI <N do
for J: = I + G, L, 1 step 1 until N, C + D do A[K, J]:=B[K, J]
Семантика
Заголовок цикла заставляет стоящий за ним оператор S повторно выполняться нуль или более раз. Кроме того, он осуществляет последовательные присваивания значений переменной, управляемой данным заголовком, так называемому параметру цикла. Этот процесс может быть пояснен следующей схемой:
начало; проверка; оператор S; продвижение; преемник 1 список цикла исчерпан
В этой схеме слова означают: «начало» — произвести первое присваивание в заголовке цикла; «продвижение» — произвести очередное присваивание в заголовке цикла; слово «проверка» определяет. было ли сделано последнее присваивание. Если оно сделано, то выполнение продолжается с преемника оператора цикла. В противном случае выполняется оператор, стоящий за заголовком цикла.
Элементы списка цикла
Список цикла дает правило для получения значений, которые последовательно присваиваются параметру цикла. Эта последовательность значений получается из элементов списка цикла путем их последовательного перебора в порядке их написания. Последовательность значений, порождаемая каждой из трех разновидностей элементов списка цикла, и соответствующее выполнение оператора S определяются следующими правилами.
Арифметическое выражение. Этот элемент задает только одно значение, а именно значение данного арифметического выражения, вычисленное непосредственно перед соответствующим выполнением оператора S.
Элемент типа арифметической прогре с- с и и. Элемент, имеющий вид A step L until С, где А, В и С — арифметические выражения, задает порядок выполнения, который наиболее четко можно описать при помощи дополнительных операторов АЛГАМСа следующим образом:
V:=A;
LI :if (V— (С)) XSIGN(B) >0 then go to элемент исчерпан; оператор S;
V:=V+(B);
go to L1;
где V — параметр цикла и «элемент исчерпан» указывает на переход к вычислениям, соответствующим следующему элементу списка цикла, или (если данный элемент типа арифметической прогрессии стоит последним в описке) к следующему оператору программы.
Элемент типа пересчета. Порядок выполнения, определяемый элементом списка цикла вида A while В, где А — арифметическое выражение, В—логическое выражение, наиболее четко описывается при помощи дополнительных операторов АЛГАМСа следующим образом:
L3:V:=A;
if I (В)then go to элемент исчерпан; оператор S;
go to L3,
Обозначения те же, что и в п. 4.6.4.2.
Значение параметра цикла после выхода
После выхода из оператора S посредством какого-либо оператора перехода значение параметра цикла будет таким, каким оно было непосредственно перед выполнением оператора перехода.
С другой стороны, если выход вызван исчерпанием списка цикла, то значение параметра цикла после выхода не определено.
Оператор перехода, ведущий в оператор цикла
Результат действия оператора перехода, стоящего вне оператора цикла и обращающегося к метке внутри оператора цикла, не определен.
Операторы процедур
Синтаксис
<фактический параметр>:: = <строка> | <выражение> | •Идентификатор массива> | <идентификатор переключате- ля> I -^идентификатор процедуры>
<строка букв>:: =<буква > | <строка букв><буква >
<ограничитель параметра> :: = ,| ) <строка букв>:(
<спнсок фактических параметров> : : = <фактический пара- метр> I <сш!сок фактических параметров> <ограничитель параметра> <фактический параметр>
<совокупность фактических параметров> :: = <пусто> | (<список фактических параметров>)
Соператор процедуры> : : = <идентификатор процедуры> ^совокупность фактических параметров>
Примеры
след (А) порядок: (7) результат: (V)
транспонирование (W, V+1)
абсмакс (A, N, М, YY, I, К)
скалярное произведение (А[Т, Р, U], В[Р], 10, Р, Y)
Эти примеры соответствуют примерам, данным в п. 5.4.2
Семантика
Оператор процедуры служит для обращения к выполнению тела процедуры (см. п. 5.4). Кроме случаев, когда тело процедуры имеет вид LIBRARY (<строка>), результат его выполнения будет эк- Бивалентен результату осуществления следующих действий в программе во время выполнения оператора процедуры.
Присваивание значений (вызов значением). Всем формальным параметрам, перечисленным в списке значений заголовка описания процедуры, присваиваются значения (см. п. 2.8) соответствующих фактических параметров. Эти присваивания следует рассматривать как выполняемые непосредственно перед входом в тело процедуры. Это происходит так, как будто создается объемлющий тело процедуры дополнительный блок (см. п. 4.1.3), в котором делаются присваивания переменным, локальным в этом фиктивном блоке и имеющим типы, заданные соответствующими спецификациями (см. п. 5.4.5). В результате переменные, вызываемые значением, следует рассматривать как локальные в этом фиктивном блоке и нелокальные в теле процедуры (см. и. 5.4.3).
3 а м е н а н а и м ей о в а н и й (вызов по наименованию). Любой формальный параметр, не перечисленный в списке значений, повсюду в теле процедуры заменяется на соответствующий фактический параметр, после того, как последний там, где это синтаксически возможно, заключен в круглые скобки. Возможность противоречий между идентификаторами, вставляемыми в тело процедуры в результате такого процесса, и идентификаторами, уже присутствующими в теле процедуры, устраняется соответствующими систематическими изменениями локальных идентификаторов, затронуты?: такими противоречиями.
Подстановка и выполнение тела процедур ы. Тело процедуры, преобразованное как описано выше, помещается на место оператора процедуры и выполняется. Если обращение к процедуре производится извне области действия любой величины, нелокальной в теле процедуры, то противоречия между идентификаторами, включенными посредством этого процесса подстановки тела, и идентификаторами, описания которых имеют силу там, где расположен оператор процедуры или указатель функции, устраняются посредством соответствующих систематических изменений последних идентификаторов.
Соответствие между фактическими и формальными параметрами
Соответствие между фактическими параметрами оператора процедуры и формальными параметрами заголовка процедуры устанавливается следующим образом. Список фактических параметров оператора процедуры должен иметь то же число членов, что и список формальных параметров заголовка описания процедуры. Соответствие получается сопоставлением членов этих двух списков в одном и том же порядке.
Ограничения
Чтобы оператор процедуры был определен, очевидно, необходимо, чтобы действия над телом процедуры, определенные в пп. 4.7.3.1 и 4.7.3.2, приводили бы к правильному оператору в языке АЛГАМС.
Это накладывает на любой оператор процедуры ограничения, заключающиеся в том, что класс и тип каждого фактического параметра должен быть совместим с классом и типом соответствующего формального параметра. Некоторые важные частные случаи этого общего правила приведены ниже.
Если строка является фактическим параметром оператора процедуры или указателя функции, для которых соответствующее тело процедуры является оператором в смысле языка АЛГАМС (а не LIBRARY (<строка>)), то эту строку можно использовать в теле процедуры только как фактический параметр в дальнейших обращениях к процедурам. В конечном итоге строку можно использовать только в теле процедуры вида LIBRARY (<строка>) либо в соответствующих стандартных процедурах.
Формальному параметру, не вызываемому значением и встречающемуся в теле процедуры в виде переменной левой части некоторого оператора присваивания, может соответствовать в качестве фактического параметра только переменная (частный случай выражения).
Формальному параметру, используемому в теле процедуры в качестве идентификатора массива, может соответствовать в качестве фактического параметра только идентификатор массива той же размерности. Кроме того, если формальный параметр вызывается значением, то локальный массив, возникающий в теле процедуры во время обращения, получает те же границы индексов, что и фактический массив.
Формальному параметру, вызываемому значением, не может, вообще говоря, соответствовать какой-либо идентификатор переключателя или идентификатор процедуры, или строка, так как последние не обладают значениями. (Исключение составляет идентификатор такой процедуры, описание которой имеет пустую совокупность формальных параметров (см. п. 5.4.1) и которая определяет значение указателя функции (см. и. 5.4.4). Такой идентификатор процедуры сам по себе является законченным выражением).
При вызове по наименованию класс и тип фактического параметра должны совпадать с классом и типом соответствующего формального параметра. Однако, если при выполнении процедуры не происходит присвоения значения этому параметру, то фактический параметр типа integer может соответствовать формальному параметру типа real.
Не может произойти обращение к какой-либо процедуре при выполнении операторов тела этой же самой процедуры или при вычислении тех ее фактических параметров, которым соответствуют формальные параметры, вызываемые по наименованию, или при вычислении выражений, встречающихся в описаниях внутри этой же процедуры.
Ограничители параметров
Все ограничители параметров считаются эквивалентными. Не устанавливается никакого соответствия между ограничителями параметров, используемыми в операторе процедуры, и ограничителями, фигурирующими в заголовке процедуры, кроме того лишь, что их количество должно быть одинаковым. Таким образом, вся информация, которая вносится употреблением сложных ограничителей, полностью избыточна.
5. ОПИСАНИЯ
Описания служат для определения некоторых свойств величин, используемых в программе, и связи этих величин с идентификаторами. Описание идентификатора имеет силу только в одном блоке. Вне этого блока то же идентификатор можно использовать для других целей (см. п. 4.1.3).
В процессе работы это влечет за собой следующее: с момента входа в блок (через begin, так как внутренние метки локальны и, следовательно, недостижимы извне) все идентификаторы, описанные в блоке, приобретают смысл, вытекающий из природы данных описаний. Если эти идентификаторы уже были определены другими описаниями, находящимися вне блока, то на некоторое время они получают новый смысл. С другой стороны, те идентификаторы, которые не описаны в блоке, сохраняют свой прежний смысл.
В момент выхода из блока (через end или оператор перехода) все идентификаторы, которые описаны в блоке, теряют свой локальный смысл.
В программе все идентификаторы простых переменных, массивов. переключателей и процедур (кроме стандартных процедур и функций, (см. разд. 6) следует описывать при помощи описаний. Ни один идентификатор в блоке не должен быть описан более чем один раз. Идентификатор, связанный с величиной некоторым описанием, не может более одного раза встретиться, обозначая эту величину, между begin блока, в начале которого стоит это описание, и точкой с запятой, которой оканчивается это описание, за исключением случая, когда имеет место появления идентификатора процедуры в списке левой части оператора присваивания в смысле п. 5 4.4.
Синтаксис
<описание> : : = <описание типа> [ <описание массивов> |
<описание переключателя> | <описание процедуры >
Описание типа
Синтаксис
<список типа> :: = Спростая переменная>| <список тппа>, <простая переменная>
<тип> :: = real (integer (Boolean
<описание типа> : : = <тип> <список типа>
Примеры
integer Р, Q, S
Boolean ACRYL, N
Семантика
Описания типа служат для указания того, что некоторые идентификаторы представляют простые переменные данного типа. Переменные, которым описанием дан тип real, могут принимать только положительные и отрицательные значения, включая нуль. Переменные. которым описанием дан тип integer, могут принимать только целые значения. Переменные, которым описанием дан тип Boolean, могут принимать только значения true н false.
В арифметических выражениях любая позиция, занятая переменной типа real, может быть занята и переменной типа integer.
Описан и я массивов
Синтаксис
<нижняя граница> :: = <арифметическое выражение>
<верхвяя граница>: : = <арифметическое выражение>
<граничная пара> :: = <пижняя граница>: <вер.хняя гра-
П!'ца>
<список граничных пар> :: = <граничная пара> / <список граничных пар>, <граничная пара>
<список идентификаторов массивов> :: = Идентификатор
массива> | <список идентификаторов массивов>, <иденти- фикатор массива>
<сегмент масс,ивов> : : = <список идентификаторов массивов> [<список граничных пар>]
<список массивов> :: = <сегмеит массивов> ( <список мас- с.ивов>, <сегмснт массивов>
<описаиие массивов> :: =array <список массивов>| <тип> array<список массивов>