Gibt es bekannte Parser -Kombinatorbibliotheks in F#, die binäre (nicht Text-) Dateien analysieren können?

StackOverflow https://stackoverflow.com/questions/7800586

Frage

Ich bin mit einigen der Grundlagen von FPARSEC vertraut, aber es scheint auf Textdateien oder Streams ausgerichtet zu sein.

Gibt es noch andere F# -Bibliotheken, die Binärdateien effizient analysieren können? Oder kann FPARSEC leicht modifiziert werden, um mit Binärströmen effizient zu arbeiten?

War es hilfreich?

Lösung

Sie können interessiert sein Pickler -Kombinatoren. Dies sind ein bisschen wie Parser -Kombinators, aber konzentrierter auf einfachere binäre Formate (Pickler Ermöglichen Sie, binäre Daten zu erstellen und Unpickler analysieren). Da ist ein Ganz lesbarer Artikel über die Idee (PDF) von Andrew Kennedy (dem Autor von Maßeinheiten).

Ich habe selbst nicht viel Erfahrung mit diesen, aber ich habe nur festgestellt, dass es für Sie relevant ist. Die Idee wird im F# Compiler verwendet, um einige binäre Ressourcen zu generieren (z. B. in Ressourcen gespeicherte Zitate). Obwohl ich nicht sicher bin, ob die F# Compiler -Implementierung ist alles gut (es ist eines dieser Dinge aus den frühen Tagen des F# Compiler).

Andere Tipps

Das Problem bei der Arbeit mit Binärströmen ist an sich kein Parserproblem, sondern ein Lexing -Problem. Der Lexer ist das, was die Rohdaten in Elemente umgeben, die der Analyse verarbeiten kann.

In den meisten Fällen hat Sie nur wenige Probleme, um Ihren eigenen Lexer zu liefern. Wenn dies der Fall ist, können Sie im Idealfall einen konformen Lexer schreiben, der auf Ihrem Binärstrom funktioniert.

Das Problem ist jedoch, dass die meisten Parsing- und Lexing -Systeme heute selbst aus einem höheren Tool erstellt werden. Und dieses Tool ist höchstwahrscheinlich nicht so konzipiert, dass sie mit binären Strömen arbeiten. Das heißt, es ist nicht praktisch für Sie, geben die Token und die Grammatik des Binärstroms an, die verwendet werden können, um die nachfolgenden Parsers und Lexer zu erstellen. Außerdem gibt es wahrscheinlich keinerlei Unterstützung für die höheren Konzepte von Byte -Binärzahlen (Shorts, Longs, Floats usw.), die Sie wahrscheinlich in einem Binärstrom begegnen, noch für den erzeugten Parser, um möglicherweise gut an ihnen zu arbeiten Wenn Sie tatsächlich an ihrem tatsächlichen Wert arbeiten müssen, da die Systeme hauptsächlich für textbasierte Token ausgelegt sind und die zugrunde liegende Laufzeit die Details des Konvertierens dieses Text Binäre Ganzzahlen).

Alles in allem können Sie wahrscheinlich den Parsen -Abschnitt des Tools verwenden, da Parser mehr an abstrakten Token arbeiten, die vom Lexer gefüttert werden. Sobald Sie Ihre Grammatik erstellt haben, müssten Sie auf symbolischer Ebene den Lexer wiederholen, um die Problem -Token aus dem Binärstrom zu erstellen, um sich in den Parser einzusetzen.

Dies ist eigentlich gut, da der Parser tendenziell weitaus komplizierter ist als der grundlegende Lexer, sodass das Toolkit für Sie einen Großteil des "schweren Teils" übernimmt. Sie müssten sich jedoch immer noch damit befassen, Ihren eigenen Lexer zu erstellen und sie richtig an den erzeugten Parser zu überlegen. Keine unüberwindliche Aufgabe, und wenn die Grammatik eine wirkliche Komplexität hat, lohnt es sich wahrscheinlich auf lange Sicht.

Wenn es größtenteils einfach ist, dann ist es wahrscheinlich besser, es selbst von Hand zu machen. Von meinem Kopf ist es kaum vorstellbar, dass es sich um eine schwierige binäre Grammatik handelt, da das Hauptverkaufsargument eines binären Formats darin besteht, dass es viel näher an der Maschine ist, was im Widerspruch zu dem Text steht, mit dem die meisten Parsers arbeiten sollen. Aber ich kenne Ihren Anwendungsfall nicht.

Aber betrachten Sie den Fall eines Disassemblers. Das ist ein einfacher Lexer, der in der Lage ist, die verschiedenen Anweisungen (z. kann dann verwendet werden, um die Anweisungen in ihre Mnemonik und Operanden in der normalen Assembler -Syntax zu konvertieren und die und so ähnlichen Beschriftungen zu verarbeiten.

Es ist ein erfundener Fall, da ein Disassembler normalerweise nicht die Lexen- und Parsenphasen trennen, es ist normalerweise nicht kompliziert genug, um sich darum zu kümmern, aber es ist eine Möglichkeit, das Problem zu betrachten.

Addenda:

Wenn Sie über genügend Informationen verfügen, um den binären Stream in Text umzuwandeln, um in die Engine zu füttern, haben Sie genügend Informationen, anstatt Text zu erstellen.

Das heißt, Sie könnten Ihr Textformat annehmen, dies als Grundlage für Ihr Parsen -Werkzeug und Ihre Grammatik verwenden und die Lexer- und Parser -Maschinen für Sie erstellen, und dann können Sie von Hand Ihren Parser und seine Testen testen und seine Verarbeitung mit "Texttests".

Wenn Sie jedoch das Lesen des Binärdatmens und anstatt Text zu erstellen, anstatt sie dann gelegt und analysiert zu werden, erstellen Sie einfach die Token, die der Lexer erzeugen würde (dies sollten einfache Objekte sein), und pumpen Sie den Parser direkt. Auf diese Weise sparen Sie den Lex -Schritt und sparen Sie einige Verarbeitungszeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top