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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow