Х. Мёссенбёк, Н. Вирт - Язык программирования Оберон-2 (1160786), страница 3
Текст из файла (страница 3)
Тип e должен быть целым типом. Обозначение вида a[e0, e1, ..., en] применимо вместо a[e0][e1] ... [en]. Если r обозначает запись, то r.f означает поле f записи r или процедуру f, связанную сдинамическим типом r (Гл. 10.2). Если p обозначает указатель, p^ означает переменную, накоторую ссылается p. Обозначения p^.f и p^[e] могут быть сокращены до p.f и p[e], то есть записьи индекс массива подразумевают разыменование. Если a или r доступны только для чтения, тоa[e] и r.f также предназначены только для чтения.Охрана типа v(T) требует, чтобы динамическим типом v был T (или расширение T), то естьвыполнение программы прерывается, если динамический тип v - не T (или расширение T). Впределах такого обозначения v воспринимается как имеющая статический тип T.
Охранаприменима, если1. v - параметр-переменная типа запись, или v - указатель, и если2. T - расширение статического типа vЕсли обозначенный объект - константа или переменная, то обозначение ссылается на их текущеезначение. Если он - процедура, то обозначение ссылается на эту процедуру, если толькообозначение не сопровождается (возможно пустым) списком параметров. В последнем случаеподразумевается активация процедуры и подстановка значения результата, полученного при ееисполнении. Фактические параметры должны соответствовать формальным параметрам как и привызовах собственно процедуры (см.
10.1).Примеры обозначений (со ссылками на примеры из Гл. 7):i(INTEGER)10a[i]w[3].name[i]t.left.rightt(CenterTree).subnode(REAL)(CHAR)(Tree)(Tree)8.2 ОперацииВ выражениях синтаксически различаются четыре класса операций с разными приоритетами(порядком выполнения). Операция ~ имеет самый высокий приоритет, далее следуют операциитипа умножения, операции типа сложения и отношения.
Операции одного приоритетавыполняются слева направо. Например, x-y-z означает (x- y) -z.ВыражениеПростоеВыражениеСлагаемоеМножитель=ПростоеВыражение [Отношение ПростоеВыражение].=["+" | "-"] Слагаемое {ОперацияСложения Слагаемое}.=Множитель {ОперацияУмножения Множитель}.=Обозначение [ФактическиеПараметры] | число | символ | строка| NIL | Множество | "(" Выражение ")" | "~" Множитель.Множество="{" [Элемент {"," Элемент}] "}".Элемент=Выражение [".." Выражение].ФактическиеПараметры ="(" [СписокВыражений] ")".Отношение="=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.ОперацияСложения="+" | "-" | OR.ОперацияУмножения="*" | "/" | DIV | MOD | "&".Предусмотренные операции перечислены в следующих таблицах. Некоторые операцииприменимы к операндам различных типов, обозначая разные действия. В этих случаяхфактическая операция определяется типом операндов.
Операнды должны быть совместимымивыражениями для данной операции (см. Прил. A).8.2.1 Логические операцииOR логическая дизъюнкция& логическая конъюнкция~отрицаниеp OR qp&q~p"если p, то TRUE, иначе q""если p то q, иначе FALSE""не p"Эти операции применимы к операндам типа BOOLEAN и дают результат типа BOOLEAN.8.2.2 Арифметические операции+*/DIVMODсумма - разностьпроизведениевещественное делениеделение нацелоостатокОперации +, -, *, и / применимы к операндам числовых типов.
Тип их результата - тип тогооперанда, который поглощает тип другого операнда, кроме деления (/), чей результат наименьший вещественный тип, который поглощает типы обоих операндов. При использовании вкачестве одноместной операции "-" обозначает перемену знака, а "+" - тождественную операцию.Операции DIV и MOD применимы только к целочисленным операндам. Они связаны следующимиформулами, определенными для любого x и положительного делителя y:x = (x DIV y) * y + (x MOD y)0 < = (x MOD y) < y11Примеры:xyx DIV yx MOD y5312-53-218.2.3 Операции над множествами+*/объединениеразность (x - y = x * (-y))пересечениесимметрическая разность множеств (x / y = (x-y) + (y-x))Эти операции применимы к операндам типа SET и дают результат типа SET.
Одноместный"минус" обозначает дополнение x, то есть -x это множество целых между 0 и MAX(SET), которыене являются элементами x. Операции с множествами не ассоциативны ((a+b)-c # a+(b-c)).Конструктор множества задает значение множества списком элементов, заключенным в фигурныескобки. Элементы должны быть целыми в диапазоне 0..MAX(SET). Диапазон a..b обозначает всецелые числа в интервале [a, b].8.2.4 Отношения=#<<=>>=INISравноне равноменьшеменьшее или равнобольшебольше или равнопринадлежность множествупроверка типаОтношения дают результат типа BOOLEAN.
Отношения =, #, <, <=, >, и >= применимы кчисловым типам, типу CHAR, строкам и символьным массивам, содержащим в конце 0X.Отношения = и # кроме того применимы к типам BOOLEAN и SET, а также к указателям ипроцедурным типам (включая значение NIL). x IN s означает "x является элементом s".
x долженбыть целого типа, а s - типа SET. v IS T означает "динамический тип v есть T (или расширение T)" иназывается проверкой типа. Проверка типа применима, если1. v - параметр-переменная типа запись, или v - указатель, и если2. T - расширение статического типа vПримеры выражений (со ссылками на примеры из Гл. 7):1991i DIV 3~p OR q(i+j) * (i-j)s - {8, 9, 13}i+xINTEGERINTEGERBOOLEANINTEGERSETREAL12a[i+j] * a[i-j](0<=i) & (i<100)t.key = 0k IN {i..j-1}w[i].name <= "John"t IS CenterTreeREALBOOLEANBOOLEANBOOLEANBOOLEANBOOLEANОператоры обозначают действия. Есть простые и структурные операторы. Простые операторы несодержат в себе никаких частей, которые являются самостоятельными операторами.
Простыеоператоры - присваивание, вызов процедуры, операторы возврата и выхода. Структурныеоператоры состоят из частей, которые являются самостоятельными операторами. Онииспользуются, чтобы выразить последовательное и условное, выборочное и повторное исполнение.Оператор также может быть пустым, в этом случае он не обозначает никакого действия. Пустойоператор добавлен, чтобы упростить правила пунктуации в последовательности операторов.Оператор =[Присваивание | ВызовПроцедуры| ОператорIf | ОператорCase | ОператорWhile | ОператорRepeat| ОператорFor | ОператорLoop | ОператорWith| EXIT | RETURN [Выражение]].9.1 ПрисваиванияПрисваивание заменяет текущее значение переменной новым значением, определяемымвыражением.
Выражение должно быть совместимо по присваиванию с переменной (см.Приложение. A). Знаком операции присваивания является ":=", который читается "присвоить".Присваивание = Обозначение ":=" Выражение.Если выражение e типа Te присваивается переменной v типа Tv, имеет место следующее:1. Если Tv и Te - записи, то в присваивании участвуют только те поля Te, которые такжеимеются в Тv (проецирование); динамический тип v и статический тип v должны бытьодинаковы, и не изменяются присваиванием;2. Если Tv и Te - типы указатель, динамическим типом v становится динамический тип e;3. Если Тv это ARRAY n OF CHAR, а e - строка длины m < n, v[i] присваиваются значения eiдля i = 0 ..
m-1, а v[m] получает значение 0X.Примеры присваиваний (со ссылками на примеры из Гл. 7):i := 0p := i = jx := i + 1k := log2(i+j)F := log2s := {2, 3, 5, 7, 11, 13}a[i] := (x+y) * (x-y)t.key := iw[i+1].name := "John"t := c9.2 Вызовы процедур(* см. 10.1 *)13Вызов процедуры активирует процедуру. Он может содержать список фактических параметров,которые заменяют соответствующие формальные параметры, определенные в объявлениипроцедуры (см. Гл.
10). Соответствие устанавливается в порядке следования параметров в спискахфактических и формальных параметров. Имеются два вида параметров: параметры-переменные ипараметры-значения.Если формальный параметр - параметр-переменная, соответствующий фактический параметрдолжен быть обозначением переменной. Если фактический параметр обозначает элементструктурной переменной, селекторы компонент вычисляются, когда происходит заменаформальных параметров фактическими, то есть перед выполнением процедуры. Если формальныйпараметр - параметр-значение, соответствующий фактический параметр должен быть выражением.Это выражение вычисляется перед вызовом процедуры, а полученное в результате значениеприсваивается формальному параметру (см. также 10.1).ВызовПроцедуры = Обозначение [ФактическиеПараметры].Примеры:WriteInt(i*2+1)INC(w[k].count)t.Insert("John")(* см.
10.1 *)(* см. 11 *)9.3 Последовательность операторовПоследовательность операторов, разделенных точкой с запятой, означает поочередное выполнениедействий, заданных составляющими операторами.ПоследовательностьОператоров = Оператор {";" Оператор}.9.4 Операторы IfОператорIf =IF Выражение THEN ПоследовательностьОператоров{ELSIF Выражение THEN ПоследовательностьОператоров}[ELSE ПоследовательностьОператоров]END.Операторы if задают условное выполнение входящих в них последовательностей операторов.Логическое выражение, предшествующие последовательности операторов, будем называтьусловием (в оригинале - guard.
Прим. перев.) Условия проверяются последовательно одно задругим, пока очередное не окажется равным TRUE, после чего выполняется связанная с этимусловием последовательность операторов. Если ни одно условие не удовлетворено, выполняетсяпоследовательность операторов, записанная после слова ELSE, если оно имеется.Пример:IF (ch >= "A") & (ch <= "Z") THEN ReadIdentifierELSIF (ch >= "0") & (ch <= "9") THEN ReadNumberELSIF (ch = " ' ") OR (ch = ' " ') THEN ReadStringELSE SpecialCharacterEND9.5 Операторы CaseОператоры case определяют выбор и выполнение последовательности операторов по значениювыражения. Сначала вычисляется выбирающее выражение, а затем выполняется та14последовательность операторов, чей список меток варианта содержит полученное значение.Выбирающее выражение должно быть такого целого типа, который поглощает типы всех метоквариантов, или и выбирающее выражение и метки вариантов должны иметь тип CHAR.
Меткиварианта - константы, и ни одно из их значений не должно употребляться больше одного раза.Если значение выражения не совпадает с меткой ни одного из вариантов, выбираетсяпоследовательность операторов после слова ELSE, если оно есть, иначе программа прерывается.ОператорCase=CASE Выражение OF Вариант {" | " Вариант} [ELSEПоследовательностьОператоров ] END.Вариант=[СписокМетокВарианта ":" ПоследовательностьОператоров].СписокМетокВарианта =МеткиВарианта {"," МеткиВарианта }.МеткиВарианта=КонстантноеВыражение [".." КонстантноеВыражение].Пример:CASE ch OF"A" ..
"Z": ReadIdentifier| "0" .. "9": ReadNumber| "'", '"' : ReadStringELSE SpecialCharacterEND9.6 Операторы WhileОператоры while задают повторное выполнение последовательности операторов, пока логическоевыражение (условие) остается равным TRUE. Условие проверяется перед каждым выполнениемпоследовательности операторов.ОператорWhile = WHILE Выражение DO ПоследовательностьОператоров END.Примеры:WHILE i > 0 DO i := i DIV 2; k := k + 1 ENDWHILE (t # NIL) & (t.key # i) DO t := t.left END9.7 Операторы RepeatОператор repeat определяет повторное выполнение последовательности операторов пока условие,заданное логическим выражением, не удовлетворено. Последовательность оператороввыполняется по крайней мере один раз.ОператорRepeat = REPEAT ПоследовательностьОператоров UNTIL Выражение.9.8 Операторы ForОператор for определяет повторное выполнение последовательности операторов фиксированноечисло раз для прогрессии значений целочисленной переменной, называемой управляющейпеременной оператора for.ОператорFor=FOR идент ":=" Выражение TO Выражение [BY КонстантноеВыражение] DOПоследовательностьОператоров END.ОператорFOR v := beg TO end BY step DO statements END15эквивалентенtemp := end; v := beg;IF step > 0 THENWHILE v <= temp DO statements; v := v + step ENDELSEWHILE v >= temp DO statements; v := v + step ENDENDtemp и v имеют одинаковый тип.