Страницы

суббота, 1 апреля 2023 г.

Экспериментальная версия лексики

В качестве эксперимента попробовал взглянуть на Оберон с совершенно другой лексикой.

Из особенностей можно отметить

  • С одной стороны большая направленность на кириллицу и набор из кириллических раскладок.
  • С другой стороны уклон в интернационализацию с помощью значков и уменьшения зависимости от естественной лексики.
  • И даже использование юникод-символов с целью приближения к математическим символам.
  • Но с возможностью обойтись легкодоступными символами в альтернативном варианте.
  • Увеличение ясности ряда элементов.

ПРЕДУПРЕЖДЕНИЕ: при наличии высокой чувствительности и лёгкой травмируемости лучше избежать дальнейшего просмотра.

Такой код на Обероне:
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.71828182845904523536 2,718`281`828`459`045`235`36… 2,718 281 828 459 045 235 36_ Приблизительное значение дроби
{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 (* x0n = xi * y *) 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) м += {1}
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 | да | нет | Множество | Обозначение [ФактическиеПараметры] | "(" Выражение ")" | не Множитель. Обозначение = ВсёИмя {Подчасть}. Подчасть = ОтСвязки | ОтМассива | ОтСсылка | Подтип. ОтСвязки = [рсп] имя. ОтМассива = "[" Индексы "]". Индексы = Выражение {"," Выражение}. ОтСсылка = св. Подтип = ":" ( ИмяТипа | "(" ИмяТипа ")" ). ИмяТипа = ВсёИмя. Множество = "{" [Подмножество {"," Подмножество}] "}". Подмножество = Выражение [тт Выражение]. ФактическиеПараметры = "(" ФактПар {"," ФактПар} ")". ФактПар = [ТипПар] Обозначение | Выражение. Оператор = [Присваивание | Обмен | Вызов | Если | Развилка | Цикл | Провал | Пропуск]. Присваивание = Обозначение (очередноеПрисв | последнееПрисв) Выражение. Обмен = Обозначение обм Обозначение. Вызов = Обозначение [ФактическиеПараметры]. Операторы = Оператор {"." Оператор}. Если = "??" Выражение "(" Операторы {":?" Выражение ";" Операторы } ["::" Операторы ] ")". Развилка = "???" Выражение "(" Ветвь {Ветвь} "::" Операторы ")". Ветвь = ["•" Метки ":" Операторы]. Метки = Диапазон {"," Диапазон}. Диапазон = Метка [тт Метка]. Метка = целое | литера | ВсёИмя. Цикл = "(↺)" ( "?" Выражение "(" Операторы {"?:" Выражение; Операторы } ")" | "(" Операторы ")" "?" Выражение | имя очередноеПрисв Выражение ( тт | "ДО" ) Выражение ["ПО" КонстВыражение] "(" Операторы ")" ). Провал = "🚫"| "(\)". Пропуск = "_". Дело = ["=="] ИмяДела "(" [ФормальныеПараметры] ")" Вывод ТелоДела [ИмяДела]. ИмяДела = имя. ФормальныеПараметры = ГруппаПар {";" ГруппаПар}. ГруппаПар = {ФормПар "," ФормПар} ":" ИмяТипа. ФормПар = [ТипПар] имя. ТелоДела = "(" Константы Типы Дела Переменные [Операторы] ")". Константы = {ОбъявКонст "."}. ОбъявКонст = ОбъявИмя ".=" КонстВыражение. КонстВыражение = Выражение. Типы = {ОбъявТип "."}. ОбъявТип = ОбъявИмя "=" Тип. Дела = {Дело "."}. Раздел = "====" ИмяРаздела "(" [Включение] Константы Типы Дела Переменные ["==" "(" Операторы ")"] ")" [ИмяРаздела] ".". Включение = "((" ВклРаздел {"," ВклРаздел} "))". ВклРаздел = [Переименование "="] ИмяРаздела. Переименование = имя. ИмяРаздела = имя.

Комментариев нет:

Отправить комментарий

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...