Аркадий! Извините, что я Вас перепутал с Андреем.
Андрей! Согласен, мультискобки можно писать и так. Но бывают идиомы, где с правым сопоставлением просто удобнее. Например, у меня давно крутится мысль формализации идиомы ручного синтаксического анализа типа «перенос-свёртка» на Рефале. Когда-нибудь, я думаю, об этом напишу в рассылку. Обычно вручную пишут синтаксический анализ для 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 – правая мультискобка Андрей
