浏览代码

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

SVI 2 年之前
父节点
当前提交
71f14460aa
共有 1 个文件被更改,包括 120 次插入63 次删除
  1. 120 63
      README.md

+ 120 - 63
README.md

@@ -18,6 +18,11 @@
   - [2. Синтез сущностей](#2-синтез-сущностей)
   - [3. Ключевые символы](#3-ключевые-символы)
   - [4. Объявления имён и область видимости](#4-объявления-имён-и-область-видимости)
+  - [5. Объявление констант](#5-объявление-констант)
+  - [6. Объявление типов](#6-объявление-типов)
+    - [6.1 Встроенные линейные типы](#61-встроенные-линейные-типы)
+    - [6.2 Встроенные векторные типы](#62-встроенные-векторные-типы)
+    - [6.3 Структура](#63-структура)
   - [Ссылки](#ссылки)
 
 ## 0. Введение
@@ -244,79 +249,131 @@ flowchart TD
 
 ## 4. Объявления имён и область видимости
 
-Каждое встречающееся в программе `имя` должно быть объявлено заранее, если это не `ключевой символ` (например, `число` или `разделитель`). Имя также служит для задания опредёленных постоянных свойств объекта, например, является ли оно константой, обозначением типа, переменной или процедурой.
-Имя используется для ссылки на соответствующий объект. Это возможно в тех частях программы, которые находятся в пределах области видимости. Имя не может обозначать больше чем один объект внутри данной области. Область видимости распространяется текстуально от точки объявления до конца блока (процедуры или модуля), к которому принадлежит имя и, следовательно -- по отношению к которому, объект является локальным.
-Имя, объявленное в блоке модуля, может сопровождаться меткой экспорта сразу после имени * , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом на чтение. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль. Имя символа предваряется другим именем (префиксом), обозначающим его модуль (см. Гл 11). Префикс и имя разделены точкой и вместе называются уточнённым именем (или квалифицированным именем).
-	ИмяКвал	= [имя "."] имя.
-	ИмяОпр	= имя ["*"].
-
-Следующие имена являются стандартными (группа ключевых слов); их значение определено в разделе 6.1 (типы) и 10.2 (процедуры):
-	ABS	ASR	ASSERT	BOOLEAN	BYTE
-	CHAR	CHR	DEC		EXCL		FLOOR
-	FLT	INC	INCL		INTEGER	LEN
-	LSL	NEW	ODD		ORD		PACK
-	REAL	ROR	SET		UNPK
-5. Объявление констант
-Объявление константы связывает её имя с её значением.
-	ОбъявлениеКонстанты	= ИмяОпр "=" КонстантноеВыражение.
-	КонстантноеВыражение	= Выражение.
-
-Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы (см. Гл. 8). Примеры объявлений констант:
-	число = 100
-	лимит = 2*N - 1
-	словаВсе = {0 .. словаРазмер -1}
-	имя = "Oberon"
-
-6. Объявление типов
-Тип данных определяет множество значений, которые переменные этого типа могут принимать и операторов, которые к ним применимы. Объявление типа используется для связывания имени с типом. Типы определяют структуру переменных этого типа и, косвенно, операторы, которые применимы к компонентам самих типов. Есть две разных вида типов, а именно массивы и записи, с различным способом выбора компонентов.
-
-ОбъявлениеТипа = ИмяОпр "=" Тип.
-	Тип = ИмяКвал | ТипМассив | ТипЗапись | ТипСсылка | ПроцедурныйТип.
+Каждое встречающееся в программе `имя` должно быть объявлено заранее, если это `ключевой символ` (например, `ТИП` или `ПЕРЕМ`). `Имя` также служит для задания опредёленных постоянных свойств сущности, например, является ли оно константой, определением типа, переменной или функцией.
+`Имя` используется для ссылки на соответствующую `сущность`. Это возможно в тех частях программы, которые находятся в пределах `области видимости`. `Имя` не может обозначать больше чем *одну* `сущность` внутри данной области. `Область видимости` распространяется текстуально от точки объявления до конца блока (функции или модуля), к которому принадлежит `имя` и, следовательно -- по отношению к которому, объект является локальным.
+
+`Имя`, объявленное в блоке модуля, может сопровождаться *меткой экспорта* сразу после имени `*` , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом *только на чтение*. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль.
+
+`Имя` символа предваряется другим именем (префиксом), показывающим его модуль (см. Гл 11). Префикс и имя разделены точкой и вместе называются `уточнённым именем` (или `квалифицированным именем`).
+
+> ИмяКвал = [имя "."] имя.
+> ИмяЭкспорт = имя ["*"].
+
+Следующие имена являются стандартными (группа `ключевые символы`); их значение определено ниже:
+
+> ASR
+> ASSERT
+> BOOL
+> BYTE
+> CHAR
+> EXCL
+> FLT
+> INTEGER
+> LSL
+> NEW
+> ODD
+> ORD
+> PACK
+> REAL
+> ROR
+> SET
+> UNPK
+
+## 5. Объявление констант
+
+Объявление константы связывает её `имя` с её значением.
+
+> КонстантноеВыражение = Выражение.
+> ОбъявлениеКонстанты  = ИмяОпр "=" КонстантноеВыражение.
+
+Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы. Примеры объявлений констант:
+
+```bash
+const число = 100;
+const лимит = 2*число - 1;
+const словаВсе = [0 .. словаРазмер -1];
+const имя = "Oberon";
+```
+
+## 6. Объявление типов
+
+`Тип данных `задаёт множество специфичных значений, которые переменные этого типа могут принимать, а также множетво операторов и методов, которые к ним применимы. Объявление типа используется для связывания имени с типом. Типы определяют структуру переменных этого типа и, косвенно, операторы, которые применимы к компонентам самих типов.
+
+Типы данных деляется на две группы:
+
+- встроенные типы;
+- пользовательские типы;
+
+В группе встроенных типов также есть деление на две части:
+
+- линейный типы;
+- векторные типы.
+
+В группе векторных типов есть два типа:
+
+- массив;
+- литеральная строка.
+
+После присвоения литеральная строка представлена массивом байтов.
+
+> ОбъявлениеТипа = ИмяОпр "=" Тип.
+> Тип = ИмяКвал | ТипМассив | ТипЗапись | ТипСсылка | ПроцедурныйТип.
 
 Примеры:
-	мТаблица = ARRAY 255 OF REAL
-	туДерево  = POINTER TO тУзел
-тУзел    = RECORD
-		ключ: INTEGER;
-		уЛевый, уПравый: туДерево
-	END
-туДеревоСередина = POINTER TO тУзелСередина
-тУзелСередина   = RECORD (тУзел)
-		мИмя: ARRAY 32 OF CHAR;
-		уПодузел: туДерево
-	END
-тпФункция = PROCEDURE (x: INTEGER): INTEGER
 
-6.1 Встроенные типы
-Следующие встроенные типы обозначаются заранее объявленными именами. Связанные операторы определены в 8.2, а встроенные функции - в 10.2. Значения заданного встроенного типа следующие:
-	BOOLEAN -- принимает значения TRUE и FALSE
-	CHAR -- литеры стандартного набора, размер зависит от реализации
-	INTEGER -- целые числа, размер зависит от реализации
-	REAL -- дробные числа, размер зависит от реализации
-	BYTE -- целые числа от 0 до 255, размер фиксированный в 8 бит
-	SET -- набор целых чисел между 0 и пределом, зависящим от реализации
+```bash
+type Таблица = ARRAY 255 OF REAL;
+type Дерево = LINK Узел;
+type Узел {
+    ключ: INTEGER,
+    Левый, уПравый: Дерево,
+}
+type ДеревоСередина = LINK TO тУзелСередина;
+type УзелСередина (тУзел){
+    Имя: ARRAY 32 OF BYTE,
+    Подузел: туДерево,
+}
+type Функция = FN (x: INTEGER): INTEGER;
+```
+
+### 6.1 Встроенные линейные типы
+
+Встроенные операторы и встроенные функции определены ниже. Имена встроенных типов следующие:
+
+Встроенные линейные типы:
+
+- `BOOL` -- принимает значения `TRUE` и `FALSE`
+- `INT` -- целые числа, размер зависит от реализации
+- `REAL` -- дробные числа, размер зависит от реализации
+- `BYTE` -- целые числа от 0 до 255, размер фиксированный в 8 бит
 
-Тип BYTE совместим с типом INTEGER, и наоборот.
+Тип `BYTE` совместим с типом `INT`, но наоборот требуется прведение.
+Тип `INT` совместим с типом `REAL`, но наоборот требуется прведение.
+В любом случае приведение *всегда* выполняется явно.
+
+### 6.2 Встроенные векторные типы
 
-6.2 Тип массив
 Массив - это структура, состоящая из фиксированного количества элементов, тип элементов одинаковый для всех элементов данного типа массива. Количество элементов массива называется его длиной. Элементы массива обозначаются индексами, которые являются целыми числами от 0 до (длины - 1).
-	ТипМассива	= ARRAY длина {"," длина} OF тип_элемента.
-	длина 	= КонстантноеВыражение.
+
+```bash
+var ТипМассива = ARRAY[длина {"," длина}]тип_элемента;
+var длина = КонстантноеВыражение;
+```
 
 Форма объявления
-	ARRAY N0, N1, ..., Nk OF T
 
-понимается как сокращение для объявления
-	ARRAY N0 OF
-		ARRAY N1 OF
-		...
-			ARRAY Nk OF T
+> ARRAY[N0, N1, ..., Nk]T
 
 Примеры типов массивов:
-	ARRAY NN OF INTEGER
-	ARRAY 10, 20 OF REAL
-6.3 Тип запись
-Тип записи - это структура, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа записи задаёт для каждого элемента, которое называется полем, его тип и имя, которое обозначает (ссылается на) это поле. Область действия этих имён полей - само определение записи, но они также видны как части экземпляра записи в форме "через точку" (см. 8.1), которая ссылается на элементы самого экземпляра записи.
+
+```bash
+var listUser=ARRAY[NN]INT;
+var moments=ARRAY[10, 20]REAL;
+```
+
+### 6.3 Структура
+
+Сущность структура, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа записи задаёт для каждого элемента, которое называется полем, его тип и имя, которое обозначает (ссылается на) это поле. Область действия этих имён полей - само определение записи, но они также видны как части экземпляра записи в форме "через точку" (см. 8.1), которая ссылается на элементы самого экземпляра записи.
 	ТипЗаписи = RECORD ["(" БазовыйТип")"] [СписокПолейТипа] END.
 	БазовыйТип = квалификатор.
 	СписокПолейТипа= СписокПолей{";" СписокПолей}.
@@ -343,7 +400,7 @@ flowchart TD
 Переменные процедурного типа T принимают процедуру (или NIL) в качестве значения. Если процедуре P присвоена переменная процедурного типа T, формальные параметры (типа) P должны быть такими же, как те, что указаны в формальных параметрах T. То же самое справедливо для типа результата в случае (См. 10.1). P не должен быть объявлен локальным для другой процедуры, и не может быть стандартной процедурой.
 	ПроцедурныйТип = PROCEDURE [ФормальныеПараметры].
 
-7. Объявление переменных
+1. Объявление переменных
 Объявления переменных служат для введения переменных и связывания их с именами, которые не должны повторяться в пределах данной области. Они также служат для связывания фиксированных типов данных с переменными.
 
 ОбъявлениеПеременной = СписокИмён":" тип.