Добрый день, Саша!
On Thu, Nov 14, 2024 at 3:14 PM Александр Коновалов
a.v.konovalov87_AT_mail.ru <[email protected]> wrote:
> Не представляю синтаксис для этой цели, кроме того, который я приводил выше
>
Я тоже не представляю, на самом деле. У меня есть только смутные наброски
наподобие вот такого:
/*
* t.Token ::=
* (t.Pos Ident e.Name)
* | (t.Pos Const e.Value)
* | (t.Pos Let)
* | (t.Pos Assign)
* | …
* t.PureToken ::=
* (Ident e.Name)
* | (Const e.Value)
* | Let
* | Assign
* | …
*/
/* Линза преобразует список термов t.Token к списку t.PureToken */
Purify {
(t.Pos Let) e.Rest = Let <Purify e.Rest>;
(t.Pos Assign) e.Rest = Assign <Purify e.Rest>;
...
(t.Pos e.Data) e.Rest = (e.Data) <Purify e.Rest>;
}
/* Демонстрация вызова парсера с применением линзы */
CallParser {
e.Tokens = <Purify | Parse e.Tokens>;
/* Вызов функции с линзой -- единственное расширение синтаксиса */
}
/* Парсер принимает список термов t.PureToken */
Parse {
Let (Ident e.Name) Assign e.Expr
, <IsDeclared e.Name>: T
= ERROR (Ident e.Name) ': redefinition of variable';
/* Если парсер вызвали с линзой Purify, то на выходе
из функции Parse терм (Ident e.Name) преобразуется
обратно в (t.Pos Ident e.Name) */
...
}