В чем разница между Text.ParserCombinators.Parsec и Text.Parsec - PullRequest
42 голосов
/ 17 мая 2011
Text
    Text.Parsec
        Text.Parsec.ByteString
            Text.Parsec.ByteString.Lazy
        Text.Parsec.Char
        Text.Parsec.Combinator
        Text.Parsec.Error
        Text.Parsec.Expr
        Text.Parsec.Language
        Text.Parsec.Perm
        Text.Parsec.Pos
        Text.Parsec.Prim
        Text.Parsec.String
        Text.Parsec.Token
    ParserCombinators
        Text.ParserCombinators.Parsec
            Text.ParserCombinators.Parsec.Char
            Text.ParserCombinators.Parsec.Combinator
            Text.ParserCombinators.Parsec.Error
            Text.ParserCombinators.Parsec.Expr
            Text.ParserCombinators.Parsec.Language
            Text.ParserCombinators.Parsec.Perm
            Text.ParserCombinators.Parsec.Pos
            Text.ParserCombinators.Parsec.Prim
            Text.ParserCombinators.Parsec.Token

Они одинаковы?

Ответы [ 2 ]

40 голосов
/ 18 мая 2011

На данный момент существует две широко используемые основные версии 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.

18 голосов
/ 17 мая 2011

Я считаю, что последний является обратно-совместимым уровнем для Parsec 2, реализованным в рамках более нового API.

...