Haskell Language
Attoparsec
Recherche…
Introduction
Attoparsec est une bibliothèque d'analyse combinatoire qui "vise particulièrement à traiter efficacement les protocoles réseau et les formats de fichiers texte / binaires compliqués".
Attoparsec offre non seulement la rapidité et l'efficacité, mais aussi un retour en arrière et des entrées incrémentielles.
Son API reflète étroitement celle d'une autre bibliothèque de combineurs d'analyseurs, Parsec.
Il existe des sous-modules pour la compatibilité avec ByteString
, Text
et Char8
. L'utilisation de l'extension de langue OverloadedStrings
est recommandée.
Paramètres
Type | Détail |
---|---|
Parser ia | Le type de base pour représenter un analyseur. i est le type de chaîne, par exemple ByteString . |
IResult ir | Le résultat d'une analyse, avec Fail i [String] String , Partial (i -> IResult ir) et Done ir tant que constructeurs. |
Combinateurs
Le meilleur moyen d’analyser les entrées est d’utiliser des fonctions d’analyse plus larges, composées de fonctions plus petites et plus simples.
Disons que nous voulions analyser le texte suivant qui représente les heures de travail:
Lundi: 0800 1600.
Nous pourrions les diviser en deux "jetons": le nom du jour - "lundi" - et une partie du temps "0800" à "1600".
Pour analyser un nom de jour, nous pourrions écrire ce qui suit:
data Day = Day String day :: Parser Day day = do name <- takeWhile1 (/= ':') skipMany1 (char ':') skipSpace return $ Day name
Pour analyser la partie du temps, nous pourrions écrire:
data TimePortion = TimePortion String String time = do start <- takeWhile1 isDigit skipSpace end <- takeWhile1 isDigit return $ TimePortion start end
Maintenant, nous avons deux analyseurs pour nos parties individuelles du texte, nous pouvons les combiner dans un analyseur "plus grand" pour lire les heures de travail d'une journée entière:
data WorkPeriod = WorkPeriod Day TimePortion work = do d <- day t <- time return $ WorkPeriod d t
puis exécutez l'analyseur:
parseOnly work "Monday: 0800 1600"
Bitmap - Analyse des données binaires
Attoparsec rend l'analyse des données binaires triviale. En supposant ces définitions:
import Data.Attoparsec.ByteString (Parser, eitherResult, parse, take) import Data.Binary.Get (getWord32le, runGet) import Data.ByteString (ByteString, readFile) import Data.ByteString.Char8 (unpack) import Data.ByteString.Lazy (fromStrict) import Prelude hiding (readFile, take) -- The DIB section from a bitmap header data DIB = BM | BA | CI | CP | IC | PT deriving (Show, Read) type Reserved = ByteString -- The entire bitmap header data Header = Header DIB Int Reserved Reserved Int deriving (Show)
Nous pouvons analyser facilement l’en-tête d’un fichier bitmap. Ici, nous avons 4 fonctions d'analyseur qui représentent la section d'en-tête d'un fichier bitmap:
Tout d'abord, la section DIB peut être lue en prenant les 2 premiers octets
dibP :: Parser DIB
dibP = read . unpack <$> take 2
De même, la taille du bitmap, les sections réservées et le décalage des pixels peuvent être lus facilement:
sizeP :: Parser Int sizeP = fromIntegral . runGet getWord32le . fromStrict <$> take 4 reservedP :: Parser Reserved reservedP = take 2 addressP :: Parser Int addressP = fromIntegral . runGet getWord32le . fromStrict <$> take 4
qui peuvent ensuite être combinés dans une fonction d'analyse plus grande pour l'en-tête entier:
bitmapHeader :: Parser Header bitmapHeader = do dib <- dibP sz <- sizeP reservedP reservedP offset <- addressP return $ Header dib sz "" "" offset