Вопрос

Какие инструменты есть у меня для создания настоящего, честного внешнего DSL.И нет, я не говорю о злоупотреблении Ruby, Boo, XML или другим существующим языком или синтаксисом, я имею в виду НАСТОЯЩИЙ внешний DSL — мой собственный язык для моих собственных целей.

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Несколько примечательных проектов, использующих Ragel: дворняга, отличный веб-сервер Ruby.И Гибрикос, html-парсер на основе Ruby, вдохновленный jQuery.

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

ragel state chart

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

С веб-сайта:

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

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

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

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

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

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

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

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

Видеть http://en.wikipedia.org/wiki/Program_transformation

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top