Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

  • JParsec - это структура комбинатора парсера, которая позволяет полностью построить ваш синтаксический анализатор из кода.
  • Scala структура комбинатора парсеров рассматривает аналогичную проблему; однако синтаксис Scala делает все это более читаемым.
  • Затем также была создана рамка комбинатора парсеров, сделанная Джоном Мецкером, для его книги Building Parsers With Java; Я не помню точно, где находится библиотека, но в прошлом она по крайней мере плавала в Интернете. Он затрагивает ту же проблему: вы не определяете свои определения грамматики и токена в отдельном файле, отличном от Java; вместо этого все это Java.
  • Крепость, язык программирования, над которым Sun работает уже много лет, похоже, основывается на этом наборе инструментов: Rats. У меня мало информации, но я считаю, что если они используют его для своего нового языка программирования, у него, вероятно, есть интересные функции.

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

ANTLR более полно представлена: это намного больше из компилятора поля компилятор - лексинг, разбор, АСТ, дерево преобразований и генерации кода.

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

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

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

Ответ 8

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