palexisru
@palexisru

Компиляторы компиляторов с модульным описанием языка?

Прошу подсказать, знакомы ли читателям версии компилятора компиляторов в исходниках, которые можно будет перетащить в .NET (или на JVM), и которые поддерживают модульное описание и позволят разбирать как императивные, так и функциональные языки.


Предполагаемая область использования — подготовка учебных языков программирования

Модульное описание синтаксиса pl2-rainbow.livejournal.com/1090.html


Идея: в примерах, которые я встречал, описание калькулятора (анализатор арифметических выражений) отдельно, другие языки отдельно. При этом анализатор арифметики является частью практически любого языка и может быть вынесен в подключаемый модуль описания языка.


В 1999 делал описание языка, которое проходило на TP YACC (Albert Graef), но описание приходилось делать в 15 файлах четырех категорий, которые сливались с помощью copy перед подачей на вход yacc.

Каскадные национальные языки программирования pl2-rainbow.livejournal.com/301.html


Идея: возможность последовательного перевода с языка народности на русский, затем на английский, затем трансляция в байт код (или машинный)

Основание: программа, написанная на национальном языке может быть проверена преподавателем на русском по листингу соответствующего уровня.

Для реализации достаточно использовать словарь времени компиляции — #define, вынесенные в отдельный специализированнный файл с указанием контекстов переводимого — пространство имен, класс, метод, параметр метода.


Тема национальных языков поднималась в статье habrahabr.ru/post/176243/


Предполагаемые области видимости и группы операторов для порожденного языка:
functional — Функциональное — для разделов, использующих функциональное программирование.
aspect — Аспектное — для интерфесов и аспектов. Для методов могут указываться необходимые свойства и дополнения, используемые перед
predicate — Логичное — соответствует Булевым переменным, доказательству теорем, Аристотелевкой логике, работе с запросами SQL, LINQ или простейшим операциям Prolog.
controller — Управляющее — соответствует контроллеру (Controller) модели MVC
publish — Изменяемое — соответствует представлению (View) для модели MVC
public — Соединяющее — соответствует модели базы данных (Model) модели MVC
protected — Защищенное — внутренние элементы класса
private — Внутреннее — скрытые элементы класса
local — Блоковые — переменные методов и блоков

(из habrahabr.ru/post/176249/ — Абстрактность и модель взаимодействия открытых систем)


Спасибо.
  • Вопрос задан
  • 4091 просмотр
Решения вопроса 1
risik
@risik
Программист
Если я правильно понял о чем Вы говорите, то может Вам поможет пре-процессинг до lex/yacc. Скажем m4.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
palexisru
@palexisru Автор вопроса
Спасибо за уточнение.
У меня «в желании» самораскручивающийся компилятор с переведенным на него же компилятором компиляторов.

При этом основным видом является императивный язык (близкий к C# и Java), но в таком же синтаксисе предполагается функциональная часть. Захват/освобождение памяти — неявные, без указателей. Если LL позволит обработку преффиксного декремента/инкремента, то и его хватит.

Однако, когда экспериментировал с переносом слов в русском языке — выявил, что поиск слогов лучше идет справа налево с выбором максимальной цепочки групп согласных из списка. Возможно, LR более естественен для русского языка.

Так же учил сына учить стихи: Последняя строчка. Предпоследняя и последняя.Предпрепоследняя, предпоследняя и последняя…

Посмотрел на список алгоритмов, используемый в компиляторах и в функциональном программировани (Филд, П. Харрисон Функциональное программирование: Пер. с англ. — М.: Мир, 1993) — они подозрительно совпадают. Возможно, я не прав, но проверить на соответствие стоит.

F# в чистом виде трогать не хочется, разве что понадобится для промежуточных версий.

Возмножно, получится компилятор компиляторов сделать с помощью только самого языка программирования (с другим по сравнению lex+yacc) разделением, без выделения BNF в отдельные файлы (чем можно обеспечить и модульность описания)

Понимаю, что звучит хуже самоката, но основная идея — проверить описательную полноту туннельного моделирования в применении к языкам программирования. Возможно, удастся выбрать подмножество оберточных классов, достаточное для учебных языков, которое будет одинаково плохо работать и на .NET, и на JVM.
Из опыта:
1991г. — разработка на C утилиты, которая выбирала из bat команды управления меню, и строила меню на экране с возвратом выбора через errorlevel
1992 г. — разработка файла описания поля ввода на Clipper — с генерацией промежуточного файла — для ускорения считывания в память
1992г. — изготовление на C из калькулятора Страуструпа генератора расчетных работ (без массивов) с XBase-подобным языком. Метод рекурсивного спуска.
1993г. — библиотеки на C для использования в Clipper

Далее — в основном не законченные разработки в направлении системы:
библиотека наследования классов в Clipper 5
мастера для Delphi
сквозная система на метаописании БД для Clipper, FoxPro 2, Delphi, PHP
описание для транслятора COBOL-подобного языка с хранением таблиц описания BNF, ключевых слов и переменных в файлах DBase

Для меня таблицы переходов конечных автоматов — так и просятся в реляционные БД. Но на СУБД завязываться не хочу — видимо буду делать с файлами данных или XML, или HTML. Зато, если заработает — какой простор для оптимизации!

Спасибо. С уважением, Алексей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы