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, когда он будет завершен.
Ответы
Ответ 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. Но я не знаю, что было бы лучше.
Лучшим подходом к выяснению этого было бы использование упрощенной версии грамматики, попробуйте обеими способами и оценить различия.