使用Parsec 3.1
,可以解析几种类型的输入:使用秒差距与Data.Text
[Char]
与Text.Parsec.String
Data.ByteString
与Text.Parsec.ByteString
Data.ByteString.Lazy
与Text.Parsec.ByteString.Lazy
我没有看到Data.Text
模块的任何内容。我想解析Unicode内容而不会受到效率低下的影响。所以我创建基于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
是一回事,建立一个AST与Text
是另一回事。我还需要回归前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
除了限制为String的'Text.Parsec.Language'和'Text.Parsec.Token'模块,它工作正常。我可以通过执行我自己的标记来解决这个问题。无论如何,“Text.Parsec.Language”只是一个小工具(蒙德里安?任何人?)。 – gawi 2010-11-02 01:17:41
啊!我想知道我们是否能以向后兼容的方式推广到任何字符流。它看起来不难,但因为我从来没有使用这些模块,所以我没有任何好的测试用例。 – 2010-11-04 16:04:42