Actuellement, il y a deux largement utilisés versions majeures de Parsec, Parsec 2 et
Parsec 3.
Mon conseil est simplement d'utiliser la dernière version de Parsec 3. Mais si vous voulez
faire un choix conscient, lire sur.
Nouveau en Parsec 3
Monade Transformateur
Parsec 3 introduit une monade transformateur, ParsecT
, qui peut être utilisé pour combiner
l'analyse avec d'autres monadique effets. Pour des exemples de ces combinaisons de voir la
le chapitre sur les transformateurs.
Flux
Bien que Parsec 2 vous permet de choisir le type de jeton (ce qui est utile lorsque vous
voulez séparer l'analyse lexicale à partir de l'analyse), les jetons sont toujours
disposées dans des listes. La liste peut être pas le plus efficace structure de données pour stocker
les textes de grands.
Parsec 3 pouvez travailler avec de l'arbitraire des flux -- structures de données sous forme de liste
de l'interface. Vous pouvez définir vos propres cours d'eau, mais Parsec 3 comprend également un populaire
et efficace des Flux de mise en œuvre, basé sur ByteString (pour Char
-en fonction
analyse syntaxique), exposée par les modules d' Text.Parsec.ByteString
et
Text.Parsec.ByteString.Lazy
.
Les raisons de préférer Parsec 2
Moins extensions nécessaires
Fonctionnalités avancées fournies par Parsec 3 ne sont pas gratuits: pour les mettre en œuvre
plusieurs extensions de langage sont nécessaires.
Aucune des deux versions est Haskell-2010 (c'est à dire à la fois l'utilisation des extensions), mais
Parsec 2 utilise moins d'extensions de Parsec 3, si les chances que tout compilateur
pouvez compiler Parsec 2 sont plus élevés que ceux de Parsec 3.
Par ce temps, les deux versions de travail avec GHC, tout en Parsec 2 est également signaléà
construire avec JHC et est inclus comme l'un des JHC des librairies standard.
Performance
À l'origine (c'est à dire de la version 3.0) Parsec 3 a été beaucoup plus lent que
Parsec 2. Cependant, le travail sur l'amélioration de Parsec 3 performance a été fait,
et à partir de la version 3.1 Parsec 3 est légèrement plus lent que Parsec 2
(repères: 1, 2).
La couche de compatibilité
Il a été possible de "ré-écrire" tous les Parsec 2 API en Parsec 3. Cette
la couche de compatibilité est assurée par le Parsec 3 paquet dans le module de la hiérarchie
Text.ParserCombinators.Parsec
(la même hiérarchie qui est utilisé par Parsec 2),
alors que la nouvelle Parsec 3 de l'API est disponible sous l' Text.Parsec
de la hiérarchie.
Cela signifie que vous pouvez utiliser Parsec 3 que d'une baisse-dans le remplacement pour Parsec 2.