使用Parsec 3.1
,可以解析几种类型的输入:
[Char]
与Text.Parsec.String
Data.ByteString
与Text.Parsec.ByteString
Data.ByteString.Lazy
与Text.Parsec.ByteString.Lazy
我没有看到
Data.Text
模块的任何内容。我想解析Unicode内容而不遭受String
效率低下的困扰。因此,我基于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
附加评论:
我必须在解析模块中添加
{-# LANGUAGE NoMonomorphismRestriction #-}
pragma才能使其正常工作。解析
Text
是一回事,用Text
构建AST是另一回事。在返回之前,我还需要pack
我的String
: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
最佳答案
看起来正是您需要执行的操作。
它应该与Parsec的其余部分兼容,包括Parsec.Char解析器。
如果您使用Cabal生成程序,请在软件包描述中添加parsec-3.1的上限,以防维护人员决定将该实例包含在Parsec的 future 版本中。
关于haskell - 将Parsec与Data.Text一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4064532/