Х. Мёссенбёк, Н. Вирт - Язык программирования Оберон-2, страница 5
Описание файла
PDF-файл из архива "Х. Мёссенбёк, Н. Вирт - Язык программирования Оберон-2", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
xnCOPY разрешает присваивание строки или символьного массива, содержащего ограничитель 0X,другому символьному массиву. В случае необходимости, присвоенное значение усекается додлины получателя минус один. Получатель всегда будет содержать 0X как ограничитель. В20ASSERT(x, n) и HALT(n), интерпретация n зависит от реализации основной системы.Модуль - совокупность объявлений констант, типов, переменных и процедур вместе споследовательностью операторов, предназначенных для присваивания начальных значенийпеременным. Модуль представляет собой текст, который является единицей компиляции.Модуль=MODULE идент ";" [СписокИмпорта] ПоследовательностьОбъявлений[BEGIN ПоследовательностьОператоров] END идент ".".СписокИмпорта =IMPORT Импорт {"," Импорт} ";".Импорт=[идент ":="] идент.Список импорта определяет имена импортируемых модулей.
Если модуль A импортируетсямодулем M, и A экспортирует идентификатор x, то x упоминается внутри M как A.x. Если Aимпортируется как B:=A, объект x должен вызываться как B.x. Это позволяет использоватькороткие имена-псевдонимы в уточненных идентификаторах. Модуль не должен импортироватьсебя. Идентификаторы, которые экспортируются (то есть должны быть видимы в модуляхимпортерах) нужно отметить экспортной меткой в их объявлении (см. Главу 4).Последовательность операторов после символа BEGIN выполняется, когда модуль добавляетсяк системе (загружается).
Это происходит после загрузки импортируемых модулей. Отсюдаследует, тот циклический импорт модулей запрещен. Отдельные (не имеющие параметров иэкспортированные) процедуры могут быть активированы из системы. Эти процедуры служаткомандами (см. Приложение D1).MODULE Trees; (* экспорт: Tree, Node, Insert, Search, Write, Init *)IMPORT Texts, Oberon; (* экспорт только для чтения: Node.name *)TYPETree* = POINTER TO Node;Node* = RECORDname-: POINTER TO ARRAY OF CHAR;left, right: TreeEND;VAR w: Texts.Writer;PROCEDURE (t: Tree) Insert* (name: ARRAY OF CHAR);VAR p, father: Tree;BEGIN p := t;REPEAT father := p;IF name = p.name^ THEN RETURN END;IF name < p.name^ THEN p := p.left ELSE p := p.right ENDUNTIL p = NIL;NEW(p); p.left := NIL; p.right := NIL; NEW(p.name, LEN(name)+1); COPY(name,p.name^);IF name < father.name^ THEN father.left := p ELSE father.right := p ENDEND Insert;PROCEDURE (t: Tree) Search* (name: ARRAY OF CHAR): Tree;VAR p: Tree;BEGIN p := t;WHILE (p # NIL) & (name # p.name^) DOIF name < p.name^ THEN p := p.left ELSE p := p.right ENDEND;21RETURN pEND Search;PROCEDURE (t: Tree) Write*;BEGINIF t.left # NIL THEN t.left.Write END;Texts.WriteString(w, t.name^); Texts.WriteLn(w); Texts.Append(Oberon.Log, w.buf);IF t.right # NIL THEN t.right.Write ENDEND Write;PROCEDURE Init* (t: Tree);BEGIN NEW(t.name, 1); t.name[0] := 0X; t.left := NIL; t.right := NILEND Init;BEGIN Texts.OpenWriter(w)END Trees.Целые типыВещественные типыЧисловые типыSHORTINT, INTEGER, LONGINTREAL, LONGREALЦелые типы, вещественные типыОдинаковые типыДве переменные a и b с типами Ta и Tb имеют одинаковый тип, если1.
Ta и Tb оба обозначены одним и тем же идентификатором типа, или2. Ta объявлен равным Tb в объявлении типа вида Ta = Tb, или3. a и b появляются в одном и том же списке идентификаторов переменных, полей записи илиобъявлении формальных параметров и не являются открытыми массивами.Равные типыДва типа Ta, и Tb равны, если1.
Ta и Tb - одинаковые типы, или2. Ta и Tb - типы открытый массив с равными типами элементов, или3. Ta и Tb - процедурные типы, чьи списки формальных параметров совпадают.Поглощение типовЧисловые типы поглощают (значения) меньших числовых типов согласно следующей иерархии:LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINTРасширение типов (базовый тип)В объявлении типа Tb = RECORD (Ta) ... END, Tb - непосредственное расширение Ta, а Ta непосредственный базовый тип Tb. Тип Tb есть расширение типа Ta (Ta есть базовый тип Tb) если1.
Ta и Tb - одинаковые типы, или2. Tb - непосредственное расширение типа, являющегося расширением TaЕсли Pa = POINTER TO Ta и Pb = POINTER TO Tb, то Pb есть расширение Pa (Pa есть базовый22тип Pb), если Tb есть расширение Ta.Совместимость по присваиваниюВыражение e типа Te совместимо по присваиванию с переменной v типа Tv, если выполнено одноиз следующих условий:1.2.3.4.5.6.7.Te и Tv - одинаковые типы;Te и Tv - числовые типы и Tv поглощает Te;Te и Tv - типы запись, Te есть расширение Tv, а v имеет динамический тип Tv;Te и Tv - типы указатель и Te - расширение Tv;Tv - тип указатель или процедурный тип, а e - NIL;Tv - ARRAY n OF CHAR, e - строковая константа из m символов и m < n;Tv - процедурный тип, а e - имя процедуры, чьи формальные параметры совпадают спараметрами Tv.Совместимость массивовФактический параметр a типа Ta является совместимым массивом для формального параметра fтипа Tf если1.
Tf и Ta - одинаковые типы или2. Tf - открытый массив, Ta - любой массив, а типы их элементов - совместимые массивы или3. f - параметр-значение типа ARRAY OF CHAR, а фактический параметр a - строка.Совместимость выраженийДля данной операции операнды являются совместимыми выражениями, если их типысоответствуют следующей таблице (в который указан также тип результата выражения).Символьные массивы, которые сравниваются, должны содержать в качестве ограничителя 0X. ТипT1 должен быть расширением типа T0:операцияпервый операндвторой операндтип результата+-*числовойчисловойнаименьший числовойтип, поглощающийоба операнда/числовойчисловойнаименьшийвещественный тип,поглощающий обаоперанда+-*/DIV MODSETцелыйSETцелыйOR & ~BOOLEANBOOLEANSETнаименьший целыйтип, поглощающийоба операндаBOOLEANчисловойCHARсимвольный массив, строкаBOOLEANSETNIL, тип указатель T0 или T1процедурный тип T, NILBOOLEANBOOLEANBOOLEANBOOLEANBOOLEANBOOLEANBOOLEAN= # < <= > >= числовойCHARсимвольный массив, строка=#BOOLEANSETNIL, тип указатель T0 или T1процедурный тип T, NIL23INцелыйSETBOOLEANISтип T0тип T1BOOLEANСовпадение списков формальных параметровДва списка формальных параметров совпадают если1.2.3.4.они имеют одинаковое количество параметров, иони имеют или одинаковый тип результата функции или не имеют никакого, ипараметры в соответствующих позициях имеют равные типы, ипараметры в соответствующих позициях - оба или параметры-значения или параметрыпеременные.Модуль=MODULE идент ";" [СписокИмпорта] ПослОбъявл [BEGINПослОператоров] END идент ".".СписокИмпорта=IMPORT [идент ":="] идент {"," [идент ":="] идент} ";".ПослОбъявл={ CONST {ОбъявлКонст ";" } | TYPE {ОбъявлТипа ";" }| VAR {ОбъявлПерем ";" }} {ОбъявлПроц ";" | ОпережающееОбъяв";"}.ОбъявлКонст=ИдентОпр "=" КонстВыраж.ОбъявлТипа=ИдентОпр "=" Тип.ОбъявлПерем=СписокИдент ":" Тип.ОбъявлПроц=PROCEDURE [Приемник] ИдентОпр [ФормальныеПарам]";" ПослОбъявл[BEGIN ПослОператоров] END идент.ОпережающееОбъяв =PROCEDURE "^" [Приемник] ИдентОпр [ФормальныеПарам].ФормальныеПарам ="(" [СекцияФП {";" СекцияФП}] ")" [":" УточнИдент].СекцияФП=[VAR] идент {"," идент} ":" Тип.Приемник="(" [VAR] идент ":" идент ")".Тип=УточнИдент | ARRAY [КонстВыраж {"," КонстВыраж}] OF Тип | RECORD["("УточнИдент")"] СписокПолей {";" СписокПолей} END | POINTER TOТип | PROCEDURE [ФормальныеПарам].СписокПолей=[СписокИдент ":" Тип].ПослОператоров=Оператор {";" Оператор}.Оператор=[ Обозначение ":=" Выраж| Обозначение ["(" [СписокВыраж] ")"]| IF Выраж THEN ПослОператоров {ELSIF Выраж THEN ПослОператоров}[ELSE ПослОператоров] END| CASE Выраж OF Вариант {"|" Вариант} [ELSE ПослОператоров] END| WHILE Выраж DO ПослОператоров END| REPEAT ПослОператоров UNTIL Выраж| FOR идент ":=" Выраж TO Выраж [BY КонстВыраж] DO ПослОператоровEND| LOOP ПослОператоров END| WITH Охрана DO ПослОператоров {"|" Охрана DO ПослОператоров}[ELSE ПослОператоров] END| EXIT| RETURN [Выраж] ].Вариант=[МеткиВарианта {"," МеткиВарианта} ":" ПослОператоров].МеткиВарианта=КонстВыраж [".." КонстВыраж].Охрана=УточнИдент ":" УточнИдент.КонстВыраж=Выраж.Выраж=ПростоеВыраж [Отношение ПростоеВыраж].24ПростоеВыражСлагаемоеМножитель=["+" | "-"] Слагаемое {ОперСлож Слагаемое}.=Множитель {ОперУмн Множитель}.=Обозначение ["(" [СписокВыраж] ")"] | число | символ | строка | NIL| Множество | "(" Выраж ")" | " ~ " Множитель.="{" [Элемент {"," Элемент}] "}".=Выраж [".." Выраж].="=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.="+" | "-" | OR.="*" | "/" | DIV | MOD | "&".=УточнИдент {"." идент | "[" СписокВыраж "]" | "^" | "(" УточнИдент ")"}.=Выраж {"," Выраж}.
СписокИдент = ИдентОпр {"," ИдентОпр}.=[идент "."] идент. ИдентОпр = идент [ "*" | "-" ].МножествоЭлементОтношениеОперСложОперУмнОбозначениеСписокВыражУточнИдентМодуль SYSTEM содержит некоторые типы и процедуры, которые необходимы для реализацииопераций низкого уровня, специфичных для данного компьютера и/или реализации. Онивключают, например, средства для доступа к устройствам, которые управляются компьютером, исредства, позволяющие обойти правила совместимости типов, наложенные определением языка.Настоятельно рекомендуется ограничить использование этих средств специфическими модулями(модулями низкого уровня).
Такие модули непременно являются непереносимыми, но легкораспознаются по идентификатору SYSTEM, появляющемуся в их списке импорта. Следующиеспецификации действительны для реализации Оберон-2 на компьютере Ceres.Модуль SYSTEM экспортирует тип BYTE со следующими характеристиками: переменным типаBYTE можно присваивать значения переменных типа CHAR или SHORTINT. Если формальныйпараметр-переменная имеет тип ARRAY OF BYTE, то соответствующий фактический параметрможет иметь любой тип.Другой тип, экспортируемый модулем SYSTEM, - тип PTR.
Переменным типа PTR могут бытьприсвоены значения переменных-указателей любого типа. Если формальный параметрпеременная имеет тип PTR, фактический параметр может быть указателем любого типа.Процедуры, содержащиеся в модуле SYSTEM, перечислены в таблицах. Большинство ихсоответствует одиночным командам и компилируются непосредственно в машинный код. Одеталях читатель может справиться в описании процессора. В таблице v обозначает переменную,x, y, a, и n - выражения, а T - тип.Процедуры-функцииНазваниеТипы аргументовТип результатаФункцияADR(v) любойBIT(a,n) a: LONGINT; n:целыйLONGINTBOOLEANадрес переменной vn-й бит Память[a]CC(n)целая константаLSH(x,n) x: целый, CHAR, BYTE; n:целыйROT(x,n) x: целый, CHAR, BYTE; n:целыйBOOLEANусловие n (0 <= n <= 15)совпадает с типом логический сдвигxсовпадает с типом циклический сдвигxVAL(T,x) T, x: любого типаTx интерпретируется как значениетипа TСобственно процедурыНазваниеТипы аргументовФункция25GET(a, v)a: LONGINT; v: любой основной тип, v := Память[a]указатель, процедурный типPUT(a, x)a: LONGINT; x: любой основной тип,указатель, процедурный типGETREG(n, v) n: целая константа; v: любойосновной тип, указатель,процедурный типPUTREG(n, x) n: целая константа; x: любойосновной тип, указатель,процедурный типMOVE(a0,a1,n) a0, a1: LONGINT; n: целыйПамять[a] := xNEW(v, n)размещает блок памяти размером n байт;присваивает его адрес переменной vv: любой указатель; n: целыйv := Регистр nРегистр n := xПамять[a1..a1+n-1] := Память[a0..a0+n-1]Программы на Обероне-2 обычно выполняются в среде, которая обеспечивает активацию команд,сбор мусора, динамическую загрузку модулей и определенные структуры данных временивыполнения.