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

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


person Jason    schedule 19.12.2008    source источник
comment
и также добавить sablecc   -  person Paraneetharan Saravanaperumal    schedule 03.02.2016


Ответы (8)


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

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

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

person Wilfred Springer    schedule 30.01.2010
comment
обнаружил одно добавление значения parsercc, логика извлечения структуры может выполняться вместе при синтаксическом анализе, что позволяет избежать лишних циклов повторного обращения к дереву синтаксического анализа. по сравнению с антлр - person zinking; 02.12.2015
comment
Их дни закончились, потому что они не остановят вашу разработку из-за бесконечной ошибки переполнения стека? Генераторы синтаксического анализатора проверяют вашу грамматику на предмет левой рекурсии во время компиляции и, более того, открывают вам круговые цепочки при их обнаружении. Теперь вы говорите, что это устарело, и мы должны выбросить его в мусорную корзину. Сколько у вас опыта в создании парсеров, если даже я с почти нулевым опытом понимаю, насколько невозможно справиться с левой рекурсией с помощью комбинаторов парсеров? - person Valentin Tihomirov; 01.01.2016
comment
Комбинаторы синтаксического анализатора могут обнаруживать левую рекурсию только во время выполнения, если вам посчастливилось предоставить неудачный тестовый ввод, а все сообщения об ошибках - это переполнение стека где-то в коде комбинатора синтаксического анализатора (он даже не покажет вам вызовы вашего метода синтаксического анализатора, чтобы понять, что правила могут повторяться) вместо четкой цепочки зависимостей, которую вам предоставляет «устаревшая» технология? - person Valentin Tihomirov; 01.01.2016
comment
Я нашел сборку парсеров с примерами кода Java по адресу xp123.com/oozinoz/bpwj.htm - person Philip Helger; 19.06.2016

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

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

person jamesh    schedule 21.12.2008
comment
JTB (Java Tree Builder) - альтернатива для создания AST. - person Simon Nickerson; 18.05.2009

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

person Daniel    schedule 30.01.2010

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

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

person Charlie Martin    schedule 19.12.2008
comment
Согласовано, ANTLR, похоже, имеет лучшую поддержку инструментов, но JavaCC создает сжатый код, который в среднем компилируется до менее 50 КБ без каких-либо внешних зависимостей .jar. - person Chris; 18.11.2010

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

person SingleNegationElimination    schedule 05.07.2009

Я второй джамеш выше.

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

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

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

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

person Winston Chen    schedule 05.07.2009
comment
передача параметров между правилами и подправилами также поддерживается в javacc - person Abbas Gadhia; 23.11.2012

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

person Suppressingfire    schedule 29.12.2008
comment
Мы использовали модифицированную версию SableCC для курса компилятора в моем университете. У него было несколько действительно интересных функций, которых я не видел в других местах, но я не знаю, сколько из них было нашими локальными расширениями. - person Jørgen Fogh; 29.06.2010

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

person verylazyboy    schedule 19.03.2012