|
|
@@ -50,7 +50,7 @@
|
|
|
|
|
|
**Оберон-У** — язык программирования общего назначения, который является развитием **Модулы-2** и модификацией **Оберон-7**.
|
|
|
|
|
|
-Данная вариация по большей части не имеет принципиально новых концепций, новые части отдельно описаны в соответствующих разделах. Концепция позволяет максимально изолировать высокоуровневые средства от низкоуровневых.
|
|
|
+Данная вариация по большей части не имеет принципиально новых концепций, новые части отдельно описаны в соответствующих разделах. Концепция позволяет максимально изолировать абстрактные средства от аппаратных (опасных).
|
|
|
|
|
|
Назначение этого документа в том, чтобы служить эталоном для программистов, разработчиков и авторов руководств. Если о чём-то не сказано, то обычно это ошибка.
|
|
|
|
|
|
@@ -67,101 +67,106 @@
|
|
|
`Модуль` имеет строго заданную структуру:
|
|
|
|
|
|
```bash
|
|
|
-МОДУЛЬ Старт
|
|
|
+модуль Старт;
|
|
|
|
|
|
-// Импорт, Типы, Переменные, Функции
|
|
|
+Импорты?, Типы?, Константы?, Переменные?, Функции?;
|
|
|
|
|
|
{
|
|
|
- // Выражения при загрузке модуля
|
|
|
+ Выражения?; // При загрузке модуля
|
|
|
}
|
|
|
```
|
|
|
|
|
|
До начала модуля и после окончания модуля может быть любой текст.
|
|
|
|
|
|
-`Модуль` может содержать бесконечное множество правильно сформированных `предложений`, в соответствии с синтаксисом языка. Набор предложений **Оберон** ограничивается объявлением модуля. Каждое предложение представляет собой конечную последовательность *символов* из *конечного словаря*. Словарь **Оберон** состоит из `сущностей`:
|
|
|
+`Модуль` может содержать бесконечное множество правильно сформированных `предложений`, в соответствии с синтаксисом языка (продукциями). Набор предложений **Оберон** ограничивается объявлением модуля. Количество предложений в модуле не ограничено. Каждое предложение представляет собой конечную последовательность *символов* из *словаря программы*. Словарь программы **Оберон** состоит из `символов`:
|
|
|
|
|
|
- *пользовательский символ*;
|
|
|
- *встроенный символ*;
|
|
|
|
|
|
-Все эти `сущности` входят в группу `дерево символов` и состоят из `литер`. (Обратите внимание на разницу между `символами` и `литерами`). `Дерево символов` кроме самих `сущностей` содержит связи `сущностей` и все их необходимые `атрибуты`. `Листья` дерева не могут видеть другие `листья`, находящиеся ниже по веткам или в соседних ветках. Также есть ряд отдельных случаев описанных ниже.
|
|
|
+Все эти `символы` входят в группу `словарь программы`; все символы состоят из `литер`. (Обратите внимание на разницу между `символами` и `литерами`). `Словарь символов` кроме самих `символов` содержит связи `символов` и все их необходимые `атрибуты`.
|
|
|
|
|
|
-Синтаксические сущности (`символы`) обозначаются русскими словами (английскими эквивалентами), выражающими их функциональное назначение. `Символы` могут быть на любом языке, ограничений нет. `Символы` словаря языка программирования обозначаются литеральными строками, заключенными в кавычки или литерами.
|
|
|
+`Символы` проритетно обозначаются русскими словами выражающими их функциональное назначение. Здесь представлены английские эквиваленты. `Символы` могут быть на любом языке, ограничений нет. `Символы` словаря языка программирования обозначаются литеральными строками в одиночных кавычках.
|
|
|
|
|
|
## 2. Синтез сущностей
|
|
|
|
|
|
В группу `литеры` входят несколько классов:
|
|
|
|
|
|
-- `буква`;
|
|
|
-- `цифра`;
|
|
|
+- `Буква`;
|
|
|
+- `Цифра`;
|
|
|
|
|
|
-Для составления `пользовательских символов` предусматривается использование следующих правил. `Пробелы` и `переносы строк` не должны встречаться внутри `пользовательских символов` (исключая `комментарии`). Они игнорируются, если они не существенны для отделения двух последовательных `символов`. Заглавные и строчные буквы считаются различными.
|
|
|
+Для конструирования `пользовательских символов` предусматривает использование следующих правил. Литеры `Пробел`, `табуляция`,`переносы строк` не должны встречаться внутри `пользовательских символов` (кроме `комментариев`). Они игнорируются только в `литеральных строках`. Заглавные и строчные буквы считаются различными.
|
|
|
|
|
|
-`Имена` — тип сущностей в виде последовательности `букв` и `цифр`. Первая `литера` *должна* быть `буквой`.
|
|
|
+`Имя` — тип `символов` в виде последовательности `букв` и `цифр`. Первая `литера` *должна* быть `буквой`.
|
|
|
|
|
|
-> имя = буква + (буква?.. | цифра?..);
|
|
|
+> Имя = Буква + (Буква.. | Цифра..)?;
|
|
|
|
|
|
Примеры:
|
|
|
|
|
|
> x Сканер Оберон Символ_Получить перваяЛитера name2
|
|
|
|
|
|
-В группу `числа` входят символы:
|
|
|
+В группу `Число` входят символы:
|
|
|
|
|
|
-- `целые числа`;
|
|
|
-- `дробные числа`.
|
|
|
+- `ЧислоЦелое`;
|
|
|
+- `ЧислоДробное`.
|
|
|
|
|
|
-`Целые числа` являются последовательностью `цифр` и могут быть продолжены `литерой` суффикса слитно за числом. Если суффикса нет, то представление десятичное. Суффикс `H` обозначает шестнадцатеричное представление.
|
|
|
+`ЧислоЦелое` являются последовательностью `Цифра` и могут быть продолжены `литерой` суффикса `H` слитно за числом.
|
|
|
|
|
|
-`Дробное число` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени».
|
|
|
+- Без суффикса -- представление десятичное;
|
|
|
+- Суффикс `H` обозначает шестнадцатеричное представление.
|
|
|
+
|
|
|
+`ЧислоДробное` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени».
|
|
|
|
|
|
```bash
|
|
|
-цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
|
-шестнЦифра = цифра | "A" | "B" | "C" | "D" | "E" | "F";
|
|
|
+Цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
|
+ЦифраШестн = Цифра | "A" | "B" | "C" | "D" | "E" | "F";
|
|
|
|
|
|
-целое = знак? цифра | цифра..? шестнЦифра? + H?;
|
|
|
-дробное = знак}? + цифра | цифра..? + "." + цифра Порядок?;
|
|
|
-Порядок = "E" ("+" | "-")? цифра | цифра..?;
|
|
|
+ЧислоЗнак = "+"? | "-"?;
|
|
|
+ЧислоЦелое = ЧислоЗнак? Цифра | Цифра..? ЦифраШестн? + "H"?;
|
|
|
+ЧислоДробное = ЧислоЗнак? + Цифра | Цифра..? + "." + Цифра..Порядок?;
|
|
|
+Порядок = "E" ЧислоЗнак? Цифра | Цифра..?;
|
|
|
|
|
|
-число = целое | дробное.
|
|
|
+Число = ЧислоЦелое | ЧислоДробное.
|
|
|
```
|
|
|
|
|
|
Примеры:
|
|
|
|
|
|
> 1987 100H = 256 12.3 4.567E8 = 456700000
|
|
|
|
|
|
-`Строковые литералы` — последовательность `литер`, заключенных в двойные кавычки `"`. Ограничивающая кавычка не должна встречаться внутри литерала, но допускается:
|
|
|
+`Строковые литералы` — последовательность `литер`, заключенных в одиночные кавычки `'`. Ограничивающая кавычка не должна встречаться внутри литерала, но допускается:
|
|
|
|
|
|
-- литерал из одной литеры может быть определён порядковым номером литеры в шестнадцатеричной нотации с последующей литерой "X";
|
|
|
- внутри литерала может быть кавычка с экраном, также непечатаемые символы должны быть экранированы даун-слэшем.
|
|
|
|
|
|
Число литер в литерале называется длиной строкового литерала.
|
|
|
|
|
|
```bash
|
|
|
-строка = литера..? | цифра? шестнЦифра? + "X"?;
|
|
|
+Строка = "'" + (Литера..? | Цифра..?)? + "'";
|
|
|
```
|
|
|
|
|
|
Примеры:
|
|
|
|
|
|
-> "ОБЕРОН" "Don't worry!" 22X "Hey, \"world\"!"
|
|
|
+> 'ОБЕРОН' 'Don\'t worry!' 'Hey, "world"!'
|
|
|
|
|
|
Все `символы` делятся на две группы:
|
|
|
|
|
|
-- `встроенные символы` (предопределены заранее);
|
|
|
+- `встроенные символы` (использованы в языке);
|
|
|
- `пользовательские символы` (определяются пользователем).
|
|
|
|
|
|
В группу `встроенных символов` входят:
|
|
|
|
|
|
- `ключевой символ` (зарезервированные слова);
|
|
|
-- `предписание` (сложные сущности, управляющие потоком программы);
|
|
|
-- `оператор` (простые сущности ,управляющие действиями);
|
|
|
-- `разделитель` (простые сущности, разделяющие другие сущности).
|
|
|
+- `предписание` (составные символы, управляющие потоком программы);
|
|
|
+- `оператор` (простые символы, управляющие операциями);
|
|
|
+- `разделитель` (простые символы, разделяющие другие символы);
|
|
|
+- `комментарий` (поясняющий текст, возможно опции компилятора).
|
|
|
|
|
|
`Ключевые символы` являются специальной группой и они *не могут* использоваться в качестве `пользовательских символов` ни в какой части программы.
|
|
|
|
|
|
-Группа символов `комментарии` могут быть вставлены между любыми двумя `символами` в `программе`. Они являются произвольными последовательностями литер, которые открываются `/*`, `(*` и закрываются с помощью `*/`, `*)`. Однострочные `комментарии`` начинаются на `//` и действуют до конца строки. Комментарии *не влияют* на смысл программы. Они могут быть вложенными.
|
|
|
+Группа символов `комментарии` могут быть вставлены между любыми двумя `символами` в `программе`. Они являются произвольными последовательностями литер, которые открываются `/*`, `(*` и закрываются с помощью `*/`, `*)`. Однострочные `комментарии` начинаются на `//` и действуют до конца строки. Комментарии *не влияют* на смысл программы, но если это опции компилятора -- могут направлять компилятор на выбор нужных модулей. Комментарии могут быть вложенными.
|
|
|
|
|
|
`Разделитель` включает в себя:
|
|
|
|
|
|
- `пробел`;
|
|
|
+- `табуляция`;
|
|
|
- `перенос строки`.
|
|
|
|
|
|
Для более полного понимания зависимостей ниже приводится структурная схема:
|
|
|
@@ -171,28 +176,30 @@ flowchart TD
|
|
|
Программа
|
|
|
Модуль0
|
|
|
Модуль1
|
|
|
- Сущность0
|
|
|
- Сущность1
|
|
|
+ Символ0
|
|
|
+ Символ1
|
|
|
Пользовательские_символы
|
|
|
Встроенные_символы
|
|
|
Имя
|
|
|
Литеры
|
|
|
Программа --> Модуль0
|
|
|
Программа --> Модуль1
|
|
|
- Модуль1 --> Сущность0
|
|
|
- Модуль1 --> Сущность1
|
|
|
- Сущность1 --> Пользовательские_символы
|
|
|
- Сущность1 --> Встроенные_символы
|
|
|
+ Модуль1 --> Символ0
|
|
|
+ Модуль1 --> Символ1
|
|
|
+ Символ1 --> Пользовательские_символы
|
|
|
+ Символ1 --> Встроенные_символы
|
|
|
Встроенные_символы --> Ключевые_символы
|
|
|
Встроенные_символы --> Предписания
|
|
|
Встроенные_символы --> Операторы
|
|
|
Встроенные_символы --> Разделители
|
|
|
+ Встроенные_символы --> Комментарии
|
|
|
Пользовательские_символы --> Имя
|
|
|
Ключевые_символы --> Имя
|
|
|
Предписания --> Имя
|
|
|
Имя --> Литеры
|
|
|
Операторы --> Литеры
|
|
|
Разделители --> Литеры
|
|
|
+ Комментарии --> Литеры
|
|
|
Литеры --> Буквы
|
|
|
Литеры --> Цифры
|
|
|
Литеры --> Служебные
|
|
|
@@ -220,11 +227,8 @@ flowchart TD
|
|
|
| **= | Возведение в степень с присвоением операнда слева |
|
|
|
| / | Деление |
|
|
|
| /= | Деление с присвоением операнду слева |
|
|
|
-| ~ | Отрицание |
|
|
|
| < | Меньше |
|
|
|
| > | Больше |
|
|
|
-| & | Логическое И |
|
|
|
-| &= | Логическое И с присвоением операнду слева |
|
|
|
| = | Присвоить |
|
|
|
| // | Линейный комментарий |
|
|
|
| /* | Начало многострочного комментария |
|
|
|
@@ -235,9 +239,8 @@ flowchart TD
|
|
|
| <= | Меньше или равно |
|
|
|
| , | Запятая |
|
|
|
| >= | Больше или равно |
|
|
|
-| ; | Точка с запятой |
|
|
|
-| ... | Перечисление |
|
|
|
-| \| | Логическое ИЛИ |
|
|
|
+| ; | Разделитель выражений |
|
|
|
+| .. | Перечисление |
|
|
|
| : | Определить тип переменной |
|
|
|
| ( | Открывающая круглая скобка (выражение) |
|
|
|
| ) | Закрывающая круглая скобка (выражение) |
|
|
|
@@ -245,8 +248,16 @@ flowchart TD
|
|
|
| ] | Закрывающая квадратная скобка (массив) |
|
|
|
| { | Фигурная открывающая скобка (область видимости) |
|
|
|
| } | Закрывающая фигурная скобка (область видимости) |
|
|
|
-| ЕСТЬ | IS Проверка типа |
|
|
|
-| БУЛ | BOOL Белвый тип |
|
|
|
+| модуль | MODULE Объявление начала модуля |
|
|
|
+| импорт | IMPORT Импорт модуля |
|
|
|
+| конст | CONST Объявление константы |
|
|
|
+| тип | TYPE Объявление типа |
|
|
|
+| структ | STRUCT Объявление структуры |
|
|
|
+| сущ | VAR Объявление переменной |
|
|
|
+| фн | FN Объявление функции |
|
|
|
+| & | Создание объекта |
|
|
|
+| есть | IS Проверка типа |
|
|
|
+| бул | BOOL Белвый тип |
|
|
|
| ДА | TRUE Булево значение |
|
|
|
| НЕТ | FALSE Отрицание логического значения |
|
|
|
| БАЙТ | BYTE Тип байт |
|
|
|
@@ -254,15 +265,7 @@ flowchart TD
|
|
|
| ВЕЩ | REAL Дробное число |
|
|
|
| МАССИВ | ARRAY Массив элементов |
|
|
|
| ПРОВЕР | SWITCH Проверка на выбор |
|
|
|
-| ТИП | TYPE Объявление типа |
|
|
|
-| МОДУЛЬ | MODULE Объявление начала модуля |
|
|
|
-| ИМПОРТ | IMPORT Импорт модуля |
|
|
|
-| КОНСТ | CONST Объявление константы |
|
|
|
-| ТИП | TYPE Определение типа |
|
|
|
-| СТРУКТ | STRUCT Объявление структуры |
|
|
|
-| ЗНАЧ | VAR Объявление переменной |
|
|
|
| МУТ | MUT Признак изменяемости |
|
|
|
-| ФН | FN Объявление функции |
|
|
|
| ВЕРНУТЬ | RETURN Возврат из функции |
|
|
|
| НОВ | NEW Создать новую переменную |
|
|
|
| ЕСЛИ | IF Начало условия |
|
|
|
@@ -271,20 +274,19 @@ flowchart TD
|
|
|
| ДИВ | DIV Остаток от целочисленного деления |
|
|
|
| НИЧ | NIL Пустое состояние объекта |
|
|
|
| ПОКА | WHILE Условие проверки продолжения цикла на входе |
|
|
|
-| ПЕТЛЯ | LOOP Бесконечный цикл |
|
|
|
| ДАЛЬШЕ | NEXT Продолжить цикл с пропуском следующих выражений |
|
|
|
| ПРЕРВАТЬ | BREAK Прервать цикл с пропуском следующих выражений |
|
|
|
| ИЛИ | OR Логическое ИЛИ |
|
|
|
| И | AND Логическое И |
|
|
|
| НЕ | NOT Логическая инверсия |
|
|
|
-| ДЛЯ | FOR Объявление цикла |
|
|
|
|
|
|
## 4. Объявления имён и область видимости
|
|
|
|
|
|
-Каждое встречающееся в программе `имя` должно быть объявлено заранее, если это `ключевой символ` (например, `ТИП` или `ПЕРЕМ`). `Имя` также служит для задания опредёленных постоянных свойств сущности, например, является ли оно константой, определением типа, переменной или функцией.
|
|
|
-`Имя` используется для ссылки на соответствующую `сущность`. Это возможно в тех частях программы, которые находятся в пределах `области видимости`. `Имя` не может обозначать больше чем *одну* `сущность` внутри данной области. `Область видимости` распространяется текстуально от точки объявления до конца блока (функции или модуля), к которому принадлежит `имя` и, следовательно -- по отношению к которому, объект является локальным.
|
|
|
+Каждое встречающееся в программе `имя` должно быть объявлено заранее, если это `ключевой символ` (например, `тип` или `сущ`). `Имя` также служит для задания опредёленных постоянных свойств сущности, например, является ли оно константой, определением типа, переменной или функцией.
|
|
|
+
|
|
|
+`Имя` используется для ссылки на соответствующую `сущность`. Это возможно в тех частях программы, которые находятся в пределах `области видимости`. `Имя` не может обозначать больше чем *одну* `сущность` внутри одной области видимости. `Область видимости` распространяется текстуально от точки объявления до конца блока (модуля, функции или области видимости), к которому принадлежит `имя` и, следовательно -- по отношению к которому, объект является локальным.
|
|
|
|
|
|
-`Имя`, объявленное в блоке модуля, может сопровождаться *меткой экспорта* сразу после имени `*` , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом *только на чтение*. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль.
|
|
|
+`Имя`, объявленное в блоке модуля, может сопровождаться *меткой экспорта* перед именем `пуб` , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом *только на чтение*. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль.
|
|
|
|
|
|
`Имя` символа предваряется другим именем (префиксом), показывающим его модуль (см. Гл 11). Префикс и имя разделены точкой и вместе называются `уточнённым именем` (или `квалифицированным именем`).
|
|
|
|
|
|
@@ -295,7 +297,7 @@ flowchart TD
|
|
|
|
|
|
> ASR
|
|
|
> ASSERT
|
|
|
-> БУЛ
|
|
|
+> бул
|
|
|
> БАЙТ
|
|
|
> EXCL
|
|
|
> FLT
|
|
|
@@ -320,7 +322,7 @@ flowchart TD
|
|
|
Константное выражение может быть вычислено по его тексту без фактического выполнения программы. Его операнды — константы. Примеры объявлений констант:
|
|
|
|
|
|
```c
|
|
|
-КОНСТ {
|
|
|
+конст {
|
|
|
число = 100,
|
|
|
лимит = 2 * число - 1,
|
|
|
словаВсе = [0 .. словаРазмер -1],
|
|
|
@@ -350,18 +352,18 @@ flowchart TD
|
|
|
Примеры:
|
|
|
|
|
|
```c
|
|
|
-ТИП {
|
|
|
+тип {
|
|
|
Таблица = МАССИВ[255]ВЕЩ,
|
|
|
Дерево = Узел,
|
|
|
|
|
|
- СТРУКТ Узел {
|
|
|
+ структ Узел {
|
|
|
ключ: ЦЕЛОЕ,
|
|
|
Левый, Правый: Дерево,
|
|
|
}
|
|
|
|
|
|
ДеревоСередина = УзелСередина,
|
|
|
|
|
|
- СТРУКТ УзелСередина (Узел){
|
|
|
+ структ УзелСередина (Узел){
|
|
|
Имя: МАССИВ[32]БАЙТ,
|
|
|
Подузел: Дерево,
|
|
|
}
|
|
|
@@ -375,7 +377,7 @@ flowchart TD
|
|
|
|
|
|
Встроенные линейные типы:
|
|
|
|
|
|
-- `БУЛ` -- принимает значения `TRUE` и `FALSE`
|
|
|
+- `бул` -- принимает значения `TRUE` и `FALSE`
|
|
|
- `БАЙТ` -- целые числа от 0 до 255, размер фиксированный в 8 бит
|
|
|
- `ЦЕЛОЕ` -- целые числа, размер зависит от реализации
|
|
|
- `ВЕЩ` -- дробные числа, размер зависит от реализации
|
|
|
@@ -405,7 +407,7 @@ flowchart TD
|
|
|
Примеры типов массивов:
|
|
|
|
|
|
```c
|
|
|
-ЗНАЧ {
|
|
|
+сущ {
|
|
|
listUser=МАССИВ[NN]ЦЕЛОЕ,
|
|
|
moments=МАССИВ[10, 20]ВЕЩ,
|
|
|
}
|
|
|
@@ -416,7 +418,7 @@ flowchart TD
|
|
|
Пример:
|
|
|
|
|
|
```bash
|
|
|
-ЗНАЧ {
|
|
|
+сущ {
|
|
|
strHello="Привет",
|
|
|
}
|
|
|
```
|
|
|
@@ -428,7 +430,7 @@ flowchart TD
|
|
|
Сущность `структура`, состоящая из фиксированного количества элементов возможно разных типов. Объявление типа структуры задаёт для каждого элемента, которое называется полем, его тип и имя, которое првязывает это поле. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры.
|
|
|
|
|
|
```bash
|
|
|
-ТипЗаписи = СТРУКТ ( БазовыйТип?) {
|
|
|
+ТипЗаписи = структ ( БазовыйТип?) {
|
|
|
СписокПолейТипа
|
|
|
};
|
|
|
БазовыйТип = квалификатор;
|
|
|
@@ -442,11 +444,11 @@ flowchart TD
|
|
|
**Определение**. Тип `T1` является `T0`, если он непосредственно расширяет `T0`. И наоборот, тип `T0` является базовым типом для типа `T1`, если он является прямым базовым типом базового типа `T1`. Примеры типов структур:
|
|
|
|
|
|
```c
|
|
|
-ТИП {
|
|
|
- СТРУКТ Дата {
|
|
|
+тип {
|
|
|
+ структ Дата {
|
|
|
день, месяц, год: ЦЕЛОЕ,
|
|
|
}
|
|
|
- СТРУКТ User (Дата){
|
|
|
+ структ User (Дата){
|
|
|
имя, фамилия: МАССИВ[32]БАЙТ,
|
|
|
возраст: ЦЕЛОЕ,
|
|
|
зарплата: ВЕЩ,
|
|
|
@@ -479,17 +481,17 @@ flowchart TD
|
|
|
Переменные, имена которых отображаются через запятую имеют один и тот же тип. Примеры объявления переменных (см. Примеры в главе 6):
|
|
|
|
|
|
```c
|
|
|
-ТИП {
|
|
|
- СТРУКТ Текст {
|
|
|
+тип {
|
|
|
+ структ Текст {
|
|
|
лит: БАЙТ,
|
|
|
счётчик: ЦЕЛОЕ,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-ЗНАЧ {
|
|
|
+сущ {
|
|
|
i, j, k: ЦЕЛОЕ,
|
|
|
x, y: ВЕЩ,
|
|
|
- p, q: БУЛ,
|
|
|
+ p, q: бул,
|
|
|
f: FN(),
|
|
|
a: МАССИВ[100]ВЕЩ,
|
|
|
w: МАССИВ[16]Текст,
|
|
|
@@ -550,7 +552,7 @@ t(УзелСредний).подузел(Дерево)
|
|
|
|
|
|
```bash
|
|
|
выражение = (ОперацияПростая ОперацияОтношение ОперацияПростая)..;
|
|
|
-ОперацияОтношение = "=" | "~" | "<" | "<=" | ">" | ">=" | ЕСТЬ;
|
|
|
+ОперацияОтношение = "=" | "~" | "<" | "<=" | ">" | ">=" | есть;
|
|
|
ОперацияПростая = ()"+"|"−"? разделитель? ОператорАддикции разделитель?;
|
|
|
ОперациярАддикции= "+" | "−" | ИЛИ;
|
|
|
разделитель = множитель ОператорМультипликации? множитель;
|
|
|
@@ -570,7 +572,7 @@ t(УзелСредний).подузел(Дерево)
|
|
|
| И | И логическое соединение |
|
|
|
| НЕ | НЕ логическое отрицание |
|
|
|
|
|
|
-Эти операции применяются к операндам БУЛ и дают результат BOO.
|
|
|
+Эти операции применяются к операндам бул и дают результат BOO.
|
|
|
|
|
|
> р ИЛИ q // означает «если р, то ДА, иначе q»
|
|
|
> p И q // обозначает «если р, то q, иначе НЕТ
|
|
|
@@ -607,28 +609,28 @@ t(УзелСредний).подузел(Дерево)
|
|
|
| <= | меньше или равно |
|
|
|
| > | больше |
|
|
|
| = | больше или равно |
|
|
|
-| ЕСТЬ | проверка типа |
|
|
|
+| есть | проверка типа |
|
|
|
|
|
|
-Результат операций отношения является базовым типом `БУЛ`. `ОперацияОтношение` (`<`, `<=`,`>`,`=`) применяется к числовым типам и `БАЙТ`. Отношения `=` и `!=` применимы также к типам `БУЛ`, ссылкам и процедурным типам.
|
|
|
+Результат операций отношения является базовым типом `бул`. `ОперацияОтношение` (`<`, `<=`,`>`,`=`) применяется к числовым типам и `БАЙТ`. Отношения `=` и `!=` применимы также к типам `бул`, ссылкам и процедурным типам.
|
|
|
|
|
|
-`v ЕСТЬ T` означает `v ЯВЛЯЕТСЯ типом T` и вызывает проверку типа. Это применимо, если выполнены все условия:
|
|
|
+`v есть T` означает `v ЯВЛЯЕТСЯ типом T` и вызывает проверку типа. Это применимо, если выполнены все условия:
|
|
|
|
|
|
- `T` расширение объявленной структуры `T0` для `v`;
|
|
|
- `v` параметр, как переменная заданного типа структуры.
|
|
|
|
|
|
-Предполагая, например, что сслыка на тип структуры `T` является расширением базовой ссылки на тип структуры `T0`, тогда проверка `v ЕСТЬ T` определяет, является ли фактически указанная переменная (в том числе, а не только `T0`) cтруктурой типа `T`. Значение `ПУСТО ЕСТЬ Т` возвращает отрицательный результат.
|
|
|
+Предполагая, например, что сслыка на тип структуры `T` является расширением базовой ссылки на тип структуры `T0`, тогда проверка `v есть T` определяет, является ли фактически указанная переменная (в том числе, а не только `T0`) cтруктурой типа `T`. Значение `ПУСТО есть Т` возвращает отрицательный результат.
|
|
|
Примеры выражений (см. Примеры в главе 7):
|
|
|
|
|
|
```c
|
|
|
1987 (`ЦЕЛОЕ`)
|
|
|
I ДИВ 3 (`ЦЕЛОЕ`)
|
|
|
-~ P ИЛИ q (`БУЛ`)
|
|
|
+~ P ИЛИ q (`бул`)
|
|
|
(I + j) * (i-j) (`ЦЕЛОЕ`)
|
|
|
A [i + j] * a [i-j] (`ВЕЩ`)
|
|
|
-(0 <= i) & (i <100) (`БУЛ`)
|
|
|
-T.ключ = 0 (`БУЛ`)
|
|
|
-K == i (`БУЛ`)
|
|
|
-T ЕСТЬ УзелСредний (`БУЛ`)
|
|
|
+(0 <= i) & (i <100) (`бул`)
|
|
|
+T.ключ = 0 (`бул`)
|
|
|
+K == i (`бул`)
|
|
|
+T есть УзелСредний (`бул`)
|
|
|
```
|
|
|
|
|
|
## 9. Предписания
|
|
|
@@ -725,7 +727,7 @@ w[i+1].ch = "A"
|
|
|
Пример:
|
|
|
|
|
|
```c
|
|
|
-ТИП СвязьЦел СТРУКТ{
|
|
|
+тип СвязьЦел структ{
|
|
|
a : ЦЕЛОЕ
|
|
|
}
|
|
|
|
|
|
@@ -733,7 +735,7 @@ w[i+1].ch = "A"
|
|
|
а:5,
|
|
|
}
|
|
|
|
|
|
-ТИП СвязьВещ СТРУКТ{
|
|
|
+тип СвязьВещ структ{
|
|
|
а:ВЕЩ
|
|
|
}
|
|
|
|
|
|
@@ -836,10 +838,10 @@ v := beg;
|
|
|
|
|
|
```bash
|
|
|
ОбъявлениеФункции = ИмяФункции{ТелоФункции}.
|
|
|
-ИмяФункции = ФН ИмяФункции(ФормальныеПараметры..)Результат.
|
|
|
+ИмяФункции = фн ИмяФункции(ФормальныеПараметры..)Результат.
|
|
|
ТелоФункции = ПоследОбъявлений{ПоследПредписаний, ВЕРНУТЬ Выражение}.
|
|
|
-ПоследОбъявлений = [КОНСТ {ОбъявлениеКонстант ";"}]
|
|
|
-[ТИП {ОбъявлениеТипов ";"}] [ЗНАЧ {ОбъявлениеПеременных ";"}]
|
|
|
+ПоследОбъявлений = [конст {ОбъявлениеКонстант ";"}]
|
|
|
+[тип {ОбъявлениеТипов ";"}] [сущ {ОбъявлениеПеременных ";"}]
|
|
|
{ОбъявлениеФункции ";"}.
|
|
|
```
|
|
|
|
|
|
@@ -847,7 +849,7 @@ v := beg;
|
|
|
|
|
|
Формальные параметры (или просто параметры) -- это имена, которые обозначают фактические параметры (аргументы), указанные в вызове функции. Соответствие между аргументами и параметрами устанавливается при вызове функции. Переменная соответствует фактическому параметру, который является переменной, и она обозначает эту переменную. Значение соответствует фактическому параметру, который является выражением, и он обозначает его значение, которое невозможно изменить при передаче. Однако, если значение имеет базовый тип, он представляет собой локальную переменную, которой первоначально присваивается значение фактического выражения.
|
|
|
|
|
|
-Тип параметра указывается в списке формальных параметров: переменные обозначаются ключевым словом `ЗНАЧ`, а значения не имеют такого префикса.
|
|
|
+Тип параметра указывается в списке формальных параметров: переменные обозначаются ключевым словом `сущ`, а значения не имеют такого префикса.
|
|
|
|
|
|
Функция-процедура без параметров должна иметь пустой список параметров. Она должна быть вызвана через имя функции, список фактических параметров которой также пуст.
|
|
|
|
|
|
@@ -855,7 +857,7 @@ v := beg;
|
|
|
|
|
|
```bash
|
|
|
Формальныйпараметр = "(" [Секция_FP {";" Секция_FP}] ")" [":" квалификатор].
|
|
|
-Секция_FP = [ЗНАЧ] имя{"," имя} ":" ФормальныйПараметр.
|
|
|
+Секция_FP = [сущ] имя{"," имя} ":" ФормальныйПараметр.
|
|
|
ФормальныйПараметр = МАССИВ[nn]Тип..
|
|
|
```
|
|
|
|
|
|
@@ -866,9 +868,9 @@ v := beg;
|
|
|
Примеры объявлений функций:
|
|
|
|
|
|
```c
|
|
|
-ФН Целое_Читать(ЗНАЧ x: `ЦЕЛОЕ`){
|
|
|
- ЗНАЧ i : ЦЕЛОЕ;
|
|
|
- ЗНАЧ ch: БАЙТ;
|
|
|
+фн Целое_Читать(сущ x: `ЦЕЛОЕ`){
|
|
|
+ сущ i : ЦЕЛОЕ;
|
|
|
+ сущ ch: БАЙТ;
|
|
|
i = 0;
|
|
|
Читать(ch);
|
|
|
ПОКА ("0" <= ch) И (ch <= "9") {
|
|
|
@@ -878,9 +880,9 @@ v := beg;
|
|
|
x = i
|
|
|
}
|
|
|
|
|
|
-ФН Целое_Писать(x: ЦЕЛОЕ){ // 0 <= x < 10^5
|
|
|
-ЗНАЧ i: ЦЕЛОЕ;
|
|
|
-ЗНАЧ buf: МАССИВ[5]ЦЕЛОЕ;
|
|
|
+фн Целое_Писать(x: ЦЕЛОЕ){ // 0 <= x < 10^5
|
|
|
+сущ i: ЦЕЛОЕ;
|
|
|
+сущ buf: МАССИВ[5]ЦЕЛОЕ;
|
|
|
i = 0;
|
|
|
ПОКА i==0{
|
|
|
buf[i] = x МОД 10;
|
|
|
@@ -890,8 +892,8 @@ i = 0;
|
|
|
Записать(БАЙТ(buf[i] + ORD("0")));
|
|
|
}
|
|
|
|
|
|
-ФН лог2(x: ЦЕЛОЕ):ЦЕЛОЕ{
|
|
|
- ЗНАЧ y ЦЕЛОЕ = 0; // assume x>0
|
|
|
+фн лог2(x: ЦЕЛОЕ):ЦЕЛОЕ{
|
|
|
+ сущ y ЦЕЛОЕ = 0; // assume x>0
|
|
|
WHILE x > 1 {
|
|
|
x = x ДИВ 2;
|
|
|
y++;
|
|
|
@@ -909,7 +911,7 @@ i = 0;
|
|
|
| Имя | Тип аргумента | Тип результата | Описание | Англ |
|
|
|
| ------------- | --------------- | -------------------- | ------------------------------ | --------- |
|
|
|
| | x: числовой тип | соответствует типу x | абсолютное значение числа | ABS(x) |
|
|
|
-| | x: ЦЕЛОЕ | БУЛ | x МОД 2 = 1, чёиность | ODD(x) |
|
|
|
+| | x: ЦЕЛОЕ | бул | x МОД 2 = 1, чёиность | ODD(x) |
|
|
|
| м.Длин() | v: МАССИВ | ЦЕЛОЕ | длина массива v | v.Len() |
|
|
|
| х.СдвигЛев(н) | x, н: ЦЕЛОЕ | ЦЕЛОЕ | логический сдвиг влево, x * 2n | LSL(x, n) |
|
|
|
| | x, n: ЦЕЛОЕ | ЦЕЛОЕ | знаковый сдвиг вправо,x DIV 2n | ASR(x, n) |
|
|
|
@@ -921,7 +923,7 @@ i = 0;
|
|
|
| --- | ------------- | -------------- | ------------------- | -------- |
|
|
|
| | ВЕЩ | ЦЕЛОЕ | округление вниз | FLOOR(x) |
|
|
|
| | ЦЕЛОЕ | ВЕЩ | преобразование типа | FLT(x) |
|
|
|
-| | БАЙТ, БУЛ | ЦЕЛОЕ | порядковый номер x | ORD(x) |
|
|
|
+| | БАЙТ, бул | ЦЕЛОЕ | порядковый номер x | ORD(x) |
|
|
|
|
|
|
Безопасные процедуры:
|
|
|
|
|
|
@@ -944,14 +946,14 @@ i = 0;
|
|
|
Модуль представляет собой набор объявлений констант, типов, переменных и функций и последовательностей предписаний с целью присвоения начальных значений переменным. Модуль обычно представляет собой текст, который можно скомпилировать как единое целое.
|
|
|
|
|
|
```bash
|
|
|
-Модуль = МОДУЛЬ Имя;
|
|
|
+Модуль = модуль Имя;
|
|
|
[СписокИмпорта]
|
|
|
СписокОбъявлений..? | СписокПредписаний..?;
|
|
|
{
|
|
|
СписокВыражений..?;
|
|
|
}
|
|
|
|
|
|
-СписокИмпорта = ИМПОРТ {
|
|
|
+СписокИмпорта = импорт {
|
|
|
ИмпортМодуля..?
|
|
|
}
|
|
|
|
|
|
@@ -967,23 +969,23 @@ i = 0;
|
|
|
Пример:
|
|
|
|
|
|
```c
|
|
|
-МОДУЛЬ Вывод; // экспортирует процедуры: Write, WriteInt, WriteLn
|
|
|
+модуль Вывод; // экспортирует процедуры: Write, WriteInt, WriteLn
|
|
|
|
|
|
-ИМПОРТ {
|
|
|
+импорт {
|
|
|
Текст,
|
|
|
Oberon,
|
|
|
}
|
|
|
|
|
|
-ЗНАЧ {
|
|
|
+сущ {
|
|
|
W: Текст.Writer,
|
|
|
}
|
|
|
|
|
|
-ФН Write*(ch: БАЙТ){
|
|
|
+фн Write*(ch: БАЙТ){
|
|
|
Текст.Write(W, ch);
|
|
|
}
|
|
|
|
|
|
-ФН WriteInt*(x, n: `ЦЕЛОЕ`){
|
|
|
- ЗНАЧ {
|
|
|
+фн WriteInt*(x, n: `ЦЕЛОЕ`){
|
|
|
+ сущ {
|
|
|
i: ЦЕЛОЕ = 0,
|
|
|
a: МАССИВ[16]BYTE,
|
|
|
}
|
|
|
@@ -1010,7 +1012,7 @@ i = 0;
|
|
|
Текст.Write(W, a[i]);
|
|
|
}
|
|
|
|
|
|
-ФН WriteLn*{}
|
|
|
+фн WriteLn*{}
|
|
|
Текст.WriteLn(W);
|
|
|
Текст.Append(Oberon.Log, W.buf);
|
|
|
}
|
|
|
@@ -1180,12 +1182,12 @@ DO ПоследПредписаний END.
|
|
|
ТелоПроцедуры = ПоследОпределений[BEGIN ПоследПредписаний ]
|
|
|
[RETURN выражение ] END.
|
|
|
|
|
|
-ПоследОпределений = [КОНСТ {ОпрКонстант ";"}]
|
|
|
+ПоследОпределений = [конст {ОпрКонстант ";"}]
|
|
|
[TYPE {ОпрТипа ";"}]
|
|
|
-[ЗНАЧ {ОпрПеременной ";"}]
|
|
|
+[сущ {ОпрПеременной ";"}]
|
|
|
{ОпрПроцедуры ";"}.
|
|
|
ФормальныеПараметры = "(" [Секция_FP {";" Секция_FP}] ")" [":" квалификатор].
|
|
|
-Секция_FP = [ЗНАЧ] имя {"," имя } ":" ФормальныйТип.
|
|
|
+Секция_FP = [сущ] имя {"," имя } ":" ФормальныйТип.
|
|
|
ФормальныйТип = {МАССИВ OF} квалификатор.
|
|
|
|
|
|
модуль = MODULE имя ";" [СписокИмпорта] ПоследОпределений
|