Сегодня 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 дня. Вы можете не сказать, что это проблема.
Мое мнение о том, какой хороший силовой аппарат есть, в Quora (извините, написал ответ там, а не в SO): http://www.quora.com/What-is-the-most-powerful-parser -алгоритм/ответ/Ira-Baxter –