|
|
@@ -23,6 +23,9 @@
|
|
|
- [6.1 Встроенные линейные типы](#61-встроенные-линейные-типы)
|
|
|
- [6.2 Встроенные векторные типы](#62-встроенные-векторные-типы)
|
|
|
- [6.3 Структура](#63-структура)
|
|
|
+ - [6.4 Структуры и ссылки](#64-структуры-и-ссылки)
|
|
|
+ - [6.5 Тип функции](#65-тип-функции)
|
|
|
+ - [7. Объявление переменных](#7-объявление-переменных)
|
|
|
- [Ссылки](#ссылки)
|
|
|
|
|
|
## 0. Введение
|
|
|
@@ -236,7 +239,6 @@ flowchart TD
|
|
|
| ПОКА | WHILE Условие проверки продолжения цикла на входе |
|
|
|
| ПОКА | UNTIL Условие продолжения цикла на выходе |
|
|
|
| ИЛИ | OR Логическое ИЛИ |
|
|
|
-| @ | Ссылка на объект |
|
|
|
| ФН | FN Объявление функции |
|
|
|
| СТРУКТ | STRUCT Объявление структуры |
|
|
|
| ПОВТОР | REPEAT Повторить выполнение |
|
|
|
@@ -315,7 +317,7 @@ const имя = "Oberon";
|
|
|
|
|
|
```bash
|
|
|
type Таблица = ARRAY[255]REAL;
|
|
|
-type Дерево = @Узел;
|
|
|
+type Дерево = Узел;
|
|
|
type Узел {
|
|
|
ключ: INT,
|
|
|
Левый, Правый: Дерево,
|
|
|
@@ -335,9 +337,9 @@ type Функция = FN (x: INT): INT;
|
|
|
Встроенные линейные типы:
|
|
|
|
|
|
- `BOOL` -- принимает значения `TRUE` и `FALSE`
|
|
|
+- `BYTE` -- целые числа от 0 до 255, размер фиксированный в 8 бит
|
|
|
- `INT` -- целые числа, размер зависит от реализации
|
|
|
- `REAL` -- дробные числа, размер зависит от реализации
|
|
|
-- `BYTE` -- целые числа от 0 до 255, размер фиксированный в 8 бит
|
|
|
|
|
|
Тип `BYTE` совместим с типом `INT`, но наоборот требуется прведение.
|
|
|
Тип `INT` совместим с типом `REAL`, но наоборот требуется прведение.
|
|
|
@@ -376,36 +378,57 @@ var moments=ARRAY[10, 20]REAL;
|
|
|
var strHello="Привет";
|
|
|
```
|
|
|
|
|
|
+Все встроенные векторные типы с точки зрения программиста *всегда* передаются по ссылке.
|
|
|
+
|
|
|
+С точки зрения реализации это может быть на усмотрение реализации.
|
|
|
+
|
|
|
### 6.3 Структура
|
|
|
|
|
|
-Сущность структура, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа записи задаёт для каждого элемента, которое называется полем, его тип и имя, которое обозначает (ссылается на) это поле. Область действия этих имён полей - само определение записи, но они также видны как части экземпляра записи в форме "через точку" (см. 8.1), которая ссылается на элементы самого экземпляра записи.
|
|
|
- ТипЗаписи = RECORD ["(" БазовыйТип")"] [СписокПолейТипа] END.
|
|
|
- БазовыйТип = квалификатор.
|
|
|
- СписокПолейТипа= СписокПолей{";" СписокПолей}.
|
|
|
- СписокПолей = СписокИмён":" тип.
|
|
|
- СписокИмён= ИмяОбъявление{"," ИмяОбъявление}.
|
|
|
+Сущность `структура`, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа структуры задаёт для каждого элемента, которое называется полем, его тип и имя, которое првязывает это поле. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры.
|
|
|
|
|
|
-Если тип записи экспортируется, имена полей, которые должны быть видимыми вне модуля объявления, должны быть помечены. Они называются публичными полями; неотмеченные поля называются приватными полями. Типы записей являются расширяемыми, т. е. тип записи может быть определён как расширение другого типа записи. В приведенных выше примерах УзелСередина (непосредственно) расширяет Узел, который является (прямым) базовым типом УзелСередина. Точнее, УзелСередина расширяет Узел с полями имя и подузел.
|
|
|
-Определение. Тип T расширяет тип T0, если он является T0, или если он непосредственно расширяет расширение T0. И наоборот, тип T0 является базовым типом для типа T, если он является T, или если он является прямым базовым типом базового типа T. Примеры типов записей:
|
|
|
- RECORD день, месяц, год: INTEGER
|
|
|
- END
|
|
|
- RECORD
|
|
|
- имя, фамилия: ARRAY 32 OF CHAR;
|
|
|
- возраст: INTEGER;
|
|
|
- зарплата: REAL
|
|
|
- END
|
|
|
+```bash
|
|
|
+ТипЗаписи = STRUCT ["(" БазовыйТип")"] [СписокПолейТипа].
|
|
|
+БазовыйТип = квалификатор.
|
|
|
+СписокПолейТипа= СписокПолей{";" СписокПолей}.
|
|
|
+СписокПолей = СписокИмён":" тип.
|
|
|
+СписокИмён = ИмяОбъявление{"," ИмяОбъявление}.
|
|
|
+```
|
|
|
+
|
|
|
+Если тип структуры экспортируется, имена полей, которые должны быть видимыми вне модуля объявления, должны быть помечены. Они называются публичными полями; неотмеченные поля называются приватными полями. Типы записей являются расширяемыми, т. е. тип записи может быть определён как расширение другого типа записи. В приведенных выше примерах УзелСередина (непосредственно) расширяет Узел, который является (прямым) базовым типом УзелСередина. Точнее, УзелСередина расширяет Узел с полями имя и подузел.
|
|
|
+
|
|
|
+**Определение**. Тип T расширяет тип T0, если он является T0, или если он непосредственно расширяет расширение T0. И наоборот, тип T0 является базовым типом для типа T, если он является T, или если он является прямым базовым типом базового типа T. Примеры типов структур:
|
|
|
+
|
|
|
+```bash
|
|
|
+type Year struct{
|
|
|
+ день, месяц, год: INT,
|
|
|
+}
|
|
|
+type User struct{
|
|
|
+ имя, фамилия: ARRAY[32]BYTE,
|
|
|
+ возраст: INTEGER,
|
|
|
+ зарплата: REAL,
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 6.4 Структуры и ссылки
|
|
|
+
|
|
|
+Типы структур с точки зрения программиста *всегда* связываются по ссылке. С точки зрения реализации это может быть не так.
|
|
|
+
|
|
|
+```bash
|
|
|
+type ТипСсылка = тип;
|
|
|
+```
|
|
|
+
|
|
|
+### 6.5 Тип функции
|
|
|
+
|
|
|
+Тип функции является объектом кода, поэтому функция является статической сущностью.
|
|
|
+
|
|
|
+Все переменные присваиваются ссылкой на функцию с точки зрения программиста.
|
|
|
|
|
|
-6.4 Тип ссылка
|
|
|
-Переменные ссылки типа P принимают в качестве значений ссылки на переменные некоторого типа T. Этот тип должен быть типом записи. Ссылка типа P называется связанным с T, а T - базовым типом для ссылки P. Типы ссылок наследуют отношение расширения их базовых типов (если они есть). Если тип T является расширением T0 и P является типом ссылки, связанным с T, то P также является расширением P0, тип ссылки, связанный с T0.
|
|
|
+С точки зрения реализации -- это может быть как угодно.
|
|
|
|
|
|
- ТипСсылка = POINTER TO тип .
|
|
|
+> ТипФункция = FN [ФормальныеПараметры].
|
|
|
|
|
|
-Если тип P определён как POINTER TO T, тип T может быть текстуально объявлен после объявления P, но [если это так] он должен находиться в пределах одной области. Если p - переменная типа P = POINTER TO T, то вызов предопределённой процедуры NEW (p) имеет следующий эффект (см. 10.2): переменная типа T выделяется в свободном хранилище памяти, а ссылка на неё присваивается p. Эта ссылка p имеет тип P, а ссылочная переменная p^ имеет тип T. Отказ распределения памяти под структуру приводит к тому, что p получает значение NIL. Каждой переменной-ссылку может быть присвоено значение NIL, которое вообще не указывает на какую-либо переменную.
|
|
|
-6.5 Процедурный тип
|
|
|
-Переменные процедурного типа T принимают процедуру (или NIL) в качестве значения. Если процедуре P присвоена переменная процедурного типа T, формальные параметры (типа) P должны быть такими же, как те, что указаны в формальных параметрах T. То же самое справедливо для типа результата в случае (См. 10.1). P не должен быть объявлен локальным для другой процедуры, и не может быть стандартной процедурой.
|
|
|
- ПроцедурныйТип = PROCEDURE [ФормальныеПараметры].
|
|
|
+## 7. Объявление переменных
|
|
|
|
|
|
-1. Объявление переменных
|
|
|
Объявления переменных служат для введения переменных и связывания их с именами, которые не должны повторяться в пределах данной области. Они также служат для связывания фиксированных типов данных с переменными.
|
|
|
|
|
|
ОбъявлениеПеременной = СписокИмён":" тип.
|