В качестве эксперимента попробовал взглянуть на Оберон с совершенно другой лексикой.
Из особенностей можно отметить
- С одной стороны большая направленность на кириллицу и набор из кириллических раскладок.
- С другой стороны уклон в интернационализацию с помощью значков и уменьшения зависимости от естественной лексики.
- И даже использование юникод-символов с целью приближения к математическим символам.
- Но с возможностью обойтись легкодоступными символами в альтернативном варианте.
- Увеличение ясности ряда элементов.
ПРЕДУПРЕЖДЕНИЕ: при наличии высокой чувствительности и лёгкой травмируемости лучше избежать дальнейшего просмотра.
Такой код на Обероне:
MODULE Parse;
IMPORT Int := ParseIntDec;
PROCEDURE InRange(pre, digit: INTEGER): BOOLEAN;
CONST Last = (-Int.Radix - Int.Min) MOD Int.Radix;
Cut = ( Last + Int.Min) DIV Int.Radix;
BEGIN ASSERT(pre <= 0); ASSERT((0 <= digit) & (digit < Int.Radix))
RETURN
(pre > Cut)
OR (pre = Cut) & (digit <= Last)
END InRange;
PROCEDURE Do*(s: ARRAY OF CHAR; VAR i: INTEGER;
VAR val: INTEGER): INTEGER;
VAR d, ok: INTEGER; neg: BOOLEAN;
BEGIN
neg := s[i] = "-";
IF neg OR (s[i] = "+") THEN INC(i) END;
ok := Int.Digit(s[i], d);
IF ok THEN
val := -d;
INC(i);
WHILE Int.Digit(s[i], d) & InRange(val, d) DO
val := val * Int.Radix - d;
INC(i)
END;
ok := (d < 0) & (neg OR (val >= -Int.Max));
IF ok & ~neg THEN
val := -val
END
END
RETURN ok
END Do;
END Parse.
С экспериментальной лексикой может выглядеть так:
==== Разбор (
((Набор ← ДляРазбора10й))
== Подходит(предв, цифра: Ц) → врамках: П,
!! предв ≤ 0.
!! 0 ≤ цифра < Набор`Основание.
(
Последняя .= (- Набор`Основание - Набор`Минимум) |÷| Набор`Основание.
МаксБезПосл .= (Последняя + Набор`Минимум) ÷ Набор`Основание.
врамках = (предв > МаксБезПосл)
∨ (предв = МаксБезПосл) ∧ (цифра ≤ Последняя)
).
== +Дай(стр: [×Л]; ↔ инд, → знач: Ц) → ух: П, !! 0 ≤ инд < ДЛИНА(стр). (
цифра: Ц. минус: П.
минус = стр[инд] = '-'.
?? минус ∨ (стр[инд] = '+') (
инд + 1
).
ух ← Набор`Цифра(стр[инд], → знач).
?? ух (
знач ← - знач.
инд + 1.
(↺) Набор`Цифра(стр[инд], → цифра) ∧ Подходит(знач, цифра) (
знач ← знач ⋅ Набор`Основание - цифра.
инд + 1
).
ух = (цифра < 0) ∧ (отр ∨ (знач ≥ - Набор`Максимум)).
?? ух ∧ ¬минус (
знач = - знач
)
)
) Дай.
) Разбор.
Таблица соответствия между кодом на привычной лекскике Оберона и экспериментальной.
Oberon | Эксперимент | |
---|---|---|
1000000 |
1`000`000
1 000 000 |
Десятичное число. Неправильно: 100 0000
|
4ABCDEFH |
04НЕ`ДТКПш
04НЕ ДТКП ш |
Мнемоника для шестнадцатеричных:
10 = 10 + Ноль
11 = 10 + Единица (О ~ 0)
12 = 10 + Двойка
13 = 10 + Тройка
14 = 10 + Кварта (Ч ~ 4)
15 = 10 + Пятёрка |
7FH |
7Пш
007Пш |
Неправильно: 07Пш , 7П |
1000.0001 |
1`000,000`10
1 000,000 10 |
Точное значение дроби |
2.718281828459045 |
2,718`281`828`459`045…
2,718 281 828 459 045_ |
Приблизительное значение дроби |
{1..4} |
{1..4}
(/1..4) |
|
{} |
{}
(/)
∅ |
|
TRUE |
ДА |
|
FALSE |
НЕТ |
|
NIL |
() |
|
BOOLEAN |
П |
Простейший, примитивный |
INTEGER |
Ц |
Целое |
REAL |
Д |
Дробь |
CHAR |
Л |
Литера |
SET |
М |
Множество |
ARRAY Const * 3 + 4 OF CHAR |
Const1 .= Const * 3.
[(Const1 + 4) × Л]
(Const1 + 4) х Л |
В задании длины запрет на умножение [] по вкусу |
ARRAY OF ARRAY OF REAL |
×× Д
[х х Д] |
|
Base = RECORD END; |
Основа = (;) |
|
Int = RECORD(Base)
v: INTEGER
END; |
Цел = (: Основа; зн: Ц) |
|
POINTER TO Record |
(↑)Связка
(^)Связка
(НА)Связку |
Скобки указывают на допустимость ()-указателя как значения |
↑Связка
^Связка
НА Связку |
указатель ≠ () |
|
Proc(ptr^) |
Дело(укз↑)
Дело(укз^)
Дело(укз ИЗ) |
|
Val = POINTER TO
RECORD v: CHAR END;
v: Val; |
Зн = (; зн: Л).
зн: ↑Зн. |
Указатель нельзя «прятать» за именем типа |
PROCEDURE Proc(input: INTEGER)
: REAL;
RETURN 1.0 / FLT(input)
END Proc; |
== Дело(ввод: Ц) →
вывод: Д (
вывод = 1.0 / (ввод:Д)
) Дело. |
|
PROCEDURE Do(OUT a: REAL;
VAR b: REAL);
Do(i, r) |
== Дей(→ а, ↔ б: Д)
Дей(→ а, ↔ б)
== Дей(-> а, <-> б: Д)
Дей(->а, <->б)
== Дей(В а, ИВ б: Д)
Дей(В а, ИВ б) |
|
a[b] |
а[б]
а(б) |
|
Module.Declaration |
Раздел`Объявление
Раздел Объявление |
|
record.item |
связка˙часть
связка часть |
|
а # b |
а ≠ б
а # б
а НЕ= б |
|
a >= b |
а ≥ б
а >= б
а Б= б
а БОЛЬШЕ= б |
|
(a <= b) & (b < c) |
а ≤ б < в |
|
a IN set |
а ∈ мнж
а ВО мнж |
|
~(a IN set) |
а ∉ мнж
а ВНЕ мнж |
Встречается в ~4 раза реже |
a IS Type |
а ЭТО Тип |
|
~(a IS Type) |
а НЕ Тип |
Встречается в ~10 раз реже. Может, и не нужно. |
a DIV b |
а ÷ б
а % б |
|
a MOD b |
а |÷| б
а %% б |
|
a * b |
а ∙ б
а * б |
|
a / b |
а / б |
Деление дробей |
set1 + set2 |
мн1 ∪ мн2
мн1 + мн2 |
|
set1 * set2 |
мн1 ∩ мн2
мн1 * мн2 |
|
set1 / set2 |
мн1 ∆ мн2
мн1 / мн2 |
Симметричная разница (побитовое исключительное или) |
b1 & b2 |
п1 ∧ п2
п1 /\ п2
п1 И п2 |
|
b1 OR b2 |
п1 ∨ п2
п1 \/ п2
п1 ИЛИ п2 |
|
ORD(a) FLOOR(a) |
a:Ц |
|
CHR(a) |
a:Л |
|
FLT(a) |
a:Д |
|
ORD(a) - ORD("0") |
а - '0' |
|
CHR(ORD("0") + a) |
'0' + а |
|
y := 1; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2 END |
а∙∙б
а**б
аб |
Возведение в натуральную степень |
LSL(a, b) |
а ∙ 2б |
|
ASR(a, b) |
а ÷ 2б |
|
INC(a) |
a + 1 |
|
DEC(a) |
a - 1 |
|
INCL(s, 2) |
м + {2} |
|
EXCL(s, 3) |
м - {3} |
|
a := b |
а ← б
а <- б
а := б |
|
|
а = б |
Текстуально последнее присваивание в текущей ветке с учётом вложенности |
t := a; a := b; b := t |
а ↔ б а <-> б а :=: б
|
Обмен важен для поддержки уникальных указателей |
IF a THEN
b
ELSIF c THEN
d
ELSE
e
END |
?? а (
б
:? в;
г
::
д
)
ЕСЛИ а (
б
ЛИБО в;
г
ИНОЕ
д
)
|
|
CASE a OF
1, 2: do1
|3..4: do2
END |
??? а (
• 1; 2: дей1
• 3..4 : дей2
🚫
)
??? а (
*. 1 , 2: дей1
*. 3..4 : дей2
(\)
)
ДЛЯ а (
В 1 , 2: дей1
В 3..4 : дей2
(-)
) |
|
WHILE a DO
b
END |
(↺)? а (
б
).
ЦИКЛ а (
б
). |
|
REPEAT
a
UNTIL b; |
(↺) (
а
) ¬б.
ЦИКЛ (
а
) ДО б. |
|
FOR a := b TO c DO
d
END;
FOR a := b TO LEN(c) - 1 DO
d
END |
(↺) а ← б .. в (
г
).
ЦИКЛ а ← б ДО ДЛИНЫ(в) (
г
) |
|
|
|
Склоняемая лексика:
Мо-й-я: (;
массив: [7 x Л].
книга: Книга
)
Мой массив[0] := 00л.
Моя книга = кн2.
В
web-песочнице
доступна трансляция из обычного кода на Обероне в код с экспериментальной лексикой при использовании
недокументированной команды /TO-E1
.
(* Лексика *)
согласная = ( "Б" | "В" | "Г" | "Д" | "Ж" | "З" | "К" | "Л" | "М" | "Н"
| "П" | "Р" | "С" | "Т" | "Ф" | "Х" | "Ц" | "Ч" | "Ш" | "Щ"
| "б" | "в" | "г" | "д" | "ж" | "з" | "к" | "л" | "м" | "н"
| "п" | "р" | "с" | "т" | "ф" | "х" | "ц" | "ч" | "ш" | "щ"
| "Ґ" | "ґ")
[ "Ь" | "ь" | "Ъ" | "ъ" | "’"]
| "Й" | "й".
гласная = "А" | "Е" | "Ё" | "И" | "О" | "У" | "Ы" | "Э" | "Ю" | "Я"
| "а" | "е" | "ё" | "и" | "о" | "у" | "ы" | "э" | "ю" | "я"
| "I" | "Ї" | "Ў" | "Є"
| "і" | "ї" | "ў" | "є".
буква = согласная | гласная.
букваЛат = "A" … "Z" | "a" … "z".
цифра = "0" … "9".
цифраШес = цифра | "Н" | "Е" | "Д" | "Т" | "К" | "П".
имяРус = буква {буква | цифра}.
имяЛат = букваЛат {букваЛат | цифра}.
имя = имяРус | имяЛат.
рц = "`" | " ". (* разделитель цифр *)
триЦифры = цифра цифра цифра.
до3Цифр = цифра [цифра [цифра]].
целоеДес = до3Цифр {рц триЦифры}.
целоеШес = ( цифра цифраШес
| цифра цифраШес цифраШес цифраШес
{ рц цифраШес цифраШес цифраШес цифраШес}
) [" "] "ш".
целое = целоеДес | целоеШес.
дробь = до3Цифр {рц триЦифры } "," {триЦифры рц} до3Цифр ["…"].
число = целое | дробь.
строка = """ {литера} """ | "«" {литера} "»" | "<<" {литера} ">>".
литера = цифра цифраШес [цифраШес цифраШес] "л".
умн = "•".
возв = "••" | "**".
дел = "÷".
ост = "|÷|".
откр = "+".
мш = "<".
бш = ">".
мр = "≤" | "<=".
бр = "≥" | ">=".
нр = "≠" | "#".
это = "ЭТО".
во = "∈" | "В".
вне = "∉" | "ВНЕ".
или = "∨" | "\/" | "ИЛИ".
и = "∧" | "/\" | "И".
не = "¬" | "НЕ".
ссылка0 = "()". (* NIL, null *)
да = "ДА".
нет = "НЕТ".
рро = "`" | " ". (* разделитель между именами раздела и объявления *)
рсп = "˙" | " ". (* разделитель между именами связки и переменной *)
тт = "..".
св = "↑". (* ссылочная стрелка *)
пмн = "∅".
обм = "↔".
очередноеПрисв = "←".
последнееПрисв = "=".
(* Синтаксис *)
ВсёИмя = [ имя (*раздела*) [ рро ] ] имя (*объявления*).
ОбъявИмя = [откр] имя.
Тип = ВсёИмя(*типа*) | Массив | "[" Массив "]"
| Связка | Ссылка | Вид.
Массив = Длина {"×" Длина} "×" Тип.
Длина = (целое | ВсёИмя) { ("+" | "-") (целое | ВсёИмя)}.
Связка = "(" [":" СвязкаОснова ] ";" [Переменные] ")". (* запись, структура *)
СвязкаОснова = ВсёИмя.
Переменные = Поля {"." Поля}.
Поля = ОбъявИмя {"," ОбъявИмя} ":" Тип.
СсылкаИли0 = "(↑)" Связка. (* Ссылка, которая может указывать на () *)
Ссылка = "↑" Связка | СсылкаИли0.
Вид = "ВИД" "(" [";"] Параметры ")" Вывод.
Параметры = [Секция {";" Секция}].
Вывод = ["→" имя ":" ВсёИмя].
ТипПар = ["→" | "↔"].
Секция = ТипПар имя {"," ТипПар имя ":" ФормальныйТип.
ФормальныйТип = ({"×"} ВсёИмя | "[" "×" {"×"} ВсёИмя"]").
ОбъявПерем = списокИмён ":" Тип.
Выражение = Сложение [Отношение Сложение].
Отношение = "=" | нр | мш | мр | бш | бр | (во | вне) | ( это | "НЕ" ).
Сложение = (Слагаемое | ("+" | "-") Множитель) {ОпСложения Слагаемое}.
ОпСложения = "+" | "-" | или.
Слагаемое = Возведение {ОпУмножения Возведение}.
ОпУмножения = умн | "/" | дел | ост | и.
Возведение = Множитель Выражение | Множитель возв Множитель.
Множитель = число | строка | ссылка0 | да | нет | Множество
| Обозначение [ФактическиеПараметры] | "(" Выражение ")" | не Множитель.
Обозначение = ВсёИмя {Подчасть}.
Подчасть = ОтСвязки | ОтМассива | ОтСсылка | Подтип.
ОтСвязки = [рсп] имя.
ОтМассива = "[" Индексы "]".
Индексы = Выражение {"," Выражение}.
ОтСсылка = св.
Подтип = ":" ( ИмяТипа | "(" ИмяТипа ")" ).
ИмяТипа = ВсёИмя.
Множество = "{" [Подмножество {"," Подмножество}] "}".
Подмножество = Выражение [тт Выражение].
ФактическиеПараметры = "(" ФактПар {"," ФактПар} ")".
ФактПар = [ТипПар] Обозначение | Выражение.
Оператор = [Присваивание | Обмен | Изменение | Вызов
| Если | Развилка | Цикл | Провал | Пропуск].
Присваивание = Обозначение (очередноеПрисв | последнееПрисв) Выражение
Изменение = Обозначение ( "+" | "-" | ОпУмножения) Выражение
Обмен = Обозначение обм Обозначение.
Вызов = Обозначение [ФактическиеПараметры].
Операторы = Оператор {"." Оператор}.
Если = "??" Выражение "("
Операторы
{":?" Выражение ";"
Операторы }
["::"
Операторы ]
")".
Развилка = "???" Выражение "("
Ветвь
{Ветвь}
"::"
Операторы
")".
Ветвь = ["•" Метки ":" Операторы].
Метки = Диапазон {"," Диапазон}.
Диапазон = Метка [тт Метка].
Метка = целое | литера | ВсёИмя.
Цикл = "(↺)" Выражение "("
Операторы
{ "?:" Выражение ";"
Операторы }
")"
|
"(↺)" "ДО" Выражение "("
Операторы
")"
|
"(↺)" "("
Операторы
")" [ "ДО" ] Выражение
|
"(↺)" имя очередноеПрисв Выражение ( тт | "ДО" )
Выражение ["ПО" КонстВыражение] "("
Операторы
")"
.
Провал = "🚫"| "(\)".
Пропуск = "_".
Дело = ["=="] ИмяДела "(" [ФормальныеПараметры] ")" Вывод
ТелоДела [ИмяДела].
ИмяДела = имя.
ФормальныеПараметры = ГруппаПар {";" ГруппаПар}.
ГруппаПар = {ФормПар "," ФормПар} ":" ИмяТипа.
ФормПар = [ТипПар] имя.
ТелоДела = "(" Константы Типы Дела Переменные [Операторы] ")".
Константы = {ОбъявКонст "."}.
ОбъявКонст = ОбъявИмя ".=" КонстВыражение.
КонстВыражение = Выражение.
Типы = {ОбъявТип "."}.
ОбъявТип = ОбъявИмя "=" Тип.
Дела = {Дело "."}.
Раздел = "====" ИмяРаздела "("
[Включение]
Константы
Типы
Дела
Переменные
["==" "(" Операторы ")"]
")" [ИмяРаздела] ".".
Включение = "((" ВклРаздел {"," ВклРаздел} "))".
ВклРаздел = [Переименование "="] ИмяРаздела.
Переименование = имя.
ИмяРаздела = имя.
Комментариев нет:
Отправить комментарий