Существует много открытых полученных реализаций синтаксического анализатора, доступных нам в Haskell. Парсек, кажется, стандарт для текстового парсинга, и attoparsec, кажется, популярный выбор для двоичного парсинга, но я не знаю много кроме того. Существует ли конкретное дерево решений, за которым Вы следуете для выбора реализации синтаксического анализатора? Вы узнали что-либо интересное о преимуществах или слабых местах библиотек?
У вас есть несколько хороших вариантов.
Для упрощенного синтаксического анализа типов String:
Для синтаксического анализа упакованной байтовой строки, например из заголовков HTTP .
Для реальных двоичных данных большинство людей используют либо:
Главный вопрос, который нужно задать вы сами какой тип строки?
Это решение в основном определяет, какой набор инструментов синтаксического анализатора вы будете использовать.
Второй вопрос, который следует задать: есть ли у меня грамматика для этого типа данных? Если это так, я могу просто использовать happy
И, очевидно, для пользовательских типов данных существует множество хороших существующих парсеров:
Просто добавлю к сообщению Дона: Лично мне очень нравится Text.ParserCombinators.ReadP (часть базы) за серьезные, быстрые и простые вещи. Особенно, когда Парсек кажется излишним.
Для версии с байтовой строкой существует библиотека bytestringreadp, но она не охватывает байтовые строки Char8, и я подозреваю, что на данном этапе лучше выбрать attoparsec.
Bryan O'Sullivan's blog post What's in a parser? Attoparsec rewired (2/2) включает хороший эталон производительности, сравнивающий несколько реализаций, а также некоторые комментарии, сравнивающие использование памяти.
Недавно я перевел часть кода из Parsec в Attoparsec. Обе программы достаточно функциональны.
Attoparsec выигрывает по производительности и занимаемой памяти, но Parsec лучше сообщает об ошибках и имеет более полную документацию.