Подтвердить что ты не робот

Лучший дизайн для генерации кода из АСТ?

Я работаю над довольно сложным DSL, который я хочу скомпилировать на несколько языков высокого уровня. Весь процесс был учебным опытом. Компилятор написан в java.

Мне было интересно, знает ли кто-нибудь о лучшей практике для разработки части генератора кода. В настоящее время все анализируется в абстрактное синтаксическое дерево.

Я думал об использовании системы шаблонов, но я еще не исследовал это направление слишком далеко, так как я хотел бы сначала услышать некоторую мудрость из.

Спасибо!

4b9b3361

Ответ 1

Когда я делал это снова в своем классе языков программирования, мы закончили использование эмиттеров на основе следующего Visitor. Он работал очень хорошо - делает перенацеливание его на новые языки вывода довольно простым, если ваш AST соответствует тому, что вы печатаете достаточно хорошо.

Ответ 2

То, что вы действительно хотите, это которая отображает структуры синтаксиса на одном языке (ваш DSL) в синтаксические шаблоны в других langauges, Такой инструмент может выполнять произвольные преобразования (редуцирование дерева обобщает строковые перезаписи, которые являются системами Post, которые являются полнофункциональными Turing) во время проекта генерации кода, что означает, что то, что вы генерируете, и насколько сложный процесс генерации определяется только вашими амбициями, а не с помощью свойств структуры кода кода.

Сложные системы преобразования программ объединяют различные типы областей измерения, анализа потока и/или пользовательские анализаторы для обеспечения трансакций. Это не добавляет никакой теоретической силы, но это добавляет много практической силы: большинство реальных языков (даже DSL) имеют пространства имен, управление и поток данных, требуют ввода типа и т.д. И т.д.

Наш DMS Software Reengineering Toolkit - это тип системы трансформации. Он использовался для анализа/преобразования как обычных языков, так и DSL для простых и сложных языков, а также для небольших, больших и даже огромных программных систем.

Относится к комментариям OP о "превращении AST в другие языки" , что выполняется DMS путем записи преобразований, которые отображают поверхностный синтаксис для DSL (реализованный за кулисами его DSL AST) для синтаксиса поверхности для целевого языка (реализовано с использованием АСТ ASTT). Полученная целевая langauge AST затем красиво печатается автоматически DMS, чтобы обеспечить фактический исходный код на целевом языке, который соответствует целевому AST.

Ответ 3

Если вы уже используете ANTLR и у вас готовый AST, вы можете взглянуть на StringTemplate: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

Также раздел 9.6 Окончательный ANTLR Reference: создание доменных языков объясняет это: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

Образцы свободного кода доступны в http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz. В коде подпапки\templates\generator\2pass\вы найдете пример преобразования математических выражений в java-байт-код.

Ответ 4

DSL - хорошая вещь. И писать их - хорошая практика.

Но я не уверен, что реализация вашего собственного YACC и тому подобного - хороший выбор в 2010 году, если только это не просто для удовольствия или образования.

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

Используя Groovy, например, вы можете реализовать свои маленькие и большие DSL очень легко и приятно. BTW Groovy построил АСТ-манипуляцию api.