2015-02-22 4 views
3

В чем разница между ANTLR и паршированием для синтаксического анализа в Java?ANTLR vs parboiled

  • Какой из них легче использовать для новичка в разборе?
  • Что более масштабируемо? (от простой до сложной грамматики)
  • Какая из них лучше подходит для строительства AST?
  • Что создает сообщения об ошибках или предупреждениях для синтаксических ошибок?
  • У кого меньше проблем, с которыми можно бороться? (Например, влево рекурсии, сдвиг/свёртка, конфликты свёртка/свёртка)
  • Сравнение с другими инструментами с открытым исходным кодом также оценили
+0

Мое мнение о том, какой хороший силовой аппарат есть, в Quora (извините, написал ответ там, а не в SO): http://www.quora.com/What-is-the-most-powerful-parser -алгоритм/ответ/Ira-Baxter –

ответ

2

пропаренный выглядит действительно здорово инструмент. Это может быть проще для новичков, поскольку это просто чистое программирование с использованием идиомы «парсер-комбинатор». Я думаю, что это станет очень многословным и трудным для чтения, хотя грамматика Java выглядит не так уж плохо, что я вижу. Я не могу комментировать его конструкцию AST, но ANTLR 4 генерирует деревья разбора, а не АСТ. Он утверждает, что имеет хорошие сообщения об ошибках/восстановление, но это подозрительно, потому что он основан на грамматиках выражений парсера, которые могут обнаруживать ошибки только после того, как весь вход будет просмотрен (в худшем случае). Он также не может идентифицировать двусмысленности в вашей грамматике (а не конфликты, двусмысленности). Ни один из инструментов не объявляет конфликты разбора. ANTLR 4 обрабатывает прямую левую рекурсию для таких вещей, как арифметические выражения, но в целом ни один инструмент не может обрабатывать левую рекурсию. ANTLR требует, чтобы вы использовали библиотеку для интерпретатора синтаксического анализатора, например parboiled, но вы должны научиться использовать этот инструмент, если хотите, чтобы он генерировал парсеры. В настоящее время ANTLR 4 может генерировать парсеры в Java, C#, JavaScript, Python 2, Python 3.

+0

Трудно возразить против парня ANTLR. Теперь, если появился только паршивый парень ... –

+0

Я подумал, что парсеры для кодов не могут иметь двусмысленности; если бы в контекстно-свободной грамматике существовали такие понятия, то парсеры-селекторы выбирают «первую альтернативу» и берут на себя обязательство. Таким образом, это не так много, как их не обнаруживать, а просто определяя их из существования. –

1

Сегодня Parboiled - это в основном инструмент scala. Итак, если вы используете scala, это может быть лучшим решением для большинства случаев.

Удобство использования

ANTLR должно быть намного проще для начинающих. С этого легче начать.

  • Существует book об ANTLR. Это также хорошо описано в DSLs in action. И он имеет лучшую документацию в целом.
  • Есть плагины ANTLR для разных IDE. Они позволят вам увидеть АСТ и дать вам другую поддержку.

Parboiled - библиотека scala. У вас будут синтаксические блики и тип проверки из коробки. Parboiled1 отлично работает в большинстве IDE. Parbiled2 не будет (скоро будет исправлено в Idea). Библиотека использует макро-выражения, и большинство IDE не устраивает ее. Вот почему у вас будет все красное.

Но оба довольно легко начать с.

  • Вы можете попробовать ANTLR с консоли (пожалуйста, поправьте меня, если я ошибаюсь).
  • Вы можете установить sbt add parboiled как зависимость и играть в консоль scala.

Масштабируемость

На мой взгляд пропаренный более масштабируемым. Потому что вы пишете код scala. Вы можете разложить свой синтаксический анализатор на несколько признаков scala и смешать их друг с другом.Вы можете создать парсер DateTime и смешать его с парсером LogEvent или парсером $ PROTOCOL_NAME. И повторно используйте их легко. Для parboiled1 вы можете делать некоторые непослушные вещи во время выполнения. Ну, это дает вам силу. В некоторых случаях вы можете создавать парсеры на лету. Например, у вас есть формат даты и времени, определенный как строка. Вы можете прочитать строку формата и создать для нее соответствующий синтаксический анализатор. Это возможно даже для Parboiled2 (что делает много вещей во время компиляции). Я не знаю, возможно ли ANTLR.

АСТ

Мне нравится подход пропаренный к AST. Он ожидает, что вы определите ADT. Итак, в идеальном случае у вас будет неизменяемое дерево классов case. вы можете добавить некоторые вещи, похожие на dsl, на ваши узлы дерева. Например, вы можете определить метод «\» для вашего узла, который возвращает дочерний элемент с указанным именем.

case class Node(value: String) { 
    .... 
    def \ (childName: String): Option[Node] = 
    this.children.find(child => child.name == childName) 
} 

, а затем использовать его:

city \ "3rd street" \ "23" 

Это делает работу с AST гораздо проще. Надеюсь, это поможет.

Использование в производстве

  • Если вы используете пропаренный вы должны сделать добавить его в список зависимостей. Это все. У вас будет все, что работает прямо из коробки.
  • Если вы используете ANTLR, сначала необходимо сгенерировать * .java файлы. И восстанавливайте каждый раз, когда вы меняете грамматику. В большинстве случаев грамматика не меняется очень часто. Но по моему опыту у меня были ситуации, когда мы меняли грамматику каждые 2 дня. Вы можете не сказать, что это проблема.

 Смежные вопросы

  • Нет связанных вопросов^_^