Аркадий!

Извините, что я Вас перепутал с Андреем.

Андрей!

Согласен, мультискобки можно писать и так. Но бывают идиомы, где с правым 
сопоставлением просто удобнее. Например, у меня давно крутится мысль 
формализации идиомы ручного синтаксического анализа типа «перенос-свёртка» на 
Рефале.

Когда-нибудь, я думаю, об этом напишу в рассылку. Обычно вручную пишут 
синтаксический анализ для LL(1)-языков — известная идиома рекурсивного спуска. 
А для LR(1)-языков используют специальные инструменты вроде Bison, поскольку 
вручную составлять таблицу чрезвычайно трудоёмко. А на Рефале можно описывать 
разбор некоторых LR(1)-грамматик вручную практически также прозрачно, как на 
Паскале рекурсивным спуском. А вот рекурсивный спуск на Рефале сравнительно 
неудобен.

Но это я отвлёкся, тема синтаксического анализа требует очередного длинного 
письма, которое мало кто осилит прочитать.

 

С уважением,
Александр Коновалов

 

From: Andrei Klimov <[email protected]> 
Sent: Wednesday, August 8, 2018 7:10 PM
To: [email protected]
Subject: Re: Реализация REFAL/js в online варианте (Google Cloud/VDS/standalone 
javascript)

 

Александр, добрый вечер!

 

2018-08-08 16:05 GMT+03:00 Yandex Mail <[email protected] 
<mailto:[email protected]> >:

Андрей!

 

Спасибо за обращение ко мне, но вам писал Аркадий.😉

 

А в чём смысл такого ограничения на e-переменные? По-моему, оно большого 
упрощения не даёт, а только затрудняет программирование. 

 

Это вопрос вкуса, но здесь я к вам присоединюсь: не вижу большого смысла 
формально минимизировать и экономить народные байты и такты.

 

В частности, сквозной проход по скобочному выражению («мультискобки») уже так 
красиво не напишется.

 

А вот тут не соглашусь. Есть несколько вариантов представлений мультискобок. С 
точки зрения "красоты" они эквивалентны и в зависимости от задачи можно брать, 
что удобнее. Вот как можно запрограммировать проход по выражению при 
ограничениях Аркадия:

 

Travers {

  eA = <T () () (eA) ()>;

}

 

T {

  ()        (eC) ()          () = eC

  (eL)      (eC) (sA eB  ) (eR) = <T (eL)   (eC sA) (eB)      (eR)>;

  (eL)      (eC) ((eA) eE) (eR) = <T ((eL) eC))  () (eA) ((eE) eR)>;

  ((eL) eD) (eC) ()   ((eE) eR) = <T (eL) (eD (eC)) (eE)      (eR)>;

}

 

Здесь:

*       eL – левая мультискобка
*       eC, eD – просмотренные части текущего (Current) и предыдущего уровня
*       eE – хвост за правой скобкой (End)
*       eR – правая мультискобка

Андрей

Ответить