En utilisant Parsec 3.1
, il est possible d'analyser plusieurs types d'entrées:Utilisation de parsec avec data.text
[Char]
avecText.Parsec.String
Data.ByteString
avecText.Parsec.ByteString
Data.ByteString.Lazy
avecText.Parsec.ByteString.Lazy
I ne vois rien pour le module Data.Text
. Je veux analyser le contenu Unicode sans souffrir des inefficacités String
. J'ai donc créé le module suivant basé sur le module Text.Parsec.ByteString
:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Text.Parsec.Text
(Parser, GenParser
) where
import Text.Parsec.Prim
import qualified Data.Text as T
instance (Monad m) => Stream T.Text m Char where
uncons = return . T.uncons
type Parser = Parsec T.Text()
type GenParser t st = Parsec T.Text st
- Est-il logique de le faire?
- Est-ce compatible avec le reste de l'API Parsec?
Autres commentaires:
je devais ajouter dans mes {-# LANGUAGE NoMonomorphismRestriction #-}
pragma modules parse pour le faire fonctionner.
Analyser Text
est une chose, la construction d'un AST avec Text
est une autre chose. Je vais aussi devoir pack
mon String
avant le retour:
module TestText where
import Data.Text as T
import Text.Parsec
import Text.Parsec.Prim
import Text.Parsec.Text
input = T.pack "xxxxxxxxxxxxxxyyyyxxxxxxxxxp"
parser = do
x1 <- many1 (char 'x')
y <- many1 (char 'y')
x2 <- many1 (char 'x')
return (T.pack x1, T.pack y, T.pack x2)
test = runParser parser() "test" input
Cela fonctionne correctement sauf pour les modules 'Text.Parsec.Language' et' Text.Parsec.Token' qui sont limités à 'String'. Je peux contourner ce problème en effectuant ma propre tokenisation. 'Text.Parsec.Language' est juste un gadget de toute façon (Mondrian? – gawi
Ah! Je me demande si nous pouvons généraliser ceux-ci à n'importe quel flux de Char de manière rétrocompatible. Ça n'a pas l'air dur, mais comme je n'utilise jamais ces modules, je n'ai pas de bons cas de test. –