Используя 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
- Имеет ли смысл делать это?
- Это совместимо с остальной частью API Parsec?
Дополнительные комментарии:
Мне пришлось добавить {-# LANGUAGE NoMonomorphismRestriction #-}
pragma в мои модули синтаксического анализа, чтобы он работал.
Разбор Text
- это одно, а построение AST с Text
- это еще одна вещь. Мне также понадобится pack
my 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