Что лучше, ANTLR или JavaCC?

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

8 ответов

Есть несколько альтернатив, которые вы не должны исключать:

  • JParsec является каркасом комбинатора парсера, который позволяет вам полностью построить ваш парсер из кода.
  • Платформа комбинатора парсера Scala решает аналогичную проблему; однако синтаксис Scala делает все это гораздо более читабельным.
  • Кроме того, есть еще и структура комбинатора синтаксического анализа, созданная Джоном Метскером для его книги " Создание анализаторов с помощью Java"; Я не помню точно, где находится библиотека, но в прошлом она, по крайней мере, распространялась в Интернете. Это решает ту же проблему: вы не определяете грамматику и определения токенов в отдельном файле, не являющемся Java; вместо этого все это Java.
  • Fortress, язык программирования, над которым Sun работает годами, теперь, кажется, основан на этом наборе инструментов: Крысы. У меня не так много информации, но я думаю, что если они используют ее для своего нового языка программирования, у него, вероятно, есть некоторые интересные особенности.

В целом у меня складывается впечатление, что годы генераторов кода прошли. Если бы я был тобой, я бы использовал инструментарий Scala для синтаксического анализатора. По сути, любая IDE, поддерживающая Scala, также "поддерживает" эту среду комбинатора синтаксического анализатора. Производительность хорошая, AFAICT.

Кстати, ANTLR имеет вполне приличную поддержку IDE, как плагин Eclipse (но, возможно, есть кое-что и в IntelliJ - я не помню.) Так что, если вы выберете классический подход определения лексического анализатора и парсера вне Ваш язык, тогда ANTLR должен быть вашим выбором, я думаю. У него самый большой интерес среди разработчиков Java, есть поддержка инструментов, и есть замечательная книга автора ANTLR. Я не думаю, что какой-либо другой инструментарий может заявить об этом.

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

Сказав это, я выполнил проекты с ANTLR и JavaCC и обнаружил, что ANTLR ужасно тяжеловесен для большинства вещей.

Что касается упомянутых вами проблем, я бы предположил, что JavaCC был лучшим выбором. Разработчику Java легче и легче учиться (синтаксис очень похож на обычную Java), документация исчерпывающая, а интеграция с Eclipse адекватна.

ANTLR более полнофункциональный: это гораздо больше из компилятора box box - лексирование, синтаксический анализ, AST, преобразования дерева и генерация кода.

Для JavaCC это гораздо больше генератор Parser, чем компилятор компилятора. Поддержка AST предоставляется через другую библиотеку под названием JJTree.

Конкретное преимущество ANTLR перед JavaCC состоит в том, что он имеет генераторы для языков, отличных от Java. Это может упростить перенос вашего языка в другие места.

Я второй Jamesh выше.

ANTLR более полнофункциональный: это гораздо больше из компилятора box box - лексирование, синтаксический анализ, AST, преобразования дерева и генерация кода.

Для JavaCC это гораздо больше генератор Parser, чем компилятор компилятора. Поддержка AST предоставляется через другую библиотеку под названием JJTree.

Из моего личного опыта вы можете сделать намного больше с ANTLR, включая передачу параметров между правилами и через все подправила, что очень помогает при создании сложного парсера, такого как парсер для C#. Кроме того, переписывание правил тоже классика. Это поможет вам легко отформатировать ваш идеальный AST.

Тем не менее, это действительно тяжело. Для простого проекта вы, вероятно, никогда не будете использовать эти функции. Javacc круче для этого.

Я написал компилятор для CAS-языка, такого как Maple или MuPAD, с SableCC для преобразования этого единственного языка в Maxima (для CAS-Capacity) и LaTeX (для отображения). AST SableCC строго объектно-ориентирован, и его легко расширять для создания языков различий. Если вы хотите скомпилировать язык в несколько языков, просто попробуйте.

Некоторое время назад я не использовал генераторы парсеров, но несколько лет назад, когда я интересовался ими, мне больше всего понравился SableCC. В нем реализованы некоторые интересные идеи относительно генерации объектно-ориентированного синтаксического анализатора, которые могли или не могли быть обнаружены альтернативами.

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