<заголовск UHKMa>:: = for <идеитификатор переменной;» : = <список цикла > do

<оператор цикла> :: = <заголовок цикла > <оператор>| <метка>: <оператор цикла>

  1. Примеры

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]

  1. Семантика

Заголовок цикла заставляет стоящий за ним оператор S повтор­но выполняться нуль или более раз. Кроме того, он осуществляет последовательные присваивания значений переменной, управляе­мой данным заголовком, так называемому параметру цикла. Этот процесс может быть пояснен следующей схемой:

начало; проверка; оператор S; продвижение; преемник 1 список цикла исчерпан

В этой схеме слова означают: «начало» — произвести первое присваивание в заголовке цикла; «продвижение» — произвести очередное присваивание в заголовке цикла; слово «проверка» опре­деляет. было ли сделано последнее присваивание. Если оно сдела­но, то выполнение продолжается с преемника оператора цикла. В противном случае выполняется оператор, стоящий за заголовком цикла.

  1. Элементы списка цикла

Список цикла дает правило для получения значений, которые последовательно присваиваются параметру цикла. Эта последова­тельность значений получается из элементов списка цикла путем их последовательного перебора в порядке их написания. Последова­тельность значений, порождаемая каждой из трех разновидностей элементов списка цикла, и соответствующее выполнение оператора S определяются следующими правилами.

  1. Арифметическое выражение. Этот элемент за­дает только одно значение, а именно значение данного арифметиче­ского выражения, вычисленное непосредственно перед соответству­ющим выполнением оператора S.

  2. Элемент типа арифметической прогре с- с и и. Элемент, имеющий вид A step L until С, где А, В и С — ариф­метические выражения, задает порядок выполнения, который наи­более четко можно описать при помощи дополнительных операто­ров АЛГАМСа следующим образом:

V:=A;

LI :if (V— (С)) XSIGN(B) >0 then go to элемент исчерпан; оператор S;

V:=V+(B);

go to L1;

где V — параметр цикла и «элемент исчерпан» указывает на пере­ход к вычислениям, соответствующим следующему элементу спис­ка цикла, или (если данный элемент типа арифметической прогрес­сии стоит последним в описке) к следующему оператору программы.

  1. Элемент типа пересчета. Порядок выполне­ния, определяемый элементом списка цикла вида A while В, где А — арифметическое выражение, В—логическое выражение, наи­более четко описывается при помощи дополнительных операторов АЛГАМСа следующим образом:

L3:V:=A;

if I (В)then go to элемент исчерпан; оператор S;

go to L3,

Обозначения те же, что и в п. 4.6.4.2.

  1. Значение параметра цикла после выхода

После выхода из оператора S посредством какого-либо опера­тора перехода значение параметра цикла будет таким, каким оно было непосредственно перед выполнением оператора перехода.

С другой стороны, если выход вызван исчерпанием списка цик­ла, то значение параметра цикла после выхода не определено.

  1. Оператор перехода, ведущий в оператор цикла

Результат действия оператора перехода, стоящего вне операто­ра цикла и обращающегося к метке внутри оператора цикла, не оп­ределен.

  1. Операторы процедур

    1. Синтаксис

<фактический параметр>:: = <строка> | <выражение> | •Идентификатор массива> | <идентификатор переключате- ля> I -^идентификатор процедуры>

<строка букв>:: =<буква > | <строка букв><буква >

<ограничитель параметра> :: = ,| ) <строка букв>:(

<спнсок фактических параметров> : : = <фактический пара- метр> I <сш!сок фактических параметров> <ограничитель параметра> <фактический параметр>

<совокупность фактических параметров> :: = <пусто> | (<список фактических параметров>)

Соператор процедуры> : : = <идентификатор процедуры> ^совокупность фактических параметров>

  1. Примеры

след (А) порядок: (7) результат: (V)

транспонирование (W, V+1)

абсмакс (A, N, М, YY, I, К)

скалярное произведение (А[Т, Р, U], В[Р], 10, Р, Y)

Эти примеры соответствуют примерам, данным в п. 5.4.2

  1. Семантика

Оператор процедуры служит для обращения к выполнению тела процедуры (см. п. 5.4). Кроме случаев, когда тело процедуры имеет вид LIBRARY (<строка>), результат его выполнения будет эк- Бивалентен результату осуществления следующих действий в прог­рамме во время выполнения оператора процедуры.

    1. Присваивание значений (вызов значе­нием). Всем формальным параметрам, перечисленным в списке значений заголовка описания процедуры, присваиваются значения (см. п. 2.8) соответствующих фактических параметров. Эти при­сваивания следует рассматривать как выполняемые непосредствен­но перед входом в тело процедуры. Это происходит так, как будто создается объемлющий тело процедуры дополнительный блок (см. п. 4.1.3), в котором делаются присваивания переменным, ло­кальным в этом фиктивном блоке и имеющим типы, заданные со­ответствующими спецификациями (см. п. 5.4.5). В результате пе­ременные, вызываемые значением, следует рассматривать как ло­кальные в этом фиктивном блоке и нелокальные в теле процедуры (см. и. 5.4.3).

    2. 3 а м е н а н а и м ей о в а н и й (вызов по наиме­нованию). Любой формальный параметр, не перечисленный в списке значений, повсюду в теле процедуры заменяется на соответ­ствующий фактический параметр, после того, как последний там, где это синтаксически возможно, заключен в круглые скобки. Воз­можность противоречий между идентификаторами, вставляемыми в тело процедуры в результате такого процесса, и идентификатора­ми, уже присутствующими в теле процедуры, устраняется соответ­ствующими систематическими изменениями локальных идентифи­каторов, затронуты?: такими противоречиями.

    3. Подстановка и выполнение тела проце­дур ы. Тело процедуры, преобразованное как описано выше, поме­щается на место оператора процедуры и выполняется. Если обра­щение к процедуре производится извне области действия любой величины, нелокальной в теле процедуры, то противоречия между идентификаторами, включенными посредством этого процесса под­становки тела, и идентификаторами, описания которых имеют силу там, где расположен оператор процедуры или указатель функции, устраняются посредством соответствующих систематических изме­нений последних идентификаторов.

  1. Соответствие между фактическими и формальными пара­метрами

Соответствие между фактическими параметрами оператора про­цедуры и формальными параметрами заголовка процедуры уста­навливается следующим образом. Список фактических параметров оператора процедуры должен иметь то же число членов, что и спи­сок формальных параметров заголовка описания процедуры. Со­ответствие получается сопоставлением членов этих двух списков в одном и том же порядке.

  1. Ограничения

Чтобы оператор процедуры был определен, очевидно, необходи­мо, чтобы действия над телом процедуры, определенные в пп. 4.7.3.1 и 4.7.3.2, приводили бы к правильному оператору в языке АЛГАМС.

Это накладывает на любой оператор процедуры ограничения, заключающиеся в том, что класс и тип каждого фактического пара­метра должен быть совместим с классом и типом соответствующе­го формального параметра. Некоторые важные частные случаи этого общего правила приведены ниже.

    1. Если строка является фактическим параметром операто­ра процедуры или указателя функции, для которых соответствую­щее тело процедуры является оператором в смысле языка АЛГАМС (а не LIBRARY (<строка>)), то эту строку можно использовать в теле процедуры только как фактический параметр в дальнейших обращениях к процедурам. В конечном итоге строку можно исполь­зовать только в теле процедуры вида LIBRARY (<строка>) либо в соответствующих стандартных процедурах.

    2. Формальному параметру, не вызываемому значением и встречающемуся в теле процедуры в виде переменной левой части некоторого оператора присваивания, может соответствовать в ка­честве фактического параметра только переменная (частный случай выражения).

    3. Формальному параметру, используемому в теле проце­дуры в качестве идентификатора массива, может соответствовать в качестве фактического параметра только идентификатор массива той же размерности. Кроме того, если формальный параметр вызы­вается значением, то локальный массив, возникающий в теле про­цедуры во время обращения, получает те же границы индексов, что и фактический массив.

    4. Формальному параметру, вызываемому значением, не может, вообще говоря, соответствовать какой-либо идентификатор переключателя или идентификатор процедуры, или строка, так как последние не обладают значениями. (Исключение составляет иден­тификатор такой процедуры, описание которой имеет пустую сово­купность формальных параметров (см. п. 5.4.1) и которая опреде­ляет значение указателя функции (см. и. 5.4.4). Такой идентифи­катор процедуры сам по себе является законченным выражением).

    5. При вызове по наименованию класс и тип фактического параметра должны совпадать с классом и типом соответствующего формального параметра. Однако, если при выполнении процедуры не происходит присвоения значения этому параметру, то фактиче­ский параметр типа integer может соответствовать формальному параметру типа real.

    6. Не может произойти обращение к какой-либо процеду­ре при выполнении операторов тела этой же самой процедуры или при вычислении тех ее фактических параметров, которым соответ­ствуют формальные параметры, вызываемые по наименованию, или при вычислении выражений, встречающихся в описаниях внутри этой же процедуры.

  1. Ограничители параметров

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

5. ОПИСАНИЯ

Описания служат для определения некоторых свойств величин, используемых в программе, и связи этих величин с идентификато­рами. Описание идентификатора имеет силу только в одном блоке. Вне этого блока то же идентификатор можно использовать для других целей (см. п. 4.1.3).

В процессе работы это влечет за собой следующее: с момента входа в блок (через begin, так как внутренние метки локальны и, следовательно, недостижимы извне) все идентификаторы, описан­ные в блоке, приобретают смысл, вытекающий из природы данных описаний. Если эти идентификаторы уже были определены други­ми описаниями, находящимися вне блока, то на некоторое время они получают новый смысл. С другой стороны, те идентификаторы, которые не описаны в блоке, сохраняют свой прежний смысл.

В момент выхода из блока (через end или оператор перехода) все идентификаторы, которые описаны в блоке, теряют свой ло­кальный смысл.

В программе все идентификаторы простых переменных, масси­вов. переключателей и процедур (кроме стандартных процедур и функций, (см. разд. 6) следует описывать при помощи описаний. Ни один идентификатор в блоке не должен быть описан более чем один раз. Идентификатор, связанный с величиной некоторым опи­санием, не может более одного раза встретиться, обозначая эту ве­личину, между begin блока, в начале которого стоит это описание, и точкой с запятой, которой оканчивается это описание, за исклю­чением случая, когда имеет место появления идентификатора про­цедуры в списке левой части оператора присваивания в смысле п. 5 4.4.

Синтаксис

<описание> : : = <описание типа> [ <описание массивов> |

<описание переключателя> | <описание процедуры >

  1. Описание типа

    1. Синтаксис

<список типа> :: = Спростая переменная>| <список тппа>, <простая переменная>

<тип> :: = real (integer (Boolean

<описание типа> : : = <тип> <список типа>

  1. Примеры

integer Р, Q, S
Boolean ACRYL, N

  1. Семантика

Описания типа служат для указания того, что некоторые иден­тификаторы представляют простые переменные данного типа. Пе­ременные, которым описанием дан тип real, могут принимать толь­ко положительные и отрицательные значения, включая нуль. Пере­менные. которым описанием дан тип integer, могут принимать толь­ко целые значения. Переменные, которым описанием дан тип Boolean, могут принимать только значения true н false.

В арифметических выражениях любая позиция, занятая пере­менной типа real, может быть занята и переменной типа integer.

  1. Описан и я массивов

    1. Синтаксис

<нижняя граница> :: = <арифметическое выражение>

<верхвяя граница>: : = <арифметическое выражение>

<граничная пара> :: = <пижняя граница>: <вер.хняя гра-

П!'ца>

<список граничных пар> :: = <граничная пара> / <список граничных пар>, <граничная пара>

<список идентификаторов массивов> :: = Идентификатор

массива> | <список идентификаторов массивов>, <иденти- фикатор массива>

<сегмент масс,ивов> : : = <список идентификаторов массивов> [<список граничных пар>]

<список массивов> :: = <сегмеит массивов> ( <список мас- с.ивов>, <сегмснт массивов>

<описаиие массивов> :: =array <список массивов>| <тип> array<список массивов>