Skip to content

Сделать этот репозиторий фреймворком #5

@Mazdaywik

Description

@Mazdaywik

Мотивация

Рефал исходно создавался как «метаалгоритмический язык» — язык для преобразования программ на других языках:

  • Турчин В. Ф. Метаязык для формального описания алгоритмических языков // В сборнике: Цифровая вычислительная техника и программирование. М.: Советское радио, 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.

Задачи

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions