Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) (Новая страница: «;{{SpeakerInfo}}: {{Speaker|Даниил Исакевич}} <blockquote> </blockquote> {{VideoSection}} {{vimeoembed||800|450}} {{youtubelink|}} {{SlidesSectio…») |
StasFomin (обсуждение | вклад) |
||
;{{SpeakerInfo}}: {{Speaker|Даниил Исакевич}} <blockquote> Показаны примеры использования Рефала-М для преобразования текстов на формальных языках: автоматического построения ДРАКОНовских диаграмм (редактор <tt>drakon</tt>) из псевдокода и наборов формул предложенного автором языка в виде схем-графов (пакет <tt>graphviz</tt>). Уделено внимание организации программы и программирования, возникающим ситуациям и приёмам. </blockquote> {{VideoSection}} {{vimeoembed||800|450}} {{youtubelink|}} {{SlidesSection}} [[File:Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf|left|page=-|300px]] {{----}} == Thesis == === Введение === Рефал — язык, созданный для написания программ, пишущих программы. Его наличие поощряет создание языков под своё понимание и нужные классы задач. Часто перевод с одного формального языка высокого уровня на другой более низкого уровня осуществим достаточно быстро. Выходной язык низкого уровня может быть достаточной для решения задачи частью более богатого языка, сделанного кем-то другим. Среди востребованных задач такого рода — построение содержательной графики. === Укрощение drakon'а === Автоматизация формирования ДРАКОНовских диаграмм понадобилась из-за того, что для редактора <tt>drakon</tt> диаграмма — лишь куча графических элементов; он не имеет представления об их связях, и при редактировании диаграмма «расползается». А результат (штук пятнадцать красивых картинок) понадобился если не послезавтра, то хотя бы на следующей неделе. Поэтому было решено прекратить тесное общение с <tt>drakon</tt>ом, скормив ему готовые диаграммы. Файл <tt>имя.drn</tt>, в котором <tt>drakon</tt> хранит диаграммы, является базой данных SQLite и может быть создан последовательностью SQL-запросов; собственно диаграммы и графические элементы создаются <tt>INSERT</tt>-ами в соответствующие таблицы. Для описания диаграмм человеком создан язык, позволяющий вводить последовательности действий, выделять и именовать блоки кода, в том числе ветвления с проверкой условия и циклы с переменной-счётчиком. Краткое описание синтаксиса языка: <pre> текст ::= строка переводстроки текст | конецфайла строка ::= описаниешага `//' комментарии | описаниешага комментарии ::= комментарий `//' комментарии | комментарий описаниешага ::= заголовок `{' | `}' | описаниедействия заголовок ::= условие `?' | перем `=' нач `:' кон | названиеблокакода </pre> Псевдокод на этом языке переводится в SQL-запросы Рефал-программой<ref name="Drakoder"><i>Исакевич Д.</i> Преобразователь псевдокода в диаграммы ДРАКОН. https://gitflic.ru/project/dvisa/drakoder</ref> за три основных этапа (каждый этап — несколько более мелких шагов): # Ввод текста, распознавание и преобразование его структуры # Размещение блоков на диаграммах # Дорисовка соединительных линий и вывод SQL-запросов Для размещения графических элементов потребовалось вычислять их размеры и координаты. Координаты <m>X</m> зависят от вложенности блоков кода и удобнее вычисляются, если программа представлена как лес. Координаты <m>Y</m> на диаграмме вычисляются в порядке следования по программе как плоскому списку. === От набора формул к схеме === Другая задача — перевод набора формул ЯСП (описан в отдельном докладе) в команды языка <tt>dot</tt> пакета <tt>graphviz</tt>. Перевод выполняется Рефал-программой<ref name="Metahim"><i>Исакевич Д.</i> Преобразователь формул ЯСП в схемы GraphViz. https://gitflic.ru/project/dvisa/metahim</ref>. Основные его этапы: # Ввод и разбор формул и построение леса, перевод выражений в префиксную форму # Выделение представляющих интерес общих подвыражений # Представление леса как списка узлов (корни и листья именованы) и дуг # Склейка одноимённых узлов # Нумерация узлов, формирование команд выходного языка. === Замечания о программировании === Последовательность преобразований реализована функцией <pre> ЦепьПреобразований { .вхарг (.прочие (?функция .допарг)) = <Mu ?функция .допарг <ЦепьПреобразований .вхарг (.прочие)»; .вхарг () = .вхарг; } </pre> — используя которую удобно наращивать цепочку вызовов; порядок вызовов слева направо, поэтому код сохраняет читаемость. Особое внимание уделяется построению плана преобразований, одни из которых изменяют структуру данных в целом, а другие обрабатывают локальные ситуации (обычные или особые). Документирование такой программы — отдельная задача. Чтобы хорошо выделить модули, лучше решать несколько похожих задач. Поэтому сейчас модули выделены только для ЯСП. При расчётах размеров и координат терм нагружается подтермами, и было бы удобно искать значения по «ключу» — что требует реализовать функцию поиска. Сейчас такой функции нет, и программист следит за расположением подтермов сам. {{----}} [[File:{{#setmainimage:Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024)!.jpg}}|center|640px]] {{LinksSection}} <!-- <blockquote>[©]</blockquote> --> * https://gitflic.ru/project/strusov/refal-machine * https://gitflic.ru/project/dvisa/drakoder * https://gitflic.ru/project/dvisa/metahim <references/> [[Категория:OSSDEVCONF-2024]] [[Категория:Open-source projects]] [[Категория:Draft]] |
Версия 05:48, 23 октября 2024
- Докладчик
- Даниил Исакевич
Показаны примеры использования Рефала-М для преобразования текстов на формальных языках: автоматического построения ДРАКОНовских диаграмм (редактор drakon) из псевдокода и наборов формул предложенного автором языка в виде схем-графов (пакет graphviz).
Уделено внимание организации программы и программирования, возникающим ситуациям и приёмам.
Содержание
Видео
Презентация
Thesis
Введение
Рефал — язык, созданный для написания программ, пишущих программы. Его наличие поощряет создание языков под своё понимание и нужные классы задач. Часто перевод с одного формального языка высокого уровня на другой более низкого уровня осуществим достаточно быстро.
Выходной язык низкого уровня может быть достаточной для решения задачи частью более богатого языка, сделанного кем-то другим.
Среди востребованных задач такого рода — построение содержательной графики.
Укрощение drakon'а
Автоматизация формирования ДРАКОНовских диаграмм понадобилась из-за того, что для редактора drakon диаграмма — лишь куча графических элементов; он не имеет представления об их связях, и при редактировании диаграмма «расползается».
А результат (штук пятнадцать красивых картинок) понадобился если не послезавтра, то хотя бы на следующей неделе. Поэтому было решено прекратить тесное общение с drakonом, скормив ему готовые диаграммы.
Файл имя.drn, в котором drakon хранит диаграммы, является базой данных SQLite и может быть создан последовательностью SQL-запросов; собственно диаграммы и графические элементы создаются INSERT-ами в соответствующие таблицы.
Для описания диаграмм человеком создан язык, позволяющий вводить последовательности действий, выделять и именовать блоки кода, в том числе ветвления с проверкой условия и циклы с переменной-счётчиком. Краткое описание синтаксиса языка:
текст ::= строка переводстроки текст | конецфайла строка ::= описаниешага `//' комментарии | описаниешага комментарии ::= комментарий `//' комментарии | комментарий описаниешага ::= заголовок `{' | `}' | описаниедействия заголовок ::= условие `?' | перем `=' нач `:' кон | названиеблокакода
Псевдокод на этом языке переводится в SQL-запросы Рефал-программой[1] за три основных этапа (каждый этап — несколько более мелких шагов):
- Ввод текста, распознавание и преобразование его структуры
- Размещение блоков на диаграммах
- Дорисовка соединительных линий и вывод SQL-запросов
Для размещения графических элементов потребовалось вычислять их размеры и
координаты. Координаты зависят от вложенности блоков кода и удобнее вычисляются,
если программа представлена как лес. Координаты на диаграмме вычисляются
в порядке следования по программе как плоскому списку.
От набора формул к схеме
Другая задача — перевод набора формул ЯСП (описан в отдельном докладе) в команды языка dot пакета graphviz. Перевод выполняется Рефал-программой[2].
Основные его этапы:
- Ввод и разбор формул и построение леса, перевод выражений в префиксную форму
- Выделение представляющих интерес общих подвыражений
- Представление леса как списка узлов (корни и листья именованы) и дуг
- Склейка одноимённых узлов
- Нумерация узлов, формирование команд выходного языка.
Замечания о программировании
Последовательность преобразований реализована функцией
ЦепьПреобразований { .вхарг (.прочие (?функция .допарг)) = <Mu ?функция .допарг <ЦепьПреобразований .вхарг (.прочие)»; .вхарг () = .вхарг; }
— используя которую удобно наращивать цепочку вызовов; порядок вызовов слева направо, поэтому код сохраняет читаемость.
Особое внимание уделяется построению плана преобразований, одни из которых изменяют структуру данных в целом, а другие обрабатывают локальные ситуации (обычные или особые). Документирование такой программы — отдельная задача.
Чтобы хорошо выделить модули, лучше решать несколько похожих задач. Поэтому сейчас модули выделены только для ЯСП.
При расчётах размеров и координат терм нагружается подтермами, и было бы удобно искать значения по «ключу» — что требует реализовать функцию поиска. Сейчас такой функции нет, и программист следит за расположением подтермов сам.
Примечания и ссылки
- https://gitflic.ru/project/strusov/refal-machine
- https://gitflic.ru/project/dvisa/drakoder
- https://gitflic.ru/project/dvisa/metahim
- ↑ Исакевич Д. Преобразователь псевдокода в диаграммы ДРАКОН. https://gitflic.ru/project/dvisa/drakoder
- ↑ Исакевич Д. Преобразователь формул ЯСП в схемы GraphViz. https://gitflic.ru/project/dvisa/metahim