Лучший дизайн для того, чтобы сгенерировать код от AST?

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

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

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

Спасибо!

20
задан Sam Washburn 4 February 2010 в 18:03
поделиться

4 ответа

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

9
ответ дан 30 November 2019 в 01:18
поделиться

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

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

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

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

6
ответ дан 30 November 2019 в 01:18
поделиться

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

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

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

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

-1
ответ дан 30 November 2019 в 01:18
поделиться

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

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

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

3
ответ дан 30 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

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