使用
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 #-}
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
Text
输入(问题的前半部分)。many
与char
、noneOf
等仍然只返回String
,因此如果您需要Text
输出(问题的后半部分),则仍需根据此处的描述自行进行打包。如有错误请指正! - Heath Raftery