|
|
@@ -13,7 +13,7 @@
|
|
|
- [Оглавление](#оглавление)
|
|
|
- [0. Введение](#0-введение)
|
|
|
- [1. Синтаксис](#1-синтаксис)
|
|
|
- - [2. Синтез сущностей](#2-синтез-сущностей)
|
|
|
+ - [2. Синтез символов](#2-синтез-символов)
|
|
|
- [3. Ключевые символы](#3-ключевые-символы)
|
|
|
- [4. Объявления имён и область видимости](#4-объявления-имён-и-область-видимости)
|
|
|
- [5. Объявление констант](#5-объявление-констант)
|
|
|
@@ -45,7 +45,7 @@
|
|
|
|
|
|
## 0. Введение
|
|
|
|
|
|
-Идея создания языка **Оберон-У** (далее просто **Оберон**) родилась после переосмысления идей несоответствия современного ИТ и средств разработки. [Никлаус Вирт](https://ru.wikipedia.org/wiki/Вирт,_Никлаус) продвинулся в этом отношении дальше всех. и львиная доля идей в концепции **Оберон** является либо трансляцией этих идей, либо творческой компиляции их.
|
|
|
+Идея создания языка **Оберон-У** (далее просто **Оберон**) родилась после переосмысления идей несоответствия современного ИТ и средств разработки. [Никлаус Вирт](https://ru.wikipedia.org/wiki/Вирт,_Никлаус) продвинулся в этом отношении дальше всех и львиная доля идей в концепции **Оберон** является либо трансляцией этих идей, либо творческой компиляции их.
|
|
|
|
|
|
**Оберон-У** — язык программирования общего назначения, который является развитием **Модулы-2** и модификацией **Оберон-7**.
|
|
|
|
|
|
@@ -53,17 +53,17 @@
|
|
|
|
|
|
Назначение этого документа в том, чтобы служить эталоном для программистов, разработчиков и авторов руководств. Если о чём-то не сказано, то обычно это ошибка.
|
|
|
|
|
|
-Этот документ описывает язык как достаточный для реализации различного рода ПО: начиная от загрузчиков ОС, сами ОС системное и прикладное ПО.
|
|
|
+Этот документ описывает язык как достаточный для реализации различного рода ПО: начиная от загрузчиков ОС, сами ОС, системное и прикладное ПО.
|
|
|
|
|
|
Чтобы лучше понимать идею создания языка рекомендуется ознакомиться с некоторыми [концепциями](./doc/concept_media.md) построения бесшовной системной среды.
|
|
|
|
|
|
## 1. Синтаксис
|
|
|
|
|
|
-Для описания синтаксиса используется диалект расширенной формы Бэкуса—Наура (`РБНФ`) -- НШ [краткая справка](./doc/notation.md). Литера вопроса `?` означают необязательность записанного внутри них выражения, а двоеточие `..` означают его повторение (возможно 0 раз).
|
|
|
+Для описания синтаксиса используется диалект расширенной формы Бэкуса—Наура (`РБНФ`) -- **НШ** (здесь [краткая справка](./doc/notation.md)). Литера вопроса `?` означают необязательность записанного внутри них выражения, а двоеточие `..` означают его повторение (минимум 1 раз).
|
|
|
|
|
|
Законченный текст на языке программирования **Оберон** называется *программа*.
|
|
|
|
|
|
-`Программа` включает как минимум один *модуль*. В `программе` как правило `модулей` как правило больше одного, количество модулей в программе не ограничено. Каждый модуль должен обладать правильной структурой:
|
|
|
+`Программа` включает как минимум один *модуль*. В `программе` как правило `модулей` больше одного, количество модулей в программе не ограничено. Каждый модуль должен обладать правильной структурой:
|
|
|
|
|
|
`Модуль` имеет строго заданную структуру:
|
|
|
|
|
|
@@ -86,20 +86,22 @@
|
|
|
|
|
|
Все эти `символы` входят в группу `словарь программы`; все символы состоят из `литер`. (Обратите внимание на разницу между `символами` и `литерами`). `Словарь символов` кроме самих `символов` содержит связи `символов` и все их необходимые `атрибуты`.
|
|
|
|
|
|
-`Символы` проритетно обозначаются русскими словами выражающими их функциональное назначение. Здесь представлены английские эквиваленты. `Символы` могут быть на любом языке, ограничений нет. `Символы` словаря языка программирования обозначаются литеральными строками в одиночных кавычках.
|
|
|
+`Символы` проритетно обозначаются русскими словами выражающими их функциональное назначение. Здесь также представлены английские эквиваленты. `Символы` могут быть на любом языке, ограничений нет.
|
|
|
|
|
|
-## 2. Синтез сущностей
|
|
|
+## 2. Синтез символов
|
|
|
|
|
|
-В группу `литеры` входят несколько классов:
|
|
|
+Для составоения символов используются литеры. В группу `литеры` входят несколько подгрупп:
|
|
|
|
|
|
- `Буква`;
|
|
|
- `Цифра`;
|
|
|
+- `Разделитель`;
|
|
|
+- `СлужебнаяЛитера`;
|
|
|
|
|
|
-Для конструирования `пользовательских символов` предусматривает использование следующих правил. Литеры `Пробел`, `табуляция`,`переносы строк` не должны встречаться внутри `пользовательских символов` (кроме `комментариев`). Они игнорируются только в `литеральных строках`. Заглавные и строчные буквы считаются различными.
|
|
|
+Для конструирования `пользовательских символов` предусматривается использование следующих правил. Литеры `Пробел`, `Табуляция`,`ПереносСтроки` не должны встречаться внутри `пользовательских символов` (кроме `комментариев`). Они игнорируются только в `литеральных строках`. Заглавные и строчные буквы считаются различными.
|
|
|
|
|
|
`Имя` — тип `символов` в виде последовательности `букв` и `цифр`. Первая `литера` *должна* быть `буквой`.
|
|
|
|
|
|
-> Имя = Буква + (Буква.. | Цифра..)?;
|
|
|
+> Имя = Буква + (Буква..? | Цифра..?);
|
|
|
|
|
|
Примеры:
|
|
|
|
|
|
@@ -110,12 +112,12 @@
|
|
|
- `ЧислоЦелое`;
|
|
|
- `ЧислоДробное`.
|
|
|
|
|
|
-`ЧислоЦелое` являются последовательностью `Цифра` и могут быть продолжены `литерой` суффикса `H` слитно за числом.
|
|
|
+`ЧислоЦелое` являются последовательностью `Цифра` и могут быть продолжены `литерой` суффикса `H` слитно в конце числа.
|
|
|
|
|
|
- Без суффикса -- представление десятичное;
|
|
|
-- Суффикс `H` обозначает шестнадцатеричное представление.
|
|
|
+- Суффикс `H` -- представление шестнадцатеричное.
|
|
|
|
|
|
-`ЧислоДробное` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени».
|
|
|
+`ЧислоДробное` всегда содержит десятичную точку. Допускается чтобы оно было представлено целым десятичным числом. Литера `E` означает «умножить на десять в степени», после чего следует сама степень.
|
|
|
|
|
|
```bash
|
|
|
Цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
|
@@ -123,7 +125,7 @@
|
|
|
|
|
|
ЧислоЗнак = "+"? | "-"?;
|
|
|
ЧислоЦелое = ЧислоЗнак? Цифра | Цифра..? ЦифраШестн? + "H"?;
|
|
|
-ЧислоДробное = ЧислоЗнак? + Цифра | Цифра..? + "." + Цифра..Порядок?;
|
|
|
+ЧислоДробное = ЧислоЗнак? Цифра | Цифра..? + "." + Цифра..Порядок?;
|
|
|
Порядок = "E" ЧислоЗнак? Цифра | Цифра..?;
|
|
|
|
|
|
Число = ЧислоЦелое | ЧислоДробное.
|
|
|
@@ -135,7 +137,8 @@
|
|
|
|
|
|
`Строковые литералы` — последовательность `литер`, заключенных в одиночные кавычки `'`. Ограничивающая кавычка не должна встречаться внутри литерала, но допускается:
|
|
|
|
|
|
-- внутри литерала может быть кавычка с экраном, также непечатаемые символы должны быть экранированы даун-слэшем.
|
|
|
+- внутри литерала может быть кавычка с экраном;
|
|
|
+- также непечатаемые символы должны быть экранированы даун-слэшем.
|
|
|
|
|
|
Число литер в литерале называется длиной строкового литерала.
|
|
|
|
|
|
@@ -162,7 +165,7 @@
|
|
|
|
|
|
`Ключевые символы` являются специальной группой и они *не могут* использоваться в качестве `пользовательских символов` ни в какой части программы.
|
|
|
|
|
|
-Группа символов `комментарии` могут быть вставлены между любыми двумя `символами` в `программе`. Они являются произвольными последовательностями литер, которые открываются `/*`, `(*` и закрываются с помощью `*/`, `*)`. Однострочные `комментарии` начинаются на `//` и действуют до конца строки. Комментарии *не влияют* на смысл программы, но если это опции компилятора -- могут направлять компилятор на выбор нужных модулей. Комментарии могут быть вложенными.
|
|
|
+Группа символов `комментарии` могут быть вставлены между любыми двумя `символами` в `программе`. Они являются произвольными последовательностями литер, которые открываются `/*` и закрываются с помощью `*/`. Однострочные `комментарии` начинаются на `//` и действуют до конца строки. Комментарии *не влияют* на смысл программы, но если это опции компилятора -- могут направлять компилятор на выбор нужных модулей. Комментарии могут быть вложенными.
|
|
|
|
|
|
`Разделитель` включает в себя:
|
|
|
|
|
|
@@ -215,33 +218,21 @@ flowchart TD
|
|
|
| Символ | Комментарий |
|
|
|
| ------- | ---------------------------------------------------- |
|
|
|
| + | Сложение |
|
|
|
-| ++ | Инкремент операнда |
|
|
|
-| += | Сложение операндов с присвоением операнду слева |
|
|
|
-| = | Присвоение |
|
|
|
| - | Минус |
|
|
|
-| -- | Декремент |
|
|
|
-| -= | Вычитание операндов, с присвоением операнду слева |
|
|
|
-| ^ | Исключающее или |
|
|
|
-| ^= | Исключающее или с присвоением операнды слева |
|
|
|
| * | Умножение |
|
|
|
-| ** | Возведение в степень |
|
|
|
-| **= | Возведение в степень с присвоением операнда слева |
|
|
|
| / | Деление |
|
|
|
-| /= | Деление с присвоением операнду слева |
|
|
|
+| = | Присвоение |
|
|
|
| < | Меньше |
|
|
|
+| <= | Меньше или равно |
|
|
|
| > | Больше |
|
|
|
-| = | Присвоить |
|
|
|
+| >= | Больше или равно |
|
|
|
| // | Линейный комментарий |
|
|
|
| /* | Начало многострочного комментария |
|
|
|
| */ | Конец многострочного комментария |
|
|
|
-| (* | Начало многострочного комментария |
|
|
|
-| *) | Конец многострочного комментария |
|
|
|
| . | Точка |
|
|
|
-| <= | Меньше или равно |
|
|
|
| , | Запятая |
|
|
|
-| >= | Больше или равно |
|
|
|
| ; | Разделитель выражений |
|
|
|
-| .. | Перечисление |
|
|
|
+| .. | Конструктор диапазона |
|
|
|
| : | Определить тип переменной |
|
|
|
| ( | Открывающая круглая скобка (выражение) |
|
|
|
| ) | Закрывающая круглая скобка (выражение) |
|
|
|
@@ -253,11 +244,6 @@ flowchart TD
|
|
|
| импорт | IMPORT Импорт модуля |
|
|
|
| конст | CONST Объявление константы |
|
|
|
| тип | TYPE Объявление типа |
|
|
|
-| структ | STRUCT Объявление структуры |
|
|
|
-| сущ | VAR Объявление переменной |
|
|
|
-| фн | FN Объявление функции |
|
|
|
-| & | & Создание объекта |
|
|
|
-| есть | IS Проверка типа |
|
|
|
| бул | BOOL Белвый тип |
|
|
|
| да | TRUE Булево значение |
|
|
|
| нет | FALSE Отрицание логического значения |
|
|
|
@@ -265,16 +251,18 @@ flowchart TD
|
|
|
| целое | INT Дробное число |
|
|
|
| вещ | REAL Дробное число |
|
|
|
| массив | ARRAY Массив элементов |
|
|
|
-| провер | SWITCH Проверка на выбор |
|
|
|
+| структ | STRUCT Объявление структуры |
|
|
|
+| симв | VAR Объявление переменной |
|
|
|
| мут | MUT Признак изменяемости |
|
|
|
| пуб | PUB Признак экспорта |
|
|
|
+| фн | FN Объявление функции |
|
|
|
+| & | & Создание объекта |
|
|
|
+| есть | IS Проверка типа |
|
|
|
+| провер | SWITCH Проверка на выбор |
|
|
|
+| ветка | CASE ветка выбора |
|
|
|
| вернуть | RETURN Возврат из функции |
|
|
|
-| если | IF Начало условия |
|
|
|
-| аесли | IF Альтернативноее, если предыдущее не сработало |
|
|
|
-| мод | MOD Модуль от целочисленного деления |
|
|
|
-| див | DIV Остаток от целочисленного деления |
|
|
|
| нич | NIL Пустое состояние объекта |
|
|
|
-| пока | WHILE Условие проверки продолжения цикла на входе |
|
|
|
+| петля | LOOP Безусловный цикл |
|
|
|
| дальше | NEXT Продолжить цикл с пропуском следующих выражений |
|
|
|
| стоп | BREAK Прервать цикл с пропуском следующих выражений |
|
|
|
| или | OR Логическое или |
|
|
|
@@ -283,16 +271,18 @@ flowchart TD
|
|
|
|
|
|
## 4. Объявления имён и область видимости
|
|
|
|
|
|
-Каждое встречающееся в программе `имя` должно быть объявлено заранее, если это `ключевой символ` (например, `тип` или `сущ`). `Имя` также служит для задания опредёленных постоянных свойств сущности, например, является ли оно константой, определением типа, переменной или функцией.
|
|
|
+Каждое встречающееся в программе `имя` должно быть объявлено заранее, за исключением `ключевых символов` (например, `тип` или `симв`). `Имя` также служит для задания опредёленных постоянных свойств сущности, например, является ли оно константой, структурой, переменной, или функцией. Также `имена` присваиваются типам.
|
|
|
|
|
|
-`Имя` используется для ссылки на соответствующую `сущность`. Это возможно в тех частях программы, которые находятся в пределах `области видимости`. `Имя` не может обозначать больше чем *одну* `сущность` внутри одной области видимости. `Область видимости` распространяется текстуально от точки объявления до конца блока (модуля, функции или области видимости), к которому принадлежит `имя` и, следовательно -- по отношению к которому, объект является локальным.
|
|
|
+`Имя` используется для ссылки на соответствующий `символ`. Это возможно в тех частях программы, которые находятся в пределах `области видимости`. `Имя` не может обозначать больше чем *одну* `сущность` внутри одной области видимости. `Область видимости` распространяется текстуально от точки объявления до конца блока (модуля, функции или области видимости), к которому принадлежит `имя` и, следовательно -- по отношению к которому, объект является локальным. `Область видимости` обозначается двумя фигурными скобками `{..}`.
|
|
|
|
|
|
-`Имя`, объявленное в блоке модуля, может сопровождаться *меткой экспорта* перед именем `пуб` , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом *только на чтение*. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль.
|
|
|
+`Имя`, объявленное в блоке модуля, может сопровождаться *меткой экспорта* перед именем `пуб` , чтобы пояснить, что оно экспортируется из определяющего модуля с доступом *только на чтение*. В этом случае имя может быть использовано и в других модулях, если эти модули импортируют объявляющий модуль. Если перед именем установлена метка `мут` -- символ, на который ссылается имя является *изменяемым*, но только в пределах модуля. Если символ является неизменяемым, значение ему можно задать только во время конструирования.
|
|
|
|
|
|
`Имя` символа предваряется другим именем (префиксом), показывающим его модуль (см. ниже). Модуль и имя разделены точкой и вместе называются `уточнённым именем` (или `квалифицированным именем`).
|
|
|
|
|
|
> ИмяКвал = имя + "." + имя;
|
|
|
-> ИмяЭкспорт = "пуб" + имя ;
|
|
|
+> ИмяЭкспорт = "пуб" + имя;
|
|
|
+> ИмяИзмен = "мут + имя;
|
|
|
+> ИмяСимвол = ИмяЭкспорт? ИмяИзмен? имя;
|
|
|
|
|
|
Следующие имена являются стандартными (группа `ключевые символы`); их значение определено ниже:
|
|
|
|
|
|
@@ -325,7 +315,7 @@ UNPK
|
|
|
ОбъявлениеКонстанты = ИмяОпр + "=" + КонстантноеВыражение;
|
|
|
```
|
|
|
|
|
|
-Константное выражение может быть вычислено по его тексту на этапе компиляции программы. Его операнды — константы. Примеры объявлений констант:
|
|
|
+Константное выражение может быть вычислено по его тексту на этапе компиляции программы. Его операнды — константы. Значение константы не изменяется никогда. Примеры объявлений констант:
|
|
|
|
|
|
```c
|
|
|
конст {
|
|
|
@@ -338,7 +328,7 @@ UNPK
|
|
|
|
|
|
## 6. Объявление типов
|
|
|
|
|
|
-`Тип данных` задаёт множество специфичных значений, которые переменные этого типа могут принимать, а также множетво операторов и методов, которые к ним применимы. Объявление типа используется для связывания имени типа с определением типа. Типы определяют структуру переменных этого типа и, косвенно, операторы, которые применимы к компонентам самих типов.
|
|
|
+`Тип` задаёт множество специфичных значений, которые переменные этого типа могут принимать, а также множество операторов и методов, которые к ним применимы. Объявление типа используется для связывания имени типа с определением этого типа. Типы определяют структуры переменных этого типа и, через их специфику -- операторы, которые применимы к частям самих типов.
|
|
|
|
|
|
Типы данных деляется на две группы:
|
|
|
|
|
|
@@ -350,38 +340,33 @@ UNPK
|
|
|
- линейный типы;
|
|
|
- векторные типы.
|
|
|
|
|
|
-После присвоения литеральная строка представлена массивом байтов.
|
|
|
-
|
|
|
-```bash
|
|
|
-ОбъявлениеТипа = ИмяОпр + "=" + Тип;
|
|
|
-Тип = ИмяКвал | ТипСущность | ТипМассив | ТипСтруктура | ТипФункция;
|
|
|
-```
|
|
|
-
|
|
|
Примеры:
|
|
|
|
|
|
```c
|
|
|
тип {
|
|
|
Таблица = массив[255]вещ,
|
|
|
- Дерево = Узел,
|
|
|
|
|
|
структ Узел {
|
|
|
ключ: целое,
|
|
|
Левый, Правый: Дерево,
|
|
|
}
|
|
|
|
|
|
- ДеревоСередина = УзелСередина,
|
|
|
+ Дерево = Узел,
|
|
|
|
|
|
- структ УзелСередина (Узел){
|
|
|
+ структ УзелСередина (Дерево){
|
|
|
Имя: массив[32]байт,
|
|
|
- Подузел: Дерево,
|
|
|
+ Подузел: Узел,
|
|
|
}
|
|
|
+
|
|
|
+ ДеревоСередина = УзелСередина,
|
|
|
+
|
|
|
Функция = ФН (x: целое): целое,
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 6.1 Встроенные линейные типы
|
|
|
|
|
|
-Встроенные операторы и встроенные функции определены ниже. Имена встроенных типов следующие:
|
|
|
+Встроенные линейные типы представлены ниже:
|
|
|
|
|
|
Встроенные линейные типы:
|
|
|
|
|
|
@@ -404,7 +389,7 @@ UNPK
|
|
|
Массив - это структура, состоящая из фиксированного количества элементов, тип элементов одинаковый для всех элементов конкретного типа массива. Количество элементов массива называется его длиной. Элементы массива обозначаются индексами, которые являются целыми числами от 0 до (длины - 1). Массив может иметь несколько размерностей.
|
|
|
|
|
|
```bash
|
|
|
-ТипМассива = массив[длина, длина..?]тип_элемента;
|
|
|
+ТипМассива = массив[длина, длина..?]ТипИмя;
|
|
|
длина = Выражение | КонстантноеВыражение;
|
|
|
```
|
|
|
|
|
|
@@ -415,25 +400,32 @@ UNPK
|
|
|
Примеры типов массивов:
|
|
|
|
|
|
```c
|
|
|
-сущ {
|
|
|
+симв {
|
|
|
listUser = массив[NN]целое,
|
|
|
- moments = массив[10, 20]вещ,
|
|
|
+ moments = массив[10,20]вещ,
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-`Литеральная строка` при создании представляет собой набор байт в виде букв в двойных кавычках. После привоения фактически -- это массив байт.
|
|
|
+После присвоения литеральная строка представлена массивом байтов.
|
|
|
+
|
|
|
+```bash
|
|
|
+ОбъявлениеТипа = ИмяТип + "=" + СТРУКТ (ИмяТип?) { Поле..? };
|
|
|
+Тип = ИмяКвал | ТипСущность | ТипМассив | ТипСтруктура | ТипФункция;
|
|
|
+```
|
|
|
+
|
|
|
+`Литеральная строка` при создании представляет собой набор байт в виде букв в одинарных кавычках. После привоения фактически -- это массив байт.
|
|
|
|
|
|
Пример:
|
|
|
|
|
|
```bash
|
|
|
-сущ {
|
|
|
+симв {
|
|
|
strHello = `Привет`,
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 6.3 Структура
|
|
|
|
|
|
-Сущность `структура`, состоящая из фиксированного количества элементов возможно разных типов. Типа структуры при объявлении требует описание типа для каждого элемента этого типа, которое называется полем. Тип и имя поля првязывает является неотъемлемой частью структуры. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры. Структуры не помеченные как 'пуб' -- не экспортируются.
|
|
|
+Символ `структура`, состоит из фиксированного количества элементов возможно разных типов. Тип структуры при объявлении требует описание типа для каждого элемента этого типа, которое называется `полем`. Тип и имя `поля` является неотъемлемой частью структуры. Область действия этих имён полей - само определение структуры, но они также видны как неотъемлемые части экземпляра структуры в форме "через точку", которая ссылается на элементы самого экземпляра структуры. Структуры не помеченные как 'пуб' -- не экспортируются.
|
|
|
Структуры не помеченные как 'мут' -- нельзя изменить после создания. Тоже самое относится и к каждому полю структуры.
|
|
|
|
|
|
```bash
|
|
|
@@ -487,7 +479,7 @@ UNPK
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-сущ {
|
|
|
+симв {
|
|
|
i, j, k: целое,
|
|
|
x, y: вещ,
|
|
|
p, q: бул,
|
|
|
@@ -840,7 +832,7 @@ v := beg;
|
|
|
ИмяФункции = фн ИмяФункции(ФормальныеПараметры..)Результат.
|
|
|
ТелоФункции = ПоследОбъявлений{ПоследПредписаний, вернуть Выражение}.
|
|
|
ПоследОбъявлений = [конст {ОбъявлениеКонстант ";"}]
|
|
|
-[тип {ОбъявлениеТипов ";"}] [сущ {ОбъявлениеПеременных ";"}]
|
|
|
+[тип {ОбъявлениеТипов ";"}] [симв {ОбъявлениеПеременных ";"}]
|
|
|
{ОбъявлениеФункции ";"}.
|
|
|
```
|
|
|
|
|
|
@@ -848,7 +840,7 @@ v := beg;
|
|
|
|
|
|
Формальные параметры (или просто параметры) -- это имена, которые обозначают фактические параметры (аргументы), указанные в вызове функции. Соответствие между аргументами и параметрами устанавливается при вызове функции. Переменная соответствует фактическому параметру, который является переменной, и она обозначает эту переменную. Значение соответствует фактическому параметру, который является выражением, и он обозначает его значение, которое невозможно изменить при передаче. Однако, если значение имеет базовый тип, он представляет собой локальную переменную, которой первоначально присваивается значение фактического выражения.
|
|
|
|
|
|
-Тип параметра указывается в списке формальных параметров: переменные обозначаются ключевым словом `сущ`, а значения не имеют такого префикса.
|
|
|
+Тип параметра указывается в списке формальных параметров: переменные обозначаются ключевым словом `симв`, а значения не имеют такого префикса.
|
|
|
|
|
|
Функция-процедура без параметров должна иметь пустой список параметров. Она должна быть вызвана через имя функции, список фактических параметров которой также пуст.
|
|
|
|
|
|
@@ -856,7 +848,7 @@ v := beg;
|
|
|
|
|
|
```bash
|
|
|
Формальныйпараметр = "(" [Секция_FP {";" Секция_FP}] ")" [":" квалификатор].
|
|
|
-Секция_FP = [сущ] имя{"," имя} ":" ФормальныйПараметр.
|
|
|
+Секция_FP = [симв] имя{"," имя} ":" ФормальныйПараметр.
|
|
|
ФормальныйПараметр = массив[nn]Тип..
|
|
|
```
|
|
|
|
|
|
@@ -867,9 +859,9 @@ v := beg;
|
|
|
Примеры объявлений функций:
|
|
|
|
|
|
```c
|
|
|
-фн Целое_Читать(сущ x: `целое`){
|
|
|
- сущ i : целое;
|
|
|
- сущ ch: байт;
|
|
|
+фн Целое_Читать(симв x: `целое`){
|
|
|
+ симв i : целое;
|
|
|
+ симв ch: байт;
|
|
|
i = 0;
|
|
|
Читать(ch);
|
|
|
пока ("0" <= ch) и (ch <= "9") {
|
|
|
@@ -880,8 +872,8 @@ v := beg;
|
|
|
}
|
|
|
|
|
|
фн Целое_Писать(x: целое){ // 0 <= x < 10^5
|
|
|
-сущ i: целое;
|
|
|
-сущ buf: массив[5]целое;
|
|
|
+симв i: целое;
|
|
|
+симв buf: массив[5]целое;
|
|
|
i = 0;
|
|
|
пока i==0{
|
|
|
buf[i] = x мод 10;
|
|
|
@@ -892,7 +884,7 @@ i = 0;
|
|
|
}
|
|
|
|
|
|
фн лог2(x: целое):целое{
|
|
|
- сущ y целое = 0; // assume x>0
|
|
|
+ симв y целое = 0; // assume x>0
|
|
|
WHILE x > 1 {
|
|
|
x = x див 2;
|
|
|
y++;
|
|
|
@@ -975,7 +967,7 @@ i = 0;
|
|
|
Oberon,
|
|
|
}
|
|
|
|
|
|
-сущ {
|
|
|
+симв {
|
|
|
W: Текст.Writer,
|
|
|
}
|
|
|
|
|
|
@@ -984,7 +976,7 @@ i = 0;
|
|
|
}
|
|
|
|
|
|
фн WriteInt*(x, n: `целое`){
|
|
|
- сущ {
|
|
|
+ симв {
|
|
|
i: целое = 0,
|
|
|
a: массив[16]BYTE,
|
|
|
}
|
|
|
@@ -1183,10 +1175,10 @@ DO ПоследПредписаний END.
|
|
|
|
|
|
ПоследОпределений = [конст {ОпрКонстант ";"}]
|
|
|
[TYPE {ОпрТипа ";"}]
|
|
|
-[сущ {ОпрПеременной ";"}]
|
|
|
+[симв {ОпрПеременной ";"}]
|
|
|
{ОпрПроцедуры ";"}.
|
|
|
ФормальныеПараметры = "(" [Секция_FP {";" Секция_FP}] ")" [":" квалификатор].
|
|
|
-Секция_FP = [сущ] имя {"," имя } ":" ФормальныйТип.
|
|
|
+Секция_FP = [симв] имя {"," имя } ":" ФормальныйТип.
|
|
|
ФормальныйТип = {массив OF} квалификатор.
|
|
|
|
|
|
модуль = MODULE имя ";" [СписокИмпорта] ПоследОпределений
|