Scala парсер комбинаторы против ANTLR / Java генерируется парсер? - PullRequest
25 голосов
/ 16 мая 2011

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

ANTLR профи

  1. Хорошо известно
  2. Fast
  3. Внешний DSL
  4. ANTLRWorks (отличная IDE для отладки / тестирования грамматики синтаксического анализатора)

Недостатки ANTLR

  1. на основе Java (взаимодействие с Scala может быть сложным, есть опыт?)
  2. Требуется большая зависимость во время выполнения

Плюсы комбинатора Parser

  1. Часть Scala
  2. Oneменьше шаг сборки
  3. Нет необходимости во времени выполнения;например, уже включен в библиотеку времени выполнения Scala

Минусы комбинатора синтаксического анализатора

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

Есть мысли?

РЕДАКТИРОВАТЬ: Этот анализатор выражений анализирует алгебраические / математические выражения.Он будет использован в приложении Magnificalc для Android после его завершения.

Ответы [ 4 ]

16 голосов
/ 16 мая 2011

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

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

6 голосов
/ 18 мая 2011

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

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

2 голосов
/ 24 декабря 2015

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

0 голосов
/ 16 мая 2011

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

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

...