Browse Source

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

SVI 2 years ago
parent
commit
57c4f8ba4d
1 changed files with 104 additions and 66 deletions
  1. 104 66
      README.md

+ 104 - 66
README.md

@@ -21,24 +21,25 @@
     - [6.1 Встроенные линейные типы](#61-встроенные-линейные-типы)
     - [6.2 Встроенные векторные типы](#62-встроенные-векторные-типы)
     - [6.3 Структура](#63-структура)
-  - [6.4 Тип функции](#64-тип-функции)
-  - [7. Объявление объектов](#7-объявление-объектов)
-  - [8. Выражения](#8-выражения)
+    - [6.4 Абстрактные т=структуры](#64-абстрактные-тструктуры)
+  - [7 Тип функции](#7-тип-функции)
+  - [8. Объявление объектов](#8-объявление-объектов)
+  - [9. Выражения](#9-выражения)
     - [8.1 Операнды](#81-операнды)
     - [8.2 Операторы](#82-операторы)
       - [8.2.1 Логические операции](#821-логические-операции)
       - [8.2.2 Арифметические операторы](#822-арифметические-операторы)
       - [8.2.3 Отношения](#823-отношения)
-  - [9. Предписания](#9-предписания)
+  - [10. Предписания](#10-предписания)
     - [9.1 Предписание ПРИСВОЕНИЕ](#91-предписание-присвоение)
     - [9.3 Последовательность предписаний](#93-последовательность-предписаний)
     - [9.4 Предписание\_ЕСЛИ](#94-предписание_если)
     - [9.5 Предписание\_ВЫБОР](#95-предписание_выбор)
     - [9.7 Предписание цикл](#97-предписание-цикл)
-  - [10.  Объявление функций](#10--объявление-функций)
+  - [11.  Объявление функций](#11--объявление-функций)
     - [10.1 Формальные параметры](#101-формальные-параметры)
     - [10.2. Встроенные функции](#102-встроенные-функции)
-  - [11.  Модули](#11--модули)
+  - [12.  Модули](#12--модули)
     - [11.1 Модуль СИСТЕМА](#111-модуль-система)
   - [Приложение 1: Синтаксис Оберона](#приложение-1-синтаксис-оберона)
   - [Приложение 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. Объявления имён и область видимости
 
@@ -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 есть УзелСредний  (`бул`)
 ```
 
-## 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
 ```
 
-## 11.  Модули
+## 12.  Модули
 
 Модуль представляет собой набор объявлений констант, типов, переменных и функций, списков предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.