Avec Parsec 3.1, il est possible d'analyser plusieurs types d'entrées :
-
[Char]
conText.Parsec.String
-
Data.ByteString
conText.Parsec.ByteString
-
Data.ByteString.Lazy
conText.Parsec.ByteString.Lazy
Je ne vois rien pour le Data.Text
module. Je veux analyser le contenu Unicode sans souffrir de l'inconvénient de l'utilisation de l'outil d'analyse des données. String
les inefficacités. J'ai donc créé le module suivant, basé sur le module Text.Parsec.ByteString
module :
{-# 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
- Cela a-t-il un sens de le faire ?
- Est-ce compatible avec le reste de l'API Parsec ?
Commentaires supplémentaires :
J'ai dû ajouter {-# LANGUAGE NoMonomorphismRestriction #-}
pragma dans mes modules d'analyse syntaxique pour que cela fonctionne.
Analyse syntaxique Text
est une chose, construire une AST avec Text
est une autre chose. Je devrai aussi 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