Utilizzando Parsec 3.1
, è possibile analizzare diversi tipi di ingressi:Uso Parsec con data.text
[Char]
conText.Parsec.String
Data.ByteString
conText.Parsec.ByteString
Data.ByteString.Lazy
conText.Parsec.ByteString.Lazy
I non vedo nulla per il modulo Data.Text
. Voglio analizzare il contenuto Unicode senza subire le inefficienze String
. Così ho creato il modulo seguente basata sul modulo 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
- Ha senso farlo?
- È compatibile con il resto dell'API Parsec?
Ulteriori commenti:
ho dovuto aggiungere {-# LANGUAGE NoMonomorphismRestriction #-}
pragma nei miei moduli Analizza per farlo funzionare.
L'analisi Text
è una cosa, costruire un AST con Text
è un'altra cosa. Ho anche bisogno di pack
mia String
prima di ritorno:
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
Sta funzionando OK tranne i moduli 'Text.Parsec.Language' e' Text.Parsec.Token' che sono limitati a 'String'. Posso aggirare questo problema eseguendo la mia tokenizzazione. 'Text.Parsec.Language' è solo un gadget in ogni caso (Mondrian? Qualcuno?). – gawi
Ah! Mi chiedo se possiamo generalizzare quelli a qualsiasi flusso di Char in un modo compatibile con le versioni precedenti. Non sembra difficile, ma dal momento che non uso mai quei moduli non ho buoni casi di test. –