Ci sono dei noti parser di F nella biblioteca combinatore # in grado di analizzare i file binari (non di testo)?

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

Domanda

mi è familiare con alcuni dei principi fondamentali di fparsec ma sembra essere orientato verso file di testo o corsi d'acqua.

Ci sono qualsiasi altra libreria F # è che può efficacemente analizzare i file binari? O può fparsec essere facilmente modificato per lavorare in modo efficiente con flussi binari?

È stato utile?

Soluzione

Si può essere interessati a pickler combinatori . Questi sono un po 'come combinatori parser, ma sono più focalizzati in semplici formati binari ( serializzatori consentono di produrre dati binari e unpickler parse loro). C'è un articolo abbastanza leggibile sulla idea (PDF) di Andrew Kennedy (l'autore di unità di misura).

Non ho molta esperienza con questi me stesso, ma ho appena capito che può essere rilevante per voi. L'idea è utilizzato nel compilatore F # per la generazione di alcune risorse binari (come le citazioni memorizzati in risorse). Anche se, non sono sicuro se il F implementazione # compilatore è un bene (si tratta di una di quelle cose da primi giorni del compilatore F #).

Altri suggerimenti

Il problema di lavorare con i flussi binari non è un problema parser di per sé, è un problema lexing. Il lexer è ciò che trasforma i dati grezzi per elementi che parse può gestire.

La maggior parte qualsiasi sistema di analisi ha pochi problemi che ti permette di fornire il proprio lexer, e se questo è il caso si potrebbe, in posizione ideale, facilmente scrivere un lexer compatibile adatto al vostro flusso binario.

Il problema, tuttavia, è che la maggior parte l'analisi e sistemi Lexing oggi sono essi stessi creato da uno strumento di livello superiore. E questo strumento molto probabilmente non è progettato per funzionare con i flussi binari. Cioè, non è pratico per specificare i gettoni e la grammatica del flusso binario che può essere utilizzato per creare i parser e lexer successive. Inoltre, è probabile alcun sostegno per i concetti di più alto livello di numeri a più byte binari (pantaloncini, anela, galleggianti, ecc) che si rischia di incontro in un flusso binario, nè per il parser generato possibilmente lavorare bene su di loro se effettivamente bisogno di lavorare sul loro valore effettivo, ancora una volta perché i sistemi sono per lo più progettati per i token di testo base, e il runtime di base gestisce i dettagli di conversione che qualcosa testo, la macchina può utilizzare (come ad esempio le sequenze di numeri ASCII in al reale interi binari).

Detto questo, probabilmente si può effettivamente utilizzare la sezione analisi dello strumento, dal momento che i parser lavorare di più sulla gettoni astratti che li sono alimentati dal lexer. Una volta creata la grammatica, a livello simbolico, si avrebbe bisogno di rifare il lexer per creare i token problema dal flusso binario ad immettere in rete al parser.

Questo è in realtà un bene, perché il parser tende ad essere molto più complicato di quanto il lexer di base, in modo che il toolkit avrebbe gestito gran parte della "parte difficile" per voi. Ma si sarebbe ancora bisogno di trattare con creare il proprio lexer e l'interfacciamento correttamente al parser generato. Non è un compito insormontabile, e se la grammatica è di qualsiasi complessità reale, probabilmente vale la pena il vostro sforzo nel lungo periodo.

Se è tutto per lo più semplice, allora è molto probabile appena meglio farlo voi stessi a mano. Della parte superiore della mia testa, è difficile immaginare una difficoltà grammaticale binario, dal momento che il principale punto di un formato binario di vendita è che è molto più vicino alla macchina, che è in contraddizione con il testo che la maggior parte dei parser sono progettati per lavorare. Ma io non conosco il tuo caso d'uso.

Ma consideriamo il caso di un disassemblatore. Questo è un lexer semplice che può essere in grado di stare sotto ad un livello alto i diversi tipi di istruzioni (come quelli operandi che non hanno argomenti, quelli che prendono un singolo byte come argomento, o una parola), e mangimi che ad un parser può quindi essere utilizzato per convertire le istruzioni per i loro mnemonico e gli operandi nel normale sintassi dell'assemblatore, così come gestire i riferimenti di etichetta e così via.

E 'un caso artificioso, come un disassemblatore tipicamente non separa il lexing e fasi di parsing, non è di solito abbastanza complicato di preoccuparsi, ma è un modo di guardare il problema.

Addenda:

Se si dispone di informazioni sufficienti per convertire il flusso binario a testo per alimentazione al motore, allora si dispone di informazioni sufficienti per invece di creare il testo, è possibile creare i gettoni reali che il parser vorrebbe vedere dal lexer .

Detto questo, che cosa si potrebbe fare è prendere il formato di testo, l'uso che come base per il vostro strumento di analisi e la grammatica, e lo hanno creare le macchine lexer e parser per voi, e poi, a mano, è possibile verificare la parser e la sua lavorazione con "prove di testo".

Ma quando si arriva intorno alla lettura del binario, piuttosto che creare il testo per poi essere lexed e analizzato, è sufficiente creare i gettoni che il lexer creerebbe (questi dovrebbero essere semplici oggetti), e la pompa direttamente il parser. Questo vi farà risparmiare il passo lex e risparmiare un po 'di tempo di elaborazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top