Выбор парсера Haskell - PullRequest
       10

Выбор парсера Haskell

31 голосов
/ 20 июня 2010

В Хаскеле есть много открытых реализаций парсера . Parsec кажется стандартом для разбора текста, а attoparsec , кажется, популярным выбором для двоичного разбора, но я не знаю многого из этого.Есть ли конкретное дерево решений, которое вы используете для выбора реализации парсера?Вы узнали что-нибудь интересное о сильных или слабых сторонах библиотек?

Ответы [ 4 ]

51 голосов
/ 20 июня 2010

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

Для облегченного анализа типов String:

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

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

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

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

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

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

11 голосов
/ 20 июня 2010

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

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

4 голосов
/ 21 июня 2010

Я недавно преобразовал некоторый код из Parsec в Attoparsec.Оба вполне способны.

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

3 голосов
/ 20 июня 2010

Сообщение в блоге Брайана О'Салливана Что в парсере?Attoparsec rewired (2/2) включает в себя хороший тест производительности, сравнивающий несколько реализаций, а также некоторые комментарии, сравнивающие использование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...