На данный момент существует две широко используемые основные версии Parsec, Parsec 2 и Parsec 3.
Мой совет - просто использовать последнюю версию Parsec 3. Но если вы хотите сделать осознанный выбор, читайте дальше.
Новое в Parsec 3
Monad Transformer
Parsec 3 представляет монадный преобразователь ParsecT
, который можно использовать для объединения анализа с другими монадическими эффектами..
Потоки
Хотя Parsec 2 позволяет вам выбрать тип токена (что полезно, если вы хотите отделить лексический анализ от анализа), токены всегда располагаются в списках.Список может быть не самой эффективной структурой данных для хранения больших текстов.
Parsec 3 может работать с произвольными потоками - структурами данных с интерфейсом, подобным списку.Вы можете определять свои собственные потоки, но Parsec 3 также включает в себя популярную и эффективную реализацию Stream на основе ByteString (для синтаксического анализа Char
), предоставляемую через модули Text.Parsec.ByteString
и Text.Parsec.ByteString.Lazy
.
Reasonsпредпочитать 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 уже выполнена,d с версии 3.1 Parsec 3 лишь немного медленнее, чем Parsec 2 (тесты: 1 , 2 ).
Уровень совместимости
Имеетбыло возможно «переопределить» весь API Parsec 2 в Parsec 3. Этот уровень совместимости предоставляется пакетом Parsec 3 в иерархии модулей Text.ParserCombinators.Parsec
(та же иерархия, которая используется в Parsec 2), а новый Parsec 3API доступен в иерархии Text.Parsec
.
Это означает, что вы можете использовать Parsec 3 в качестве замены для Parsec 2.