1. Индексное выражение

Вычисление значения индексного выражения аналогично тако­му же вычислению для переменных с индексами (см. п. 3.1.4.2). Значение указателя переключателя определено только в том слу­чае, когда индексное выражение принимает одно из положитель­ных значений 1, 2, 3, ..., п, где п — число членов в переключа­тельном списке.

  1. ОПЕРАТОРЫ

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

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

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

Ввиду того, что последовательности операторов могут группи­роваться в составные операторы и блоки, определение оператора 510 необходимости должно быть рекурсивным. Кроме того, посколь­ку описания, которые даны в разд. 5, существенно входят в син­таксическую структуру, синтаксическое определение операторов должно предполагать, что описания уже определены.

  1. Состав н ы е о п е р а т о р ы и блок и

    1. Синтаксис

< непомеченный основной олератор> : : = <оператор присваи- вания> 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 может в свою очередь, быть составным оператором или блоком. Метка перед двоеточием в любом операторе (основном, составном, бло­ке, условном и цикле), а также идентификатор части в блоке по­мечаю;- соответствующий оператор.

  1. Примеры

основные оператор;к

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

  1. Семантика

Каждый блок вводит новый уровень обозначений. Это означа­ет, что некоторые идентификаторы, встречающиеся внутри блока, то есть между соответствующими скобками begin и end определя­ются как локальные в данном блоке, то есть объект, представлен­ный таким идентификатором внутри данного блока, существует только внутри этого блока, а любой объект, представленный тем же идентификатором вне внутренности данного блока, нельзя не­посредственно использовать внутри блока (о косвенном использо­вании см. пп. 4.7.3.2, 4.7.3.3, 5.3.4).

Поскольку в языке имеются стандартные процедуры и функции (см. разд. 6), и наряду с блоком новый уровень обозначений мо­жет быть введен как описанием процедуры, так и телом процеду­ры, то для объяснения правил локализации введем некоторые фик­тивные блоки. Во-первых, будем считать, что программа содержит­ся в некотором объемлющем фиктивном блоке, внутренность ко­торого и есть вся программа. Во-вторых, будем считать каждое описание процедуры (см. п. 5.4) фиктивным блоком, внутренность которого начинается с совокупности формальных параметров в заголовке описания этой процедуры, точнее, что начинающие опи­сание процедуры описатель типа (если он есть), описатель proce­dure и идентификатор описываемой процедуры как бы составля­ет открывающую скобку begin фиктивного блока, в то время, как закрывающая скобка end этого блока подразумевается непосред­ственно перед точкой с запятой, следующей за описанием рассма­триваемой процедуры. В-третьих, будем считать каждое тело про­цедуры внутренностью фиктивного блока, подразумевая непо­средственно перед телом процедуры и непосредственно за ним со­ответствующее скобки begin и end. Для двух любых блоков, вклю­чая фиктивные, справедливо утверждение о том, что либо они не пересекаются, либо один из них содержится в другом. Понимая под термином блок как определенные синтаксисом п. 4.1.1 блоки, так и только что описанные фиктивные блоки, можно сформули­ровать правила локализации идентификаторов следующим обра­зом.

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

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

Специальный идентификатор LIBRARY (см. пп. 5.4.1 и 5.4.3) и идентификаторы стандартных процедур и функций (см. разд. 6) локальны в самом внешнем фиктивном блоке. Локализация иден­тификаторов простых переменных, массивов, переключателей и процедур (кроме стандартных) осуществляется описаниями (см. разд. 5) в начале соответствующего блока. В блоке локализуются также идентификаторы меток и идентификаторы частей, помечаю­щие те операторы, которые лежат внутри данного блока, ио не лежат внутри блока, содержащегося внутри данного блока. Нако­нец, в фиктивном блоке, возникающем из описания процедуры, локализуются идентификаторы формальных параметров из соот­ветствующей совокупности формальных параметров. В фиктивном блоке, возникающем из тела процедуры, могут быть локальны лишь идентификаторы меток и идентификаторы частей.

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

  1. Операторы присваивания

    1. Синтаксис

<левая часть> : : = <переменпая> : = | <идентификатор про­цедурні : =

<список левой части> : = <левая часть> ( <список левой ча- сти> <левая часть>

<оператор присваивания^»:: = <список левой части> Ариф­метическое выражение>| <список левой части> «Алогиче­ское выражение>

  1. Примеры

S: = P[O]: = N: = N+1+S

N: = N + 1

А: = В/С—V—QXS

S[V, К + 2] : =3 ARCTAN (TXZETA)

V: = Q>Y V Z

  1. Семантика

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

    1. Значения всех индексных выражений, встречающихся в переменных левой части, вычисляются в порядке слева направо.

    2. Вычисляется значение выражения в операторе.

    3. Значение выражения присваивается всем переменным левой части, при этом индексные выражения имеют значения, вы­численные на шаге 4.2.3.1.

  1. Типы

Переменные и идентификаторы процедур списка левой части дол,кия; по описанию иметь один и тот же тип. Если это тип Boo­lean, то выражение также должно быть типа Boolean. Если этот тип real или integer, то выражение должно быть арифметическим. Если тин арифметического выражения отличается от типа пере­менных и идентификаторов процедур, то считают, что автомати­чески применяется соответствующая функция преобразования. Имеется з виду, что для преобразования из типа real в тип integer функция преобразования выдает результат, эквивалентный

ENTIER (Е + 0.5),

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

  1. Операторы перехода

    1. Синтаксис

<оператор перехода>::= goto <именующее выражение>

  1. Примеры

go to L8

go to EXIT [N+l]

go to TOWN[ifY<O then N else N+l]

  1. Семантика

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

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

В силу правил локализации меток ни один оператор перехода не может извне вести к метке внутри блока. Однако оператор перехода может вести извне к метке внутри составного оператора или внутри условного оператора (см. пп. 4.5.4 и 4.6.6).

  1. Пустые операторы

    1. Синтаксис

<пустой оператору : : = <пусто>

  1. Примеры

L:

begin . . . ; JOHN : end

  1. Семантика

Пустой оператор не выполняет никакого действия. Он может служить для помещения метки.

  1. Условные о п е р а т о р ы

    1. Синтаксис

<условие> : : =: if <логическое выражение> then

<безусловный оператору : : = <основной оператор> j Состав­ной оператору) < блоку

<оператор «если»> :: = <усло.вие> <безусловный оператор>

<условный оператору :: = <оператор «если»У | <оператор «если»> else <оператор>/ <условие><оператор циклаУ | <,метка>: <условный оператору

  1. Примеры

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

  1. Семантика

Условные операторы приводят к пропуску или выполнению не­которых операторов в зависимости от текущих значений указанных логических выражений. Согласие; синтаксису возможны две различ­ные формы условных операторов: укороченный условный оператор 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.

  1. Операторы цикла

    1. Синтаксис

<элемент списка цикла> :: = <арифметическое выражение> | <арифметическое выражение;» step <арифметическое выра­жение;» until <арифметическое выражение;»/ <арифметиче- ское выражение;»while <логическое выражение;»

<список цикла> :: = <элемент списка цикла>/<список цик­ла >, <элемент списка цикла>