Scala комбинаторы парсеров против ANTLR/Java, созданного парсером? - программирование
Подтвердить что ты не робот

Scala комбинаторы парсеров против ANTLR/Java, созданного парсером?

Я пишу парсер выражений для приложения, написанного в основном в Scala. Я построил объекты AST в Scala, и теперь вам нужно написать синтаксический анализатор. Я слышал о Scala встроенных комбинаторах парсеров, а также ANTLR3, и мне интересно: что обеспечило бы лучшую производительность и удобство написания кода? До сих пор:

Преимущества ANTLR

  • Известное
  • Fast
  • Внешний DSL
  • ANTLRWorks (отличная среда IDE для отладки/тестирования грамматического парсера)

ANTLR cons

  • На основе Java (Scala interop может быть сложно, любой опыт?)
  • Требуется большая зависимость во время выполнения

Parser combinator pros

  • Часть Scala
  • Еще один шаг сборки
  • Нет необходимости в зависимости от времени выполнения; например уже включен в библиотеку времени Scala

Комбинировщик парсера

  • Внутренняя DSL (может означать медленное выполнение?)
  • Нет ANTLRWorks (обеспечивает хорошие функции анализа и визуализации парсера)

Любые мысли?

EDIT: Этот синтаксический анализатор анализирует выражения алгебраического/исчисления. Он будет использоваться в приложении Magnificalc для Android, когда он будет завершен.

4b9b3361

Ответ 1

Компиляторы парсера

Scala не очень эффективны. Они не были предназначены. Они хороши для выполнения небольших задач с относительно небольшими затратами.

Так что это действительно зависит от ваших требований. Между ANTLR не должно быть проблем с взаимодействием. Вызов Scala из Java может быть волосатым, но вызов Java из Scala почти всегда работает.

Ответ 2

Я бы не стал беспокоиться о ограничениях производительности комбинаторов парсеров, если вы не планируете анализировать алгебраические выражения, которые составляют несколько страниц. В книге программирования Scala упоминается, что более эффективная реализация комбинаторов парсеров возможна. Может быть, кто-то найдет время и энергию, чтобы написать его.

Я думаю, что с ANTLR вы говорите о двух дополнительных шагах сборки: ANTLR компилируется в Java, и вам нужно скомпилировать как Scala, так и Java для байт-кода, а не просто Scala.

Ответ 3

Я создал внешние DSL как с ANTLRv4, так и с компиляторами Scalas parser, и я явно предпочитаю комбинаторы парсеров, потому что вы получаете отличную поддержку редактора при разработке языка, и очень легко преобразовать результаты анализа в любую структуру данных класса АСТ. Разработка ANTLR-грамматик занимает гораздо больше времени, потому что даже при поддержке редактора ANTLRWorks разработка грамматик очень подвержена ошибкам. Весь рабочий процесс ANTLR выглядит довольно раздутым для меня по сравнению с одним комбинатором синтаксического анализатора.

Ответ 4

Я был бы склонен попытаться создать внешний DSL с использованием комбинаторов парсера. Он не должен быть внутренним DSL. Но я не знаю, что было бы лучше.

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