Ответ 1
В настоящее время существуют две широко используемые основные версии Parsec, Parsec 2 и Parsec 3.
Мой совет - просто использовать последнюю версию Parsec 3. Но если вы хотите сделать сознательный выбор, читать дальше.
Новое в Parsec 3
Monad Transformer
Parsec 3 вводит монадный трансформатор ParsecT
, который может использоваться для объединения
синтаксический анализ с другими монадическими эффектами.
Струйные
Хотя Parsec 2 позволяет вам выбрать тип токена (что полезно, когда вы хотите отделить лексический анализ от синтаксического анализа), токены всегда упорядоченных в списки. Список может быть не самой эффективной структурой данных для хранения большие тексты.
Parsec 3 может работать с произвольными потоками - структуры данных со списком
интерфейс. Вы можете определить свои собственные потоки, но Parsec 3 также включает популярные
и эффективная реализация Stream на основе ByteString (для Char
-based
синтаксический анализ), отображаемый через модули Text.Parsec.ByteString
и
Text.Parsec.ByteString.Lazy
.
Причины предпочтения Parsec 2
Меньше требуемых расширений
Дополнительные функции, предоставляемые Parsec 3, не предоставляются бесплатно: реализовать их требуется несколько языковых расширений.
Ни одна из двух версий не является Haskell-2010 (т.е. оба используют расширения), но Parsec 2 использует меньше расширений, чем Parsec 3, поэтому вероятность того, что любой данный компилятор могут компилировать Parsec 2 выше, чем для Parsec 3.
К этому времени обе версии работают с GHC, в то время как Parsec 2 также сообщил, чтобы строить с JHC и входит в состав одной из стандартных библиотек JHC.
Производительность
Первоначально (то есть в версии 3.0) Parsec 3 был значительно медленнее, чем Parsec 2. Однако работа над улучшением производительности Parsec 3 была выполнена, и с версии 3.1 Parsec 3 только немного медленнее, чем Parsec 2 (контрольные показатели: 1, 2).
Уровень совместимости
Было возможно "переопределить" все API Parsec 2 в Parsec 3. Это
уровень совместимости обеспечивается пакетом Parsec 3 под иерархией модулей
Text.ParserCombinators.Parsec
(та же иерархия, которая используется Parsec 2),
в то время как новый API Parsec 3 доступен в иерархии Text.Parsec
.
Это означает, что вы можете использовать Parsec 3 в качестве замены для Parsec 2.