Индексное выражение
Вычисление значения индексного выражения аналогично такому же вычислению для переменных с индексами (см. п. 3.1.4.2). Значение указателя переключателя определено только в том случае, когда индексное выражение принимает одно из положительных значений 1, 2, 3, ..., п, где п — число членов в переключательном списке.
ОПЕРАТОРЫ
Единицы действий в языке называются операторами. Обычно они выполняются в той последовательности, в которой написаны. Однако эта ■последовательность действий может прерываться операторами перехода, которые явно определяют своего преемника, и сокращаться условными операторами, которые могут вызывать пропуск некоторых операторов.
Для того, чтобы имелась возможность указать фактический порядок следования операторов в процессе работы, оператор может быть снабжен метками.
Для возможной сегментации программы операторы, являющиеся блоками, могут, кроме того, помечаться особыми метками, пазы в; ! е м ы м и и д е и т и ф 11 к а т о р а м и час т е й.
Ввиду того, что последовательности операторов могут группироваться в составные операторы и блоки, определение оператора 510 необходимости должно быть рекурсивным. Кроме того, поскольку описания, которые даны в разд. 5, существенно входят в синтаксическую структуру, синтаксическое определение операторов должно предполагать, что описания уже определены.
Состав н ы е о п е р а т о р ы и блок и
Синтаксис
< непомеченный основной олератор> : : = <оператор присваи- вания> I <оператор перехода>/<пустой опсратор> | <оператор процедуры>
<основной оператор>:: = <пепомеченный основной опера- тор> I <метка>:<оспов(пой оператор>
^безусловный оператор> :: = <основной оператор> | Составной оператор> I <блок>
<оператор>:: = <безусловиый оператор> | <условный опера- тор> I <оператор цикла>
<тело составного> :: <оператор> ( <тело составного>;
<оператор>
<пачало блока > :: = begin <описание> ! <начало блока>;
<описание>
<пепомеченный составной> :: = begin <тело составного>епс1
<непомеченный блок> :: =-Сначала блока>; <тело составного > end
<составной опёратор>:: = ^непомеченный составной> j <мет- ка>: = <составпой оператор>
<блок> :: = <непомеченпый блок> [ <идентификатор части>:
<пепомечепный блок> I <метка> :-= <блок>
<программа>:: = <блок> ) <составной оператор>
Этот синтаксис можно проиллюстрировать следующим образом. Обозначим произвольные операторы, описания, метки и идентификаторы частей буквами S, D, 1. п Р соответственно. Тогда основные синтаксические единицы примут следующий вид:
составной оператор:
L:L: . . . begin S; S; . . . S; S end
блок:
L:L: . . . : P: begin D; D; . . . D; S; S; . . . S; S end
При этом нужно помнить, что каждый из операторов S может в свою очередь, быть составным оператором или блоком. Метка перед двоеточием в любом операторе (основном, составном, блоке, условном и цикле), а также идентификатор части в блоке помечаю;- соответствующий оператор.
Примеры
основные оператор;к
A:- P + Q
go io NAPLES
START : CONTINUE : W : = 7.993
составной оператор:
begin Х: = 0; for Y:= 1 step 1 until N do X = X + A[Y];
if X>Q then go to STOP else if X>W—2 then go to S;
AW:ST:W: = X + BOB end блок:
Q: begin integer I, K; real W;
for I:=l step 1 until M do for K: = 1 + 1 step 1 until M do begin W:=A[I, K]; A[I, K]: = A[K, I]; A[K, I]: = W end FOR I ANDK end BLOCK Q
Семантика
Каждый блок вводит новый уровень обозначений. Это означает, что некоторые идентификаторы, встречающиеся внутри блока, то есть между соответствующими скобками begin и end определяются как локальные в данном блоке, то есть объект, представленный таким идентификатором внутри данного блока, существует только внутри этого блока, а любой объект, представленный тем же идентификатором вне внутренности данного блока, нельзя непосредственно использовать внутри блока (о косвенном использовании см. пп. 4.7.3.2, 4.7.3.3, 5.3.4).
Поскольку в языке имеются стандартные процедуры и функции (см. разд. 6), и наряду с блоком новый уровень обозначений может быть введен как описанием процедуры, так и телом процедуры, то для объяснения правил локализации введем некоторые фиктивные блоки. Во-первых, будем считать, что программа содержится в некотором объемлющем фиктивном блоке, внутренность которого и есть вся программа. Во-вторых, будем считать каждое описание процедуры (см. п. 5.4) фиктивным блоком, внутренность которого начинается с совокупности формальных параметров в заголовке описания этой процедуры, точнее, что начинающие описание процедуры описатель типа (если он есть), описатель procedure и идентификатор описываемой процедуры как бы составляет открывающую скобку begin фиктивного блока, в то время, как закрывающая скобка end этого блока подразумевается непосредственно перед точкой с запятой, следующей за описанием рассматриваемой процедуры. В-третьих, будем считать каждое тело процедуры внутренностью фиктивного блока, подразумевая непосредственно перед телом процедуры и непосредственно за ним соответствующее скобки begin и end. Для двух любых блоков, включая фиктивные, справедливо утверждение о том, что либо они не пересекаются, либо один из них содержится в другом. Понимая под термином блок как определенные синтаксисом п. 4.1.1 блоки, так и только что описанные фиктивные блоки, можно сформулировать правила локализации идентификаторов следующим образом.
Каждое обозначение, то есть связь идентификатора с объектом (локализация), вводится в некотором блоке. Введенная в блоке связь идентификатора с каким-либо объектом действует внутри этого блока всюду, но те внутри содержащихся в этом блоке блоков, в которых этот же идентификатор связан с другим объектом.
Идентификатор, встречающийся внутри блока и нелокальный в нем, должен быть локальным в одном из блоков, объемлющем данный блок. Таким образом идентификатор, нелокальный в блоке А, может быть локальным или не локальным в блоке В, для которого А является одним из его операторов.
Специальный идентификатор LIBRARY (см. пп. 5.4.1 и 5.4.3) и идентификаторы стандартных процедур и функций (см. разд. 6) локальны в самом внешнем фиктивном блоке. Локализация идентификаторов простых переменных, массивов, переключателей и процедур (кроме стандартных) осуществляется описаниями (см. разд. 5) в начале соответствующего блока. В блоке локализуются также идентификаторы меток и идентификаторы частей, помечающие те операторы, которые лежат внутри данного блока, ио не лежат внутри блока, содержащегося внутри данного блока. Наконец, в фиктивном блоке, возникающем из описания процедуры, локализуются идентификаторы формальных параметров из соответствующей совокупности формальных параметров. В фиктивном блоке, возникающем из тела процедуры, могут быть локальны лишь идентификаторы меток и идентификаторы частей.
Идентификатор части изображается идентификатором, начинающимся с букв PART, и служит для указания транслятору о сегментации составляемой программы. Предполагается, что команды составляемой программы, которые соответствуют блоку, помеченному идентификатором части (за исключением команд, соответствующих блокам, входящим в данный, и также помеченным идентификаторами части), располагаются в отдельном участке внешней памяти машины и целиком вызываются в оперативную память при входе в этот блок. Считается, что части программы, не содержащиеся в блоках, помеченных идентификаторами части, постоянно находятся в оперативной памяти.
Операторы присваивания
Синтаксис
<левая часть> : : = <переменпая> : = | <идентификатор процедурні : =
<список левой части> : = <левая часть> ( <список левой ча- сти> <левая часть>
<оператор присваивания^»:: = <список левой части> Арифметическое выражение>| <список левой части> «Алогическое выражение>
Примеры
S: = P[O]: = N: = N+1+S
N: = N + 1
А: = В/С—V—QXS
S[V, К + 2] : =3 ARCTAN (TXZETA)
V: = Q>Y V Z
Семантика
Операторы присваивания служат для присваивания значения выражения одной или нескольким переменным или идентификаторам процедур. Присваивание идентификатору процедуры может встречаться только внутри тела процедуры, определяющей значение указателя функции (см. п. 5.4.4). Подразумевается, что в общем случае этот процесс проходит в следующие три этапа.
Значения всех индексных выражений, встречающихся в переменных левой части, вычисляются в порядке слева направо.
Вычисляется значение выражения в операторе.
Значение выражения присваивается всем переменным левой части, при этом индексные выражения имеют значения, вычисленные на шаге 4.2.3.1.
Типы
Переменные и идентификаторы процедур списка левой части дол,кия; по описанию иметь один и тот же тип. Если это тип Boolean, то выражение также должно быть типа Boolean. Если этот тип real или integer, то выражение должно быть арифметическим. Если тин арифметического выражения отличается от типа переменных и идентификаторов процедур, то считают, что автоматически применяется соответствующая функция преобразования. Имеется з виду, что для преобразования из типа real в тип integer функция преобразования выдает результат, эквивалентный
ENTIER (Е + 0.5),
где Е — значение выражения. Тип идентификатора процедуры выдается описателем, который является первым символом соответствующего описания процедуры (см. и. 5.4.4).
Операторы перехода
Синтаксис
<оператор перехода>::= goto <именующее выражение>
Примеры
go to L8
go to EXIT [N+l]
go to TOWN[ifY<O then N else N+l]
Семантика
Оператор перехода прерывает естественную последовательность действий, задаваемую порядком написания операторов, явно определяя своего преемника ко значению именующего выражения. Та- ким образом, следующим выполняемым оператором будет тот, который имеет это значение в качестве своей метки.
Ограничение
В силу правил локализации меток ни один оператор перехода не может извне вести к метке внутри блока. Однако оператор перехода может вести извне к метке внутри составного оператора или внутри условного оператора (см. пп. 4.5.4 и 4.6.6).
Пустые операторы
Синтаксис
<пустой оператору : : = <пусто>
Примеры
L:
begin . . . ; JOHN : end
Семантика
Пустой оператор не выполняет никакого действия. Он может служить для помещения метки.
Условные о п е р а т о р ы
Синтаксис
<условие> : : =: if <логическое выражение> then
<безусловный оператору : : = <основной оператор> j Составной оператору) < блоку
<оператор «если»> :: = <усло.вие> <безусловный оператор>
<условный оператору :: = <оператор «если»У | <оператор «если»> else <оператор>/ <условие><оператор циклаУ | <,метка>: <условный оператору
Примеры
if Ху0 then N: ==N+ 1
if VyU then W:Q: = N + M else go to R
if S<0 V P<Q then AA:begin if Q<V then A: = V/S
else Y : =2XA end
else if VyS then A : = V—Q
else if VyS—1 then go to ST
Семантика
Условные операторы приводят к пропуску или выполнению некоторых операторов в зависимости от текущих значений указанных логических выражений. Согласие; синтаксису возможны две различные формы условных операторов: укороченный условный оператор if В then S полный условный оператор if В then SI else S2. Здесь В—логическое выражение, S — безусловный оператор или оператор цикла, S1—безусловный оператор и S2 — оператор.
Если текущее значение логического выражения В есть true, то выполнение укороченного условного оператора сводится к выполнению оператора S. а выполнение полного условного оператора к выполнению оператора S1. Если же текущее значение логического выражения В есть false , то в случае укороченного условного оператора действия продолжаются так, как будто он был пустым оператором, а в случае полного условного оператора его выполнение сводится к выполнению оператора S2. Во всех случаях преемник условного оператора определяется общими правилами, то есть так, как будто на месте условного оператора стоял один из операторов S, SI, S2 или пустой оператор в соответствии с тем пли иным из описанных выше случаев.
В силу описанного действие ограничителя else в полном условном операторе можно охарактеризовать, сказав, что он определяет в качестве преемника оператора, за которым этот ограничитель следует, оператор, который надо выполнят!; за соответствующим полным условным оператором.
Для дальнейших пояснений используем следующую схему с очевидными обозначениями
оператор выполнен
’’ f
if Bl then SI else if B2 then S2 else S3
1* V
Bl ложно B2 ложно
4 54. Переход внутрь условного оператора
Результат работы оператора перехода, ведущего внутрь условного оператора, непосредственно следует из объясненного выше действия ограничителя else.
Операторы цикла
Синтаксис
<элемент списка цикла> :: = <арифметическое выражение> | <арифметическое выражение;» step <арифметическое выражение;» until <арифметическое выражение;»/ <арифметиче- ское выражение;»while <логическое выражение;»
<список цикла> :: = <элемент списка цикла>/<список цикла >, <элемент списка цикла>