ANTLR или SableCC для реализации DSL? - PullRequest
2 голосов
/ 16 декабря 2011

Кто-нибудь использовал оба языка для реализации языка и может сравнивать их, указывая на сильные и слабые стороны?Я ищу инструмент RAD с поддержкой генерации кода AST Walker.SableCC - это LALR и, следовательно, поддерживает «левую рекурсию», тогда как ANTLR - это LL (*).Это важно для типовых грамматик или DSL?Мне также нужно провести некоторый предметно-ориентированный анализ.(Целевым языком моего компилятора будет OpenCL C).Так как это будет для студенческого проекта, важно, чтобы я не терял столько времени на утомительную сторону, то есть на реализацию Front-End языка.

1 Ответ

1 голос
/ 31 июля 2012

Я не могу много сказать о ANTLR, но, возможно, немного информации о SableCC.

Дизайн

Он генерирует синтаксический анализатор, в котором сгенерированный код и рукописный код четко разделены с использованием шаблона Visitor, и интегрирует преобразование из дерева конкретного синтаксиса в абстрактный синтаксисДерево.В результате конструктор может получить AST после того, как синтаксический анализатор успешно проанализирует ввод, и он может пройтись по дереву и выполнить действие на соответствующих узлах.

Дизайнер может сначала написать и отладить свою грамматику, попытаться оптимизироватьпреобразование из конкретного синтаксического дерева в абстрактное синтаксическое дерево.После того, как у него есть твердый AST, он может написать код действия в отдельном классе.Таким образом, разработчик пишет грамматику только один раз и может написать несколько типов действий для грамматики, например один раз для подсветки синтаксиса, один раз для семантического анализа и генератора кода.Я сделал это в продуктивной системе.Это работает очень хорошо.

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

Другим аспектом может быть поддержка IDE.Поскольку в SableCC вы разделили код, вы можете легко использовать функцию автозаполнения IDE.

грамматика

SableCC - это генератор синтаксического анализатора LR (1), поэтомуIMO проще написать грамматику для ANTLR, который является генератором синтаксического анализатора LL (k) (без уловки).Я думаю (aber не уверен) SableCC - единственный генератор Lava (1) java-парсера, который так популярен.

парсер вывода

ANTLR может генерировать парсер вмного языков, в то время как SableCC может генерировать синтаксический анализатор только в Java (основной поток).Есть некоторый плагин / адаптер для генерации парсера на другом языке, однако, по словам автора (http://www.mare.ee/indrek/sablecc/) они слишком старые. SableCC 4 может генерировать больше, но он находится в бета-версии, что не рекомендуется для серьезных проектов.

Поддержка разработки

ANTLR - это среда разработки для написания грамматики. Это ANTLRWorks, которая может визуально отображать грамматику, перемещаться по источнику (как переход к определению токена или продукции). SableCC: неттакие инструменты. Есть примитивный скрипт Syntax Highlight для VIM и плохой плагин для функций Netbeans.

Заключение

IMO Я думаю, что для большого проекта требуется долгосрочное обслуживание SableCCболее подходит, чем ANTLR.

У Мартина Фаулера есть информация о SableCC, вы можете найти его здесь. http://martinfowler.com/bliki/HelloSablecc.html

...