Sử dụng Parsec 3.1
, người ta có thể phân tích một số loại nguyên liệu đầu vào:Sử dụng Parsec với Data.Text
[Char]
vớiText.Parsec.String
Data.ByteString
vớiText.Parsec.ByteString
Data.ByteString.Lazy
vớiText.Parsec.ByteString.Lazy
tôi không thấy bất kỳ điều gì cho mô-đun Data.Text
. Tôi muốn phân tích cú pháp nội dung Unicode mà không bị sự thiếu hiệu quả của String
. Vì vậy, tôi đã tạo các module sau đây dựa trên các mô-đun 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
- Nào thì nên làm như vậy?
- Điều này tương thích với phần còn lại của API Parsec?
ý kiến bổ sung:
tôi đã có thêm {-# LANGUAGE NoMonomorphismRestriction #-}
pragma trong module phân tích cú pháp của tôi để làm cho nó làm việc.
Phân tích cú pháp Text
là một điều, việc xây dựng AST với Text
là một việc khác. Tôi cũng sẽ cần phải pack
String
tôi trước khi quay trở lại:
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
Nó hoạt động OK ngoại trừ các mô-đun 'Text.Parsec.Language' và' Text.Parsec.Token' được giới hạn ở 'Chuỗi'. Tôi có thể giải quyết vấn đề đó bằng cách thực hiện mã thông báo của riêng tôi. 'Text.Parsec.Language' chỉ là một tiện ích (Mondrian? Ai?). – gawi
Ah! Tôi tự hỏi liệu chúng ta có thể khái quát hóa chúng với bất kỳ luồng Char nào theo cách tương thích ngược hay không. Nó không có vẻ khó, nhưng vì tôi không bao giờ sử dụng những mô-đun đó, tôi không có bất kỳ trường hợp thử nghiệm nào tốt. –