Создание простого предметно-ориентированного языка - PullRequest
6 голосов
/ 24 августа 2011

Мне интересно узнать о создании предметно-ориентированного языка. На данный момент домен довольно простой, просто есть некоторые переменные и запустить несколько циклов, если операторы.

Редактировать: язык будет отличаться от английского с очень простым синтаксисом.

Я имею в виду нацеливание на виртуальную машину Java, то есть компиляцию в байт-код Java.

В настоящее время я знаю, как написать несколько простых грамматик, используя ANTLR.

Я знаю, что ANTLR создает лексер и парсер, но как мне двигаться дальше?

  • о семантическом анализе: его нужно писать вручную или есть инструменты для его создания?
  • как преобразовать вывод лексера и анализатора в байт-код Java?
  • Я знаю, что есть такие библиотеки, как ASM или BCEL, но какова точная процедура?
  • Есть ли рамки для этого? А если есть, то какой самый простой?

Ответы [ 3 ]

6 голосов
/ 24 августа 2011

Вам следует попробовать Xtext , набор инструментов DSL на основе Eclipse. Версия 2 довольно мощная и стабильная. С его домашней страницы у вас есть много ресурсов для начала работы, включая некоторые видеоуроки. Поскольку экосистема Eclipse основана на Java, она кажется вам лучшим выбором.

Вы также можете попробовать MPS , но это проекционный редактор, и новичкам может быть труднее. Тем не менее, он не менее мощный, чем Xtext.

2 голосов
/ 24 августа 2011

Если ваша цель состоит в том, чтобы узнать как можно больше о компиляторах, то вам действительно нужно идти трудным путем - написать специальный анализатор (без antlr и т. П.), Написать свои собственные семантические проходы и собственную генерацию кода.

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

1 голос
/ 30 октября 2011

DSL с простым синтаксисом может означать или не означать простую семантику.

Простая семантика может означать или не означать простой перевод на целевой язык;такие переводы «технически просты», только если DSL и целевой язык имеют много общих типов данных и моделей исполнения.(Системы ограничений имеют простую семантику, но перевести их на Фортран действительно сложно!).(Вы должны задаться вопросом: если перевод вашего DSL прост, зачем он у вас есть?)

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

Однако есть много очевидного, что может оказаться полезным:

  • Сильный механизм синтаксического анализа (кто хочет поиграться с грамматиками, структура которых вызвана слабостью механизма синтаксического анализа? (Если вы не знаете, что это такое, прочитайте, например, грамматику LL (1)).
  • Автоматическое построение представления (например, абстрактного синтаксического дерева) проанализированного DSL
  • Возможность доступа / изменения / построения новых AST
  • Возможность сбора информации о символах иих значение (таблицы символов)
  • Способность строить анализы AST для DSL, поддерживать переводы, для которых требуется информация из «далеко» в дереве, влиять на перевод в определенной точке дерева
  • Способность легко реорганизовать AST для достижения локальной оптимизации
  • Способность строить / анализ cинформация о контроле и потоке данных, если DSL имеет некоторые процедурные аспекты, а генерация кода требует глубоких рассуждений или оптимизации

Большинство инструментов, доступных для «создания DSL-генераторов», предоставляют некоторый вид синтаксического анализа, возможно, построения дерева, а затем оставить вас, чтобы заполнить все остальное.Это дает вам возможность иметь небольшой чистый DSL, но для его реализации требуется вечность.Это не хорошо.Вы действительно хотите всю эту инфраструктуру.

В нашем DMS Software Reengineering Toolkit есть вся инфраструктура, описанная выше и многое другое.(Это явно не, и не может иметь луну).Вы можете увидеть полный, "все-в-одном-", "1029 * простой пример DSL", который использует некоторые неинтересные части этого механизма .

...