Explorar el Código

SVI Исправления

SVI hace 2 años
padre
commit
be7adf688b
Se han modificado 1 ficheros con 112 adiciones y 79 borrados
  1. 112 79
      README.md

+ 112 - 79
README.md

@@ -1,6 +1,6 @@
-# Oberon-Deft
+# Оберон-У
 
-Сообщение о языке **Oberon-Deft**
+Сообщение о языке **Оберон-У** (*Оберон-Умелый, Oberon-Deft*)
 
 Язык является модификацией языка **Oberon-7**
 
@@ -11,7 +11,7 @@
 
 ## Оглавление
 
-- [Oberon-Deft](#oberon-deft)
+- [Оберон-У](#оберон-у)
 	- [Оглавление](#оглавление)
 	- [0. Введение](#0-введение)
 	- [1. Синтаксис](#1-синтаксис)
@@ -32,6 +32,12 @@
 		- [8.2.1 Логические операции](#821-логические-операции)
 		- [8.2.2 Арифметические операторы](#822-арифметические-операторы)
 		- [8.2.3 Отношения](#823-отношения)
+	- [9. Предписания](#9-предписания)
+		- [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
+	- [9.2 Предписание ВЫЗОВ\_ФУНКЦИИ](#92-предписание-вызов_функции)
+	- [9.3 Последовательность предписаний](#93-последовательность-предписаний)
+	- [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
+	- [9.5 Предписание ВЫБОР](#95-предписание-выбор)
 	- [Ссылки](#ссылки)
 
 ## 0. Введение
@@ -297,7 +303,7 @@ flowchart TD
 
 Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы. Примеры объявлений констант:
 
-```bash
+```c
 КОНСТ число = 100;
 КОНСТ лимит = 2*число - 1;
 КОНСТ словаВсе = [0 .. словаРазмер -1];
@@ -325,7 +331,7 @@ flowchart TD
 
 Примеры:
 
-```bash
+```c
 ТИП Таблица = МАССИВ[255]ВЕЩ;
 ТИП Дерево = Узел;
 ТИП Узел {
@@ -375,7 +381,7 @@ flowchart TD
 
 Примеры типов массивов:
 
-```bash
+```c
 ЗНАЧ listUser=МАССИВ[NN]ЦЕЛОЕ;
 ЗНАЧ moments=МАССИВ[10, 20]ВЕЩ;
 ```
@@ -406,7 +412,7 @@ flowchart TD
 
 **Определение**. Тип T расширяет тип T0, если он является T0, или если он непосредственно расширяет расширение T0. И наоборот, тип T0 является базовым типом для типа T, если он является T, или если он является прямым базовым типом базового типа T. Примеры типов структур:
 
-```bash
+```c
 ТИП Year СТРУКТ{
     день, месяц, год: ЦЕЛОЕ,
 }
@@ -419,7 +425,7 @@ flowchart TD
 
 ### 6.4 Структуры и ссылки
 
-Типы структур с точки *всегда* связываются по ссылке.
+Типы структур *всегда* связываются по ссылке.
 
 ```bash
 ТИП ТипСсылка = тип;
@@ -441,7 +447,7 @@ flowchart TD
 
 Переменные, имена которых отображаются через запятую имеют один и тот же тип. Примеры объявления переменных (см. Примеры в главе 6):
 
-```modula
+```c
 ЗНАЧ i, j, k: ЦЕЛОЕ;
 ЗНАЧ x, y: ВЕЩ;
 ЗНАЧ p, q: БУЛ;
@@ -481,7 +487,7 @@ flowchart TD
 
 Примеры обозначений (см. Примеры в главе 7):
 
-```bash
+```c
 i              (ЦЕЛОЕ)
 а[I]           (ВЕЩ)
 w[3].ch        (БАЙТ)
@@ -546,6 +552,7 @@ t(УзелСредний).подузел(Дерево)
 | МОД    | целое модуль  от деления |
 
 Операторы `+`, `-`, `*` и `/` применяются к операндам числовых типов. Оба операнда *должны быть одного типа*, что также определяет тип результата. При использовании в качестве унарных операторов:
+
 - `-` обозначает инверсию знака;
 - `+` обозначает оператор идентичности.
 
@@ -573,79 +580,105 @@ t(УзелСредний).подузел(Дерево)
 - `T` расширение объявленной структуры `T0` для `v`;
 - `v` параметр, как переменная заданного типа структуры.
 
-Предполагая, например, что `T` является расширением `T0` и что `v` является ссылкой на структуру `T0`, тогда проверка `v ЕСТЬ T` определяет, является ли фактически указанная переменная (в том числе, а не только `T0`) cтруктурой типа `T`. Значение `ПУСТО ЕСТЬ Т` возвращает отрицательный результат.
+Предполагая, например, что сслыка на тип структуры `T` является расширением базовой ссылки на  тип структуры `T0`, тогда проверка `v ЕСТЬ T` определяет, является ли фактически указанная переменная (в том числе, а не только `T0`) cтруктурой типа `T`. Значение `ПУСТО ЕСТЬ Т` возвращает отрицательный результат.
 Примеры выражений (см. Примеры в главе 7):
-	1987				(`ЦЕЛОЕ`)
-	I DIV 3			(`ЦЕЛОЕ`)
-	~ P OR q			(BOOLEAN)
-	(I + j) * (i-j)		(`ЦЕЛОЕ`)
-	S - {8, 9, 13}		(SET)
-	A [i + j] * a [i-j]	(ВЕЩ)
-	(0 <= i) & (i <100)	(BOOLEAN)
-	T.ключ = 0			(BOOLEAN)
-	K IN {i .. j-1}		(BOOLEAN)
-	T IS УзелСредний		(BOOLEAN)
-
-1. Предписания
-Предписания обозначают действия. Есть простые и сложные предписания. Простые предписания не состоят из каких-либо частей, которые сами являлись бы предписаниями. Простые предписания -- просто присваивания, либо вызов процедур. Сложные предписания состоят из частей, которые сами являются предписаниями. Они используются, чтобы выразить последовательное и условное, выборочное и повторное действие. Предписания также могут быть пустыми, и в этом случае они не обозначают никаких действий. Пустое предписание включено в язык для того, чтобы ослабить правила пунктуации в последовательностях предписаний.
-
-	Предписание = [Присвоение | ВызовПроцедур | Предписание_IF | Предписание_CASE | Предписание_WHILE | Предписание_REPEAT | Предписание_FOR].
-
-9.1 Предписание ПРИСВОЕНИЕ
-Элементарное предписание ПРИСВОЕНИЕ служит для замены текущего значения переменной на новое значение, заданное выражением. Предписание ПРИСВОЕНИЕ записывается как «:=» и произносится как «присвоить».
-	присвоение = переменная ":=" выражение.
-
-Если значение параметра обладает структурой (массив или тип записи), параметру не разрешено присваивать его или его элементам. Импортируемые переменные также не могут быть присвоены.
+
+```c
+1987                (`ЦЕЛОЕ`)
+I ДИВ 3             (`ЦЕЛОЕ`)
+~ P ИЛИ q           (`БУЛ`)
+(I + j) * (i-j)     (`ЦЕЛОЕ`)
+A [i + j] * a [i-j] (`ВЕЩ`)
+(0 <= i) & (i <100) (`БУЛ`)
+T.ключ = 0          (`БУЛ`)
+K == i              (`БУЛ`)
+T ЕСТЬ УзелСредний  (`БУЛ`)
+```
+
+## 9. Предписания
+
+Предписания обозначают *языковые действия*. Есть простые и сложные предписания. Простые предписания не состоят из каких-либо частей, которые сами являлись бы предписаниями. Простые предписания -- просто присваивания, либо вызов процедур.
+
+Сложные предписания состоят из частей, которые сами являются предписаниями. Они используются, чтобы выразить последовательное и условное, выборочное и повторное действие. Предписания также могут быть пустыми, и в этом случае они не обозначают никаких действий. Пустое предписание включено в язык для того, чтобы ослабить правила пунктуации в последовательностях предписаний.
+
+> Предписание = [Присвоение | ВызовПроцедур | Предписание_ЕСЛИ | Предписание_ВЫБОР | Предписание_ПОКА | Предписание_ПОВТОРЯТЬ | Предписание_ДЛЯ].
+
+### 9.1 Предписание ПРИСВОЕНИЕ
+
+Элементарное предписание `ПРИСВОЕНИЕ` служит для замены текущего значения переменной на новое значение, заданное выражением. Предписание `ПРИСВОЕНИЕ` записывается как «=» и произносится как «присвоить».
+
+> присвоение = переменная "=" выражение.
+
+Если значение параметра обладает структурой (массив или структура), параметру не разрешено присваивать его или его элементам. Импортируемые переменные также не могут быть присвоены. Если переменная не помечена ключевым словом `МУТ` -- ей нельзя присваивать даже в модуле объявления (кроме случаев создания такой переменной).
+
 Тип выражения должен быть таким же, как у переменной. Имеют место следующие исключения:
-	1. Константу NIL можно присвоить переменным любого типа ссылки или процедуры.
-	2. Строки могут быть назначены любому массиву литер, если количество литер в строке меньше, чем количество литер в массиве. (Добавляется литера с кодом ноль). Однолитерные строки также могут быть присвоены переменным типа CHAR.
-	3. В случае записей тип источника должен быть расширением типа адресата.
-	4. Открытый массив может быть назначен массиву равного базового типа.
+
+- константу `ПУСТО` можно присвоить переменным любого типа;
+- литеральные строки могут быть назначены любому массиву байтов, если количество литер в литеральной строке меньше, чем количество байтов в массиве. (Добавляется литера с кодом ноль). Однолитерные строки также могут быть присвоены переменным типа `БАЙТ`;
+- в случае структур тип источника должен быть типом структуры адресата (либо расширением этой структуры),
+- массив может быть назначен другому массиву равного типа.
 
 Примеры присвоений (см. Примеры в главе 7):
-	i := 0
-	p := i = j
-	x := FLT(i + 1)
-	k := (i + j) DIV 2
-	f := log2
-	s := {2, 3, 5, 7, 11, 13}
-	a[i] := (x+y) * (x-y)
-	t.key := i
-	w[i+1].ch := "A"
-
-9.2 Предписание ВЫЗОВ_ПРОЦЕДУРЫ
-Простое предписание ВЫЗОВ_ПРОЦЕДУРЫ служит для активации процедуры. Вызов процедуры может содержать список фактических параметров (аргументов), которые заменяются вместо соответствующих формальных параметров (параметров), заданных в объявлении процедуры (см. Главу 10). Соответствие устанавливается порядком параметров в списках аргументов и параметров соответственно. Существуют два вида параметров: переменные и значения.
-В случае параметров, как переменных -- аргумент должен быть ссылкой, обозначающим переменную. Если он указывает на элемент структурной переменной, селектор вычисляется, когда устанавливается аргумент, то есть перед выполнением процедуры. Если параметр является значением, соответствующий аргумент должен быть выражением. Это выражение вычисляется до активации процедуры, и результирующее значение присваивается аргументу, который теперь представляет собой локальную переменную (см. Также 10.1.).
-	Вызов_Процедуры = Переменная [Актуальные_Параметры].
-
-Примеры вызова процедур:
-	Целое_Читать(i)		(см. Главу 10)
-	Целое_Записать(2*j + 1, 6)
-	INC(w[k].count)
-9.3 Последовательность предписаний
+
+```c
+i = 0
+p = i = j
+x = FLT(i + 1)
+k = (i + j) ДИВ 2
+f = log2
+s = [2, 3, 5, 7, 11, 13]
+a[i] = (x+y) * (x-y)
+t.key = i
+w[i+1].ch = "A"
+```
+
+## 9.2 Предписание ВЫЗОВ_ФУНКЦИИ
+
+Простое предписание ВЫЗОВ_ФУНКЦИИ служит для исполнения функции. Функция может содержать список фактических параметров (аргументов), которые заменяются вместо соответствующих формальных параметров (параметров), заданных в объявлении функции (см. Главу 10). Соответствие устанавливается порядком параметров в списках аргументов и параметров соответственно.
+
+Параметр ссылается на элемент структурной переменной в любой момент выполнением процедуры. Если переменная является выражением, то выражение вычисляется до вызова функции, и результирующее значение присваивается аргументу, который теперь представляет собой локальную переменную относительно вызываемой функции(см. Также 10.1.).
+
+> ВЫЗОВ_ФУНКЦИИ = Переменная [Актуальные_Параметры].
+
+Примеры вызова фнкций:
+
+```с
+Целое_Читать(i)            // (см. Главу 10)
+Целое_Записать(2*j + 1, 6)
+w[k].count++
+```
+
+## 9.3 Последовательность предписаний
+
 Последовательности предписаний обозначают последовательность действий, заданную частями операторов, разделенными точкой с запятой.
-	Последовательность_Предписаний = Предписание{";" Предписание}.
-
-9.4 Предписание IF
-	Предписание_IF = IF Выражение THEN
-		Последовательность_Предписаний
-	{ELSIF Выражение THEN
-		Последовательность_Предписаний}
-	[ELSE
-		Последовательность_Предписаний]
-	END.
-
-Составное предписание IF определяет условное выполнение охраняемых подчинённых предписаний. Логическое выражение, предшествующее предписанию называется охрана. Охрана вычисляет выражение в порядке встречи, пока выражение имеет значение TRUE, после чего выполняется связанная с охраной последовательность предписаний. Если охраны не выполнена, то выполняется последовательность предписаний после символа ELSE, если такая ветка существует. Пример:
-	IF (литера >= "A") & (литера <= "Z") THEN
-		Сущность_Читать
-	ELSIF (литера >= "0") & (литера <= "9") THEN
-		Число_Читать
-	ELSIF литера = 22X THEN
-		Строку_Читать
-	END
-
-9.5 Предписание CASE
-Составное предписание CASE определяет выбор и выполнение последовательности предписаний в соответствии со значением выражения. Сначала вычисляется выражение CASE, затем выполняется последовательность предписаний, чей список меток содержит полученное значение. Если выражение CASE имеет тип `ЦЕЛОЕ` или CHAR, все метки должны быть целыми или однолитерными строками, соответственно.
+
+> Последовательность_Предписаний = Предписание{";" Предписание}.
+
+## 9.4 Предписание_ЕСЛИ
+
+```bash
+Предписание_ЕСЛИ = ЕСЛИ Выражение ТОГДА{
+    Последовательность_Предписаний;
+}АЕСЛИ  Выражение ТОГДА{
+    Последовательность_Предписаний;
+};
+```
+
+Составное предписание `ЕСЛИ` определяет условное выполнение охраняемых подчинённых предписаний. Логическое выражение, предшествующее предписанию называется охрана. Охрана вычисляет выражение в порядке встречи, пока выражение имеет значение `ДА`, после чего выполняется связанная с охраной последовательность предписаний. Если охраны не выполнена, то выполняется последовательность предписаний после символа `АЕСЛИ`, если такая ветка существует. Пример:
+
+```c
+ЕСЛИ (литера >= "A") И (литера <= "Z") ТОГДА{
+    Сущность_Читать();
+}АЕСЛИ (литера >= "0") И (литера <= "9") ТОГДА{
+    Число_Читать();
+}АЕСЛИ литера = 22X ТОГДА{
+    Строку_Читать();
+};
+```
+
+## 9.5 Предписание ВЫБОР
+
+Составное предписание `ВЫБОР` определяет выбор и выполнение последовательности предписаний в соответствии со значением выражения. Сначала вычисляется выражение `ВЫБОР`, затем выполняется последовательность предписаний, чей список меток содержит полученное значение. Если выражение CASE имеет тип `ЦЕЛОЕ` или CHAR, все метки должны быть целыми или однолитерными строками, соответственно.
 Предписание_CASE= CASE выражение OF выбор{"|" выбор} END.
 выбор = [СписокМеток_CASE ":" ПоследовательностьПредписаний].
 СписокМеток_CASE = МеткиДляВыбора{"," МеткиДляВыбора}.
@@ -747,7 +780,7 @@ END
 
 Типы v, beg и end должны быть `ЦЕЛОЕ`, а inc должен быть целым (константное выражение). Если шаг не указан, предполагается, что он равен 1.
 
-10. Объявление процедур
+1.  Объявление процедур
 Объявление процедуры состоит из заголовка процедуры и тела процедуры. Заголовок определяет имя процедуры, формальные параметры и тип результата (если таковой есть). Тело содержит объявления и предписания. Имя процедуры повторяется в конце объявления процедуры.
 Существует два типа процедур, а именно процедуры и процедуры-функции. Последние активируются именем процедуры как частью выражения и возвращают результат, являющийся операндом в вызывающем выражении. Процедуры активируются вызовом процедуры. Процедура-функция отличается в объявлении путём указания типа её результата после списка параметров. Её тело должно заканчиваться ключевым словом RETURN, которое определяет результат процедуры-функции.
 Все константы, переменные, типы и процедуры, объявленные в теле процедуры, являются локальными для этой процедуры. Значения локальных переменных не определены при входе в процедуру. Поскольку процедуры могут быть объявлены как локальные объекты, объявления процедур могут быть вложенными.