2010-03-11 5 views
13

parsec est conçu pour analyser des informations textuelles, mais il me semble que parsec pourrait aussi être approprié pour faire le format de fichier binaire analyse syntaxique pour les formats complexes qui impliquent des segments conditionnels, des segments hors-commande, etc.Utilisation de Parsec de Haskell pour analyser les fichiers binaires?

est-il une capacité de faire ceci ou un paquet alternatif similaire qui fait cela? Sinon, quel est le meilleur moyen pour Haskell d'analyser les formats de fichiers binaires?

Répondre

10

Vous pourriez être intéressé par AttoParsec, qui a été conçu à cet effet, je pense.

2

Cela fonctionne très bien, mais vous pouvez utiliser Parsec 3, Attoparsec ou Iteratees. La dépendance de Parsec à l'égard de String en tant que représentation intermédiaire peut considérablement gonfler votre empreinte mémoire, alors que les autres peuvent être configurés pour utiliser ByteStrings.

Les itérats sont particulièrement attrayants car il est plus facile de s'assurer qu'ils ne retiendront pas le début de votre entrée et qu'ils peuvent recevoir des blocs de données de façon incrémentielle dès qu'ils sont disponibles. Cela vous évite d'avoir à lire à l'avance toute l'entrée dans la mémoire et vous permet d'éviter d'autres solutions de contournement méchantes comme IO paresseux.

+1

Que Parsec est dans Text.Parsec implique qu'il est principalement pour le texte, pas binaire, non? Même pour ByteStrings, il ne fait que le type une instance de Stream et Char. Que voulez-vous dire que ça fonctionne bien? – me2

1

La meilleure approche dépend du format du fichier binaire.

De nombreux formats binaires sont conçus pour faciliter l'analyse (contrairement aux formats de texte qui doivent être principalement lus par les humains). Ainsi, tout type de données d'union sera précédé d'un discriminateur qui vous indique le type auquel s'attendre, tous les champs sont de longueur fixe ou précédés d'un champ de longueur, et ainsi de suite. Pour ce genre de données, je recommanderais Data.Binary; Généralement, vous créez un type de données Haskell correspondant à chaque type dans le fichier, puis faites de chacun de ces types une instance de Binary. Définir la méthode "get" pour la lecture; il retourne une action monade "Get" qui est fondamentalement un analyseur très simple. Vous devrez également définir une méthode "put".

D'autre part, si vos données binaires ne correspondent pas à ce type de monde, vous aurez besoin d'attoparsec. Je n'ai jamais utilisé cela, donc je ne peux pas commenter davantage, mais this blog post est très positif.

12

Les principaux outils d'analyse de fichiers binaires sont:

binaire est la solution la plus générale, céréales peut être grande pour les tailles de données limitées, et attoparsec est parfaitement bien pour par exemple analyse de paquets. Tous ces objectifs visent de très hautes performances, contrairement à Parsec. Il y a aussi beaucoup d'exemples sur le hackage.

+0

Je pense que attoparsec est la voie à suivre, mais j'ai de la difficulté à trouver des exemples d'analyse de données binaires réelles. Le seul exemple est RFC2616.hs inclus dans le référentiel mais qui analyse toujours le texte, pas binaire. Aucune suggestion? – me2

+0

attoparsec n'est proposé que récemment pour analyser des données binaires. Au travail, nous allons avec Data.Binary et céréales. Il y a beaucoup plus d'exemples là-bas, et c'est pour ça que c'est conçu. attoparsec peut être plus général que nécessaire. –

Questions connexes