使用Parsec 3.1,可以解析几种类型的输入:

  • [Char]Text.Parsec.String
  • Data.ByteStringText.Parsec.ByteString
  • Data.ByteString.LazyText.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
    

    最佳答案

    看起来正是您需要执行的操作。

    它应该与Parsec的其余部分兼容,包括Parsec.Char解析器。

    如果您使用Cabal生成程序,请在软件包描述中添加parsec-3.1的上限,以防维护人员决定将该实例包含在Parsec的 future 版本中。

    关于haskell - 将Parsec与Data.Text一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4064532/

    10-11 22:34