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