使用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
- 这样做有意义吗?
- 它与 Parsec API 的其余部分兼容吗?
补充评论:
我必须在我的解析模块中添加{-# LANGUAGE NoMonomorphismRestriction #-}
编译指示才能使其工作。
解析Text
是一回事,构建 ASTText
是另一回事。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