Parsec 3.1
Verwendung ist es möglich, verschiedene Arten von Eingaben zu analysieren:Mit Parsec mit data.text
[Char]
mitText.Parsec.String
Data.ByteString
mitText.Parsec.ByteString
Data.ByteString.Lazy
mitText.Parsec.ByteString.Lazy
I sehe nichts für das Modul Data.Text
. Ich möchte Unicode-Inhalt analysieren, ohne die String
Ineffizienzen zu leiden. So habe ich die folgende Modul erstellt auf der Grundlage der Text.Parsec.ByteString
Modul:
{-# 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
- Ist es sinnvoll, dies zu tun?
- Ist dies kompatibel mit dem Rest der Parsec API?
Bemerkungen:
Ich hatte {-# LANGUAGE NoMonomorphismRestriction #-}
Pragma in meiner Parse-Module hinzuzufügen, damit es funktioniert.
Parsing ist eine Sache, ein AST mit Text
Aufbau ist eine andere Sache. Ich muss auch meine String
vor Rückkehr pack
:
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
Es funktioniert OK, außer für die Module 'Text.Parsec.Language' und' Text.Parsec.Token', die auf 'String' beschränkt sind. Ich kann dieses Problem umgehen, indem ich meine eigene Tokenisierung durchführe. 'Text.Parsec.Language' ist sowieso nur ein Gadget (Mondrian? Irgendjemand?). – gawi
Ah! Ich frage mich, ob wir diese auf irgendeinen Char-Stream rückwärtskompatibel verallgemeinern können. Es sieht nicht schwer aus, aber da ich diese Module nie benutze, habe ich keine guten Testfälle. –