Мотивация
Рефал исходно создавался как «метаалгоритмический язык» — язык для преобразования программ на других языках:
- Турчин В. Ф. Метаязык для формального описания алгоритмических языков // В сборнике: Цифровая вычислительная техника и программирование. М.: Советское радио, 1966, с. 116–119.
- Турчин В. Ф. Метаалгоритмический язык // Кибернетика № 4, 1968, с. 116−124.
В частности, объектом преобразования программ могут быть программы на Рефале тоже. (Примером того является этот репозиторий в текущей редакции — cdf26e7.) А это значит, нужны библиотечные средства для (а) разбора программ на Рефале и (б) генерации программ на Рефале.
Одно из таких библиотечных средств есть — библиотека prefal, разработанная Андреем Немытых:
ftp://ftp.botik.ru/pub/local/scp/refal5/bin/prefal_180216.zip
Но я (@Mazdaywik) не нахожу её удовлетворительной, поскольку (а) писал её не я 😊, (б) её интерфейс далёк от совершенства. В частности, синтаксические ошибки выводятся на stderr (причём в нестандартном формате), само дерево не сохраняет позиции лексем исходного текста. Однако, сильной стороной библиотеки является сохранение комментариев.
Я начинал попытку сделать такой фреймворк на базе Рефала-05:
но от этой идеи отказался (Mazdaywik/Refal-05#33). Причина в том, что парсер несовместимого диалекта не нужен.
Цель
Цель — разработать на базе этого репозитория фреймворк для преобразования программ на Рефале.
Фреймворк должен включать в себя
- средства анализа (лексер, парсер),
- средства синтеза (pretty printer), он уже есть —
Plainer.ref,
- вспомогательные инструменты для преобразования программ,
- библиотеку
LibraryEx, адаптированную к классическому Рефалу-5.
Все компоненты должны быть совместимы с Рефалом-05 — недопустимы имена, различающиеся знаками - и _, для каждого используемого идентификатора должна быть определена функция (обычная функция или *$ENUM/*$EENUM) и т.д. Условия и блоки использовать можно, поскольку (а) уже есть трансформер в базисный Рефал, (б) эти конструкции могут появиться и в Рефале-05.
Front-end должен сохранять как минимум псевдокомментарии (начинающиеся на *$), back-end их должен печатать. Поддержка сохранения всех комментариев в парсере на начальном этапе не требуется.
Вспомогательные инструменты — это, собственно, то, что сейчас называется Transformer.ref и функция NewName в нём. Система эквивалентных преобразований хорошо проработана только для ограниченного Рефала — подмножества базисного подмножества, где в образцах запрещены открытые e-переменные и повторные e- и t-переменные. Поэтому при написании программ, использующих такие преобразования, нужны инструменты автоматического преобразования кода к подмножеству.
Библиотека LibraryEx доказала (мне) своё удобство на практике, предлагается перетащить её из Рефала-05 сюда. Если путь к фреймворку будет лежать в переменной REF5RSL (а он там должен лежать), то всегда будет удобно использовать LibraryEx.
Задачи
Мотивация
Рефал исходно создавался как «метаалгоритмический язык» — язык для преобразования программ на других языках:
В частности, объектом преобразования программ могут быть программы на Рефале тоже. (Примером того является этот репозиторий в текущей редакции — cdf26e7.) А это значит, нужны библиотечные средства для (а) разбора программ на Рефале и (б) генерации программ на Рефале.
Одно из таких библиотечных средств есть — библиотека
prefal, разработанная Андреем Немытых:ftp://ftp.botik.ru/pub/local/scp/refal5/bin/prefal_180216.zip
Но я (@Mazdaywik) не нахожу её удовлетворительной, поскольку (а) писал её не я 😊, (б) её интерфейс далёк от совершенства. В частности, синтаксические ошибки выводятся на
stderr(причём в нестандартном формате), само дерево не сохраняет позиции лексем исходного текста. Однако, сильной стороной библиотеки является сохранение комментариев.Я начинал попытку сделать такой фреймворк на базе Рефала-05:
но от этой идеи отказался (Mazdaywik/Refal-05#33). Причина в том, что парсер несовместимого диалекта не нужен.
Цель
Цель — разработать на базе этого репозитория фреймворк для преобразования программ на Рефале.
Фреймворк должен включать в себя
Plainer.ref,LibraryEx, адаптированную к классическому Рефалу-5.Все компоненты должны быть совместимы с Рефалом-05 — недопустимы имена, различающиеся знаками
-и_, для каждого используемого идентификатора должна быть определена функция (обычная функция или*$ENUM/*$EENUM) и т.д. Условия и блоки использовать можно, поскольку (а) уже есть трансформер в базисный Рефал, (б) эти конструкции могут появиться и в Рефале-05.Front-end должен сохранять как минимум псевдокомментарии (начинающиеся на
*$), back-end их должен печатать. Поддержка сохранения всех комментариев в парсере на начальном этапе не требуется.Вспомогательные инструменты — это, собственно, то, что сейчас называется
Transformer.refи функцияNewNameв нём. Система эквивалентных преобразований хорошо проработана только для ограниченного Рефала — подмножества базисного подмножества, где в образцах запрещены открытые e-переменные и повторные e- и t-переменные. Поэтому при написании программ, использующих такие преобразования, нужны инструменты автоматического преобразования кода к подмножеству.Библиотека
LibraryExдоказала (мне) своё удобство на практике, предлагается перетащить её из Рефала-05 сюда. Если путь к фреймворку будет лежать в переменнойREF5RSL(а он там должен лежать), то всегда будет удобно использоватьLibraryEx.Задачи
Transformer.refбиблиотекой.LibraryEx.