使用Parsec 3.1,可以解析几种类型的输入:
[Char]和Text.Parsec.StringData.ByteString和Text.Parsec.ByteStringData.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