使用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