Jelajahi Sumber

SVI Добавил абстрактные структуры

SVI 2 tahun lalu
induk
melakukan
57c4f8ba4d
1 mengubah file dengan 104 tambahan dan 66 penghapusan
  1. 104 66
      README.md

+ 104 - 66
README.md

@@ -21,24 +21,25 @@
     - [6.1 Встроенные линейные типы](#61-встроенные-линейные-типы)
     - [6.1 Встроенные линейные типы](#61-встроенные-линейные-типы)
     - [6.2 Встроенные векторные типы](#62-встроенные-векторные-типы)
     - [6.2 Встроенные векторные типы](#62-встроенные-векторные-типы)
     - [6.3 Структура](#63-структура)
     - [6.3 Структура](#63-структура)
-  - [6.4 Тип функции](#64-тип-функции)
-  - [7. Объявление объектов](#7-объявление-объектов)
-  - [8. Выражения](#8-выражения)
+    - [6.4 Абстрактные т=структуры](#64-абстрактные-тструктуры)
+  - [7 Тип функции](#7-тип-функции)
+  - [8. Объявление объектов](#8-объявление-объектов)
+  - [9. Выражения](#9-выражения)
     - [8.1 Операнды](#81-операнды)
     - [8.1 Операнды](#81-операнды)
     - [8.2 Операторы](#82-операторы)
     - [8.2 Операторы](#82-операторы)
       - [8.2.1 Логические операции](#821-логические-операции)
       - [8.2.1 Логические операции](#821-логические-операции)
       - [8.2.2 Арифметические операторы](#822-арифметические-операторы)
       - [8.2.2 Арифметические операторы](#822-арифметические-операторы)
       - [8.2.3 Отношения](#823-отношения)
       - [8.2.3 Отношения](#823-отношения)
-  - [9. Предписания](#9-предписания)
+  - [10. Предписания](#10-предписания)
     - [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
     - [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
     - [9.3 Последовательность предписаний](#93-последовательность-предписаний)
     - [9.3 Последовательность предписаний](#93-последовательность-предписаний)
     - [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
     - [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
     - [9.5 Предписание\_ВЫБОР](#95-предписание_выбор)
     - [9.5 Предписание\_ВЫБОР](#95-предписание_выбор)
     - [9.7 Предписание цикл](#97-предписание-цикл)
     - [9.7 Предписание цикл](#97-предписание-цикл)
-  - [10.  Объявление функций](#10--объявление-функций)
+  - [11.  Объявление функций](#11--объявление-функций)
     - [10.1 Формальные параметры](#101-формальные-параметры)
     - [10.1 Формальные параметры](#101-формальные-параметры)
     - [10.2. Встроенные функции](#102-встроенные-функции)
     - [10.2. Встроенные функции](#102-встроенные-функции)
-  - [11.  Модули](#11--модули)
+  - [12.  Модули](#12--модули)
     - [11.1 Модуль СИСТЕМА](#111-модуль-система)
     - [11.1 Модуль СИСТЕМА](#111-модуль-система)
   - [Приложение 1: Синтаксис Оберона](#приложение-1-синтаксис-оберона)
   - [Приложение 1: Синтаксис Оберона](#приложение-1-синтаксис-оберона)
   - [Приложение 2: Участники](#приложение-2-участники)
   - [Приложение 2: Участники](#приложение-2-участники)
@@ -216,60 +217,61 @@ flowchart TD
 
 
 Ниже перечислен полный список `ключевых символов`
 Ниже перечислен полный список `ключевых символов`
 
 
-| Символ  | Комментарий                                          |
-| ------- | ---------------------------------------------------- |
-| +       | Сложение                                             |
-| -       | Минус                                                |
-| *       | Умножение                                            |
-| /       | Деление                                              |
-| =       | Присвоение                                           |
-| <       | Меньше                                               |
-| <=      | Меньше или равно                                     |
-| >       | Больше                                               |
-| >=      | Больше или равно                                     |
-| //      | Линейный комментарий                                 |
-| /*      | Начало многострочного комментария                    |
-| */      | Конец многострочного комментария                     |
-| .       | Точка                                                |
-| ,       | Запятая                                              |
-| ;       | Разделитель выражений                                |
-| ..      | Конструктор диапазона                                |
-| :       | Определить тип переменной                            |
-| (       | Открывающая круглая скобка (выражение)               |
-| )       | Закрывающая круглая скобка (выражение)               |
-| [       | Открывающая квадратная скобка (массив)               |
-| ]       | Закрывающая квадратная скобка (массив)               |
-| {       | Фигурная открывающая скобка (область видимости)      |
-| }       | Закрывающая фигурная скобка (область видимости)      |
-| модуль  | MODULE Объявление начала модуля                      |
-| импорт  | IMPORT Импорт модуля                                 |
-| конст   | CONST Объявление константы                           |
-| тип     | TYPE Объявление типа                                 |
-| бул     | BOOL Белвый тип                                      |
-| да      | TRUE Булево значение                                 |
-| нет     | FALSE Отрицание логического значения                 |
-| байт    | BYTE Тип байт                                        |
-| целое   | INT Дробное число                                    |
-| вещ     | REAL Дробное число                                   |
-| массив  | ARRAY Массив элементов                               |
-| структ  | STRUCT Объявление структуры                          |
-| симв    | VAR Объявление переменной                            |
-| мут     | MUT Признак изменяемости                             |
-| пуб     | PUB Признак экспорта                                 |
-| фн      | FN Объявление функции                                |
-| &       | & Создание объекта                                   |
-| есть    | IS Проверка типа                                     |
-| если    | IF Проверка условия                                  |
-| провер  | SWITCH Проверка на выбор                             |
-| ветка   | CASE ветка выбора                                    |
-| вернуть | RETURN Возврат из функции                            |
-| нич     | NIL Пустое состояние объекта                         |
-| цикл    | LOOP Безусловный цикл                                |
-| дальше  | NEXT Продолжить цикл с пропуском следующих выражений |
-| стоп    | BREAK Прервать цикл с пропуском следующих выражений  |
-| или     | OR Логическое или                                    |
-| и       | AND Логическое и                                     |
-| не      | NOT Логическая инверсия                              |
+| Символ   | Комментарий                                          |
+| -------- | ---------------------------------------------------- |
+| +        | Сложение                                             |
+| -        | Минус                                                |
+| *        | Умножение                                            |
+| /        | Деление                                              |
+| =        | Присвоение                                           |
+| <        | Меньше                                               |
+| <=       | Меньше или равно                                     |
+| >        | Больше                                               |
+| >=       | Больше или равно                                     |
+| //       | Линейный комментарий                                 |
+| /*       | Начало многострочного комментария                    |
+| */       | Конец многострочного комментария                     |
+| .        | Точка                                                |
+| ,        | Запятая                                              |
+| ;        | Разделитель выражений                                |
+| ..       | Конструктор диапазона                                |
+| :        | Определить тип переменной                            |
+| (        | Открывающая круглая скобка (выражение)               |
+| )        | Закрывающая круглая скобка (выражение)               |
+| [        | Открывающая квадратная скобка (массив)               |
+| ]        | Закрывающая квадратная скобка (массив)               |
+| {        | Фигурная открывающая скобка (область видимости)      |
+| }        | Закрывающая фигурная скобка (область видимости)      |
+| модуль   | MODULE Объявление начала модуля                      |
+| импорт   | IMPORT Импорт модуля                                 |
+| конст    | CONST Объявление константы                           |
+| тип      | TYPE Объявление типа                                 |
+| бул      | BOOL Белвый тип                                      |
+| да       | TRUE Булево значение                                 |
+| нет      | FALSE Отрицание логического значения                 |
+| байт     | BYTE Тип байт                                        |
+| целое    | INT Дробное число                                    |
+| вещ      | REAL Дробное число                                   |
+| массив   | ARRAY Массив элементов                               |
+| структ   | STRUCT Объявление структуры                          |
+| абстракт | ABSTRACT Объявление абстрактной структуры            |
+| симв     | VAR Объявление переменной                            |
+| мут      | MUT Признак изменяемости                             |
+| пуб      | PUB Признак экспорта                                 |
+| фн       | FN Объявление функции                                |
+| &        | & Создание объекта                                   |
+| есть     | IS Проверка типа                                     |
+| если     | IF Проверка условия                                  |
+| провер   | SWITCH Проверка на выбор                             |
+| ветка    | CASE ветка выбора                                    |
+| вернуть  | RETURN Возврат из функции                            |
+| нич      | NIL Пустое состояние объекта                         |
+| цикл     | LOOP Безусловный цикл                                |
+| дальше   | NEXT Продолжить цикл с пропуском следующих выражений |
+| стоп     | BREAK Прервать цикл с пропуском следующих выражений  |
+| или      | OR Логическое или                                    |
+| и        | AND Логическое и                                     |
+| не       | NOT Логическая инверсия                              |
 
 
 ## 4. Объявления имён и область видимости
 ## 4. Объявления имён и область видимости
 
 
@@ -455,7 +457,43 @@ UNPK
 }
 }
 ```
 ```
 
 
-## 6.4 Тип функции
+### 6.4 Абстрактные т=структуры
+
+Структуры могут быть объявлены с квалификатором `абстракт`. Подобные структуры могут обладать сигнатурами методов, но не полями или самими методами.
+
+Абстрактные структуры можно встраивать в структуры. Поскольку полей в них нет, производная структура также не содержит полей (но можно добавить), а методы абстрактной структуры в производной должны быть обязательно описаны. Если этого не сделать, то будет ошибка во время компиляции.
+
+Абстрактные структуры могут встраивать абстрактные структуры. Если есть две абстрактные структуры с одинаковым набором методов, но разным именем -- это разные структуры.
+
+Создать объект абстрактной структуры нельзя. Абстрактную структуру можно только реализовать.
+
+```bash
+СтруктураАбстракт = Имя + "=" СТРУКТ АБСТРАКТ {
+    СписокМетодов..?;
+}
+```
+
+Пример:
+
+```bash
+тип {
+    База = структ абстракт {
+        Открыть([]байт):ошибка;
+        Закрыть():ошибка;
+    }
+    БазаРасшир = структ абстракт (База) {
+        Строить():ошибка;
+        Шахта():уголь;
+    }
+}
+
+сущ {
+    базаА, базаБ = База;
+    базаВ = БазаРасшир;
+}
+```
+
+## 7 Тип функции
 
 
 Тип функции является объектом кода, поэтому функция является статической сущностью. Можно удалить объект ссылающийся на функцию, но нельзя удалить саму функцию.
 Тип функции является объектом кода, поэтому функция является статической сущностью. Можно удалить объект ссылающийся на функцию, но нельзя удалить саму функцию.
 
 
@@ -463,7 +501,7 @@ UNPK
 
 
 > ТипФункция = ФН (ФормальныеПараметры?)Результат?;
 > ТипФункция = ФН (ФормальныеПараметры?)Результат?;
 
 
-## 7. Объявление объектов
+## 8. Объявление объектов
 
 
 Объявления объектов служат для введения объектов и связывания их с именами, которые не должны повторяться в пределах данной области видимости. Они также служат для связывания встроенных линейных и векторных типов данных с имена объектов.
 Объявления объектов служат для введения объектов и связывания их с именами, которые не должны повторяться в пределах данной области видимости. Они также служат для связывания встроенных линейных и векторных типов данных с имена объектов.
 
 
@@ -492,7 +530,7 @@ UNPK
 }
 }
 ```
 ```
 
 
-## 8. Выражения
+## 9. Выражения
 
 
 `Выражения` - это конструкции, содержащие правила вычисления, в которых константы и текущие значения объектов объединяются для получения других значений посредством применения операторов и функций возвращающих результат.
 `Выражения` - это конструкции, содержащие правила вычисления, в которых константы и текущие значения объектов объединяются для получения других значений посредством применения операторов и функций возвращающих результат.
 
 
@@ -619,7 +657,7 @@ K == i              (`бул`)
 T есть УзелСредний  (`бул`)
 T есть УзелСредний  (`бул`)
 ```
 ```
 
 
-## 9. Предписания
+## 10. Предписания
 
 
 Предписания обозначают *языковые действия*. Простые предписания есть операторы. Простые предписания не состоят из каких-либо частей, которые сами являлись бы предписаниями.
 Предписания обозначают *языковые действия*. Простые предписания есть операторы. Простые предписания не состоят из каких-либо частей, которые сами являлись бы предписаниями.
 
 
@@ -751,7 +789,7 @@ w[i+1].ch = "A"
 }
 }
 ```
 ```
 
 
-## 10.  Объявление функций
+## 11.  Объявление функций
 
 
 Объявление функций состоит из заголовка функции и её тела. Заголовок определяет имя функции, формальные параметры и тип результата (если таковой есть). Тело содержит объявления и предписания.
 Объявление функций состоит из заголовка функции и её тела. Заголовок определяет имя функции, формальные параметры и тип результата (если таковой есть). Тело содержит объявления и предписания.
 
 
@@ -874,7 +912,7 @@ w[i+1].ch = "A"
 Округ(-1.5) = -2
 Округ(-1.5) = -2
 ```
 ```
 
 
-## 11.  Модули
+## 12.  Модули
 
 
 Модуль представляет собой набор объявлений констант, типов, переменных и функций, списков предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.
 Модуль представляет собой набор объявлений констант, типов, переменных и функций, списков предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.