Проблемы - документация / обучаемость, интеграция с eclipse, инструменты, поддержка сообщества и производительность (примерно в таком порядке).
Что лучше, ANTLR или JavaCC?
Ответы (8)
Есть несколько альтернатив, которые нельзя исключать:
- JParsec - это структура комбинатора синтаксического анализатора, которая позволяет вам создавать синтаксический анализатор полностью из кода.
- Структура комбинатора синтаксического анализатора Scala решает аналогичную проблему; однако синтаксис Scala делает все это гораздо более читаемым.
- Также существует структура комбинатора синтаксического анализатора, созданная Джоном Мецкером для его книги Создание парсеров с помощью Java Я не помню, где именно находится библиотека, но в прошлом она, по крайней мере, ходила по Интернету. Он решает ту же проблему: вы не определяете свою грамматику и определения токенов в отдельном файле, отличном от Java; вместо этого все это Java.
- Fortress, язык программирования, над которым Sun работает в течение многих лет, похоже, основан на этом наборе инструментов: Крысы. У меня не так много информации, но я считаю, что если они используют его для своего нового языка программирования, он, вероятно, имеет некоторые интересные особенности.
В целом складывается впечатление, что годы генераторов кода прошли. Если бы я был вами, я бы использовал инструментарий комбинатора синтаксического анализатора Scala. По сути, любая среда IDE, поддерживающая Scala, также «поддерживает» эту структуру комбинатора синтаксического анализатора. Производительность хорошая, AFAICT.
Кстати, ANTLR имеет довольно приличную поддержку IDE в качестве плагина Eclipse (но, возможно, что-то есть в IntelliJ - я не помню.) Итак, если вы выберете классический подход определения вашего лексического анализатора и парсера вне ваш язык, то я думаю, вы должны выбрать ANTLR. Он пользуется большим успехом среди разработчиков Java, есть поддержка инструментов и есть отличная книга автора ANTLR. Я не думаю, что какой-либо другой инструментарий может утверждать это.
ANTLR имеет более широкие возможности: это гораздо более простой компилятор компилятора - лексика, синтаксический анализ, AST, преобразования дерева и генерация кода.
Для JavaCC это скорее генератор парсера, чем компилятор компилятора. Поддержка AST обеспечивается другой библиотекой под названием JJTree.
Что касается упомянутых вами проблем, я бы предположил, что JavaCC был лучшим выбором. Разработчику Java освоить его быстрее и проще (синтаксис очень похож на синтаксис обычной Java), документация исчерпывающая, а интеграция с Eclipse удовлетворительна.
В первом приближении на практике для вас будет иметь значение, насколько удобны и интуитивно понятны обозначения для ваших глаз.
Сказав это, я работал над проектами с ANTLR и JavaCC и обнаружил, что ANTLR ужасно тяжеловесен для большинства вещей.
Конкретное преимущество ANTLR перед JavaCC заключается в том, что он имеет генераторы для языков, отличных от Java. Это может значительно упростить перенос вашего языка в другие места.
Я второй джамеш выше.
ANTLR имеет более широкие возможности: это гораздо более простой компилятор компилятора - лексика, синтаксический анализ, AST, преобразования дерева и генерация кода.
Для JavaCC это скорее генератор парсера, чем компилятор компилятора. Поддержка AST обеспечивается другой библиотекой под названием JJTree.
По моему личному опыту, вы можете делать гораздо больше с помощью ANTLR, включая передачу параметра между правилами и через все подправила, что очень помогает при создании сложного синтаксического анализатора, такого как синтаксический анализатор для C #. Кроме того, переписывание правила - тоже классика. Это поможет вам легко отформатировать ваш идеальный AST.
Однако это действительно тяжело. В простом проекте вы, вероятно, никогда не воспользуетесь этими функциями. Javacc для этого круче.
Я давно не использовал генераторы парсеров, но несколько лет назад, когда я интересовался ими, мне, как мне показалось, нравился SableCC лучше всего. Он реализовал некоторые интересные идеи относительно генерации объектно-ориентированного парсера, которые могли или не могли быть уловлены альтернативами.
Я написал компилятор для CAS-языка, такого как Maple или MuPAD с SableCC, чтобы преобразовать этот единственный язык в Maxima (для CAS-Capacity) и LaTeX (для отображения). AST SableCC строго объектно-ориентирован, и его легко расширить для создания разных языков. Если вы хотите скомпилировать язык более чем на одном другом языке, просто попробуйте.