ANTLR или SableCC для реализации DSL?

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

1 ответ

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

дизайн

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

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

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

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

грамматика

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

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

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

Поддержка развития

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

Заключение

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

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

Другие вопросы по тегам