Выбор синтаксического анализатора Haskell

Существует много открытых полученных реализаций синтаксического анализатора, доступных нам в Haskell. Парсек, кажется, стандарт для текстового парсинга, и attoparsec, кажется, популярный выбор для двоичного парсинга, но я не знаю много кроме того. Существует ли конкретное дерево решений, за которым Вы следуете для выбора реализации синтаксического анализатора? Вы узнали что-либо интересное о преимуществах или слабых местах библиотек?

31
задан Keith 19 June 2010 в 20:57
поделиться

4 ответа

У вас есть несколько хороших вариантов.

Для упрощенного синтаксического анализа типов String:

Для синтаксического анализа упакованной байтовой строки, например из заголовков HTTP .

Для реальных двоичных данных большинство людей используют либо:

  • двоичные - для ленивого двоичного анализа
  • cereal - для строгого двоичного синтаксического анализа

Главный вопрос, который нужно задать вы сами какой тип строки?

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

Второй вопрос, который следует задать: есть ли у меня грамматика для этого типа данных? Если это так, я могу просто использовать happy

И, очевидно, для пользовательских типов данных существует множество хороших существующих парсеров:

51
ответ дан 27 November 2019 в 21:57
поделиться

Просто добавлю к сообщению Дона: Лично мне очень нравится Text.ParserCombinators.ReadP (часть базы) за серьезные, быстрые и простые вещи. Особенно, когда Парсек кажется излишним.

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

11
ответ дан 27 November 2019 в 21:57
поделиться

Bryan O'Sullivan's blog post What's in a parser? Attoparsec rewired (2/2) включает хороший эталон производительности, сравнивающий несколько реализаций, а также некоторые комментарии, сравнивающие использование памяти.

3
ответ дан 27 November 2019 в 21:57
поделиться

Недавно я перевел часть кода из Parsec в Attoparsec. Обе программы достаточно функциональны.

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

4
ответ дан 27 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: