Создание эффективных внешних DSL - PullRequest
11 голосов
/ 19 сентября 2008

Какие у меня есть инструменты для создания настоящего, честного и доброго внешнего DSL. И нет, я не говорю о злоупотреблении Ruby, Boo, XML или другим существующим языком или синтаксисом, я имею в виду РЕАЛЬНЫЙ внешний DSL - мой собственный язык для моих собственных целей.

Я знаю, что разрабатывается несколько языковых рабочих мест, и я слышал о таких вещах, как «Ирония» для .NET. И, конечно, есть ANTLR, Lex / Yaac и т. Д., Но я боюсь, что они слишком сложны для того, что я пытаюсь сделать.

Пожалуйста, расскажите об инструменте DSL Builder, который вы, возможно, использовали или о котором слышали, а также о том, как он помогает и каковы его недостатки.

Ответы [ 7 ]

9 голосов
/ 03 октября 2008

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

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

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

В долгосрочной перспективе я согласен с внутренними и внешними DSL. Я написал внутренний DSL в Boo и мне пришлось изменить синтаксис DSL, чтобы он работал, и это всегда было похоже на хак. Эту же грамматику с использованием Irony.NET или ANTLR было бы так же просто выполнить с большей гибкостью.

У меня есть сообщение в блоге , в котором обсуждаются некоторые варианты. Эта статья посвящена написанию DSL для оценки выражений во время выполнения, но инструменты все те же.

Мой опыт работы с Irony.NET был положительным, и с его помощью было реализовано несколько эталонных языков, которые являются хорошим началом. Если ваш язык прост, его совсем не сложно запустить и запустить. В CodeProject также есть библиотека под названием TinyParser - она ​​действительно интересна, потому что она генерирует синтаксический анализатор как чистый исходный код, что означает, что ваш конечный продукт полностью свободен от любых сторонних ссылок. Я сам этим не пользовался.

8 голосов
/ 19 сентября 2008

Если вы планируете писать автономные DSL, то вы ищете компиляторы - никак не обойтись. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2}. Стив Егге из Righ Programmer Food обобщает ценность умения создавать компиляторы очень хорошо.

Есть много способов начать. Я рекомендую проверить 2 статьи, упомянутые в статье: Хотите написать компилятор? Просто прочитайте эти две статьи . Первый, Давайте создадим компилятор , очень доступен. Он использует Turbo Pascal в качестве языка реализации, но вы можете легко реализовать его на любом другом языке - исходный код очень понятен. Паскаль - простой язык.

Как только вы почувствуете, как все работает и какая терминология используется, я рекомендую углубиться в нечто вроде ANTLR . У ANTLR есть хорошая IDE, ANTLRWorks , которая поставляется с интерпретатором и отладчиком. Он также производит действительно хорошие визуализации ваших грамматик на лету. Я нашел это неоценимым в обучении.

У ANTLR есть несколько хороших учебных пособий, хотя поначалу они могут быть немного сложными. Этот хорош, хотя и против ANTLR 2.0, так что вы можете столкнуться с несовместимостью с более свежей версией (в настоящее время последняя - 3.1).

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

Если вы продолжаете использовать этот подход, вы хотите использовать встраиваемый Лисп. Под Java у вас есть Clojure , диалект Lisp, который безупречно взаимодействует с JVM и его библиотеками. Я не использовал это лично, но это выглядит хорошо. Для Схемы есть GNU Guile , которая лицензирована под LGPL . Для Common Lisp есть ECL , также под LGPL. Оба используют интерфейс C для взаимодействия, поэтому вы можете в значительной степени встроить их в любой другой язык. ECL уникален среди Лиспов тем, что каждая функция Лисп реализована как функция C, так что вы можете написать код на Lisp на C, если хотите (скажем, внутри ваших собственных методов расширений - вы можете создавать функции C, которые работают с объектами Lisp, а потом звоните им из Лиспа). Некоторое время я использую ECL для своего побочного проекта, и мне это нравится. Сопровождающий довольно активен и отзывчив.

4 голосов
/ 19 сентября 2008

Вы действительно должны проверить Ragel . Это структура для встраивания конечных автоматов в ваш обычный исходный код. Ragel поддерживает C, C ++, Objective-C, D, Java и Ruby.

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

Несколько известных проектов, использующих Ragel, Mongrel , отличный рубиновый веб-сервер. И Hpricot , html-парсер на основе ruby, вдохновленный jQuery.

Еще одна замечательная особенность Ragel - это то, как он может генерировать графики graphviz , которые визуализируют ваши конечные автоматы. Ниже приведен пример, взятый из статьи Зеда Шоу о диаграммах состояния Рагеля .

ragel state chart

2 голосов
/ 02 октября 2014

Xtext был построен для этого.

с сайта:

Xtext - это фреймворк для разработки языков программирования и специфичные для домена языки.

Он охватывает все аспекты полной языковой инфраструктуры, от парсеры, через компоновщик, компилятор или интерпретатор для полноценного первоклассного Интеграция Eclipse IDE. Это идет с хорошими значениями по умолчанию для всех этих аспекты и в то же время каждый аспект может быть адаптирован к ваши потребности.

1 голос
/ 25 ноября 2010

Если вы планируете внедрить внешние DSL, Spoofax (http://strategoxt.org/Spoofax) является хорошим языковым рабочим столом для этого. Это основанный на синтаксическом анализаторе текстовый Langauge Workbench, использующий несколько современных технологий, таких как SDF, Stratego. Помимо реализации DSL, вы могли бы получить очень богатые сервисы редактирования, такие как автозавершение кода, представление схемы, intellisense и т. Д. Он использовался для создания нескольких языков, например, http://mobl -lang.org / . Проверьте это, чтобы получить представление о предоставляемой поддержке.

Проект Spoofax поставляется с готовым примером реализации DSL и генератором java-кода. Это может послужить отправной точкой для начала работы с инструментами.

Ниже приведены подробные инструкции по использованию этого языка: http://strategoxt.org/Spoofax/Tour.

Надеюсь, это поможет!

1 голос
/ 30 апреля 2009

Я использую Иронию с хорошими результатами. Самое замечательное в иронии заключается в том, что вы можете легко включить ее в любую среду выполнения, для которой вы будете использовать DSL. Я создаю внешний DSL, который заполняю в семантическую модель, написанную на C #, так что ирония - это здорово. Затем я использую семантическую модель для генерации кода с помощью StringTemplate.

0 голосов
/ 16 сентября 2014

Для серьезных внешних DSL нельзя избежать проблемы с анализом; ANTLR - это наименьшее из того, что вам нужно. То, что вы хотите проверить, - это системы преобразования программ, которые можно использовать для отображения произвольного синтаксиса DSL на целевые языки, такие как Java.

См. http://en.wikipedia.org/wiki/Program_transformation

...