Лучший дизайн для генерации кода из AST? - PullRequest
20 голосов
/ 04 февраля 2010

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

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

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

Спасибо!

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

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

6 голосов
/ 06 февраля 2010

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

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

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

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

3 голосов
/ 28 мая 2010

Если вы уже используете 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.

0 голосов
/ 04 февраля 2010

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

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

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

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

...