¿Existe alguna biblioteca combinada de analizadores conocida en F# que pueda analizar archivos binarios (no de texto)?

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

Pregunta

Estoy familiarizado con algunos de los conceptos básicos de fparsec, pero parece estar orientado a archivos de texto o secuencias.

¿Existe alguna otra biblioteca de F# que pueda analizar archivos binarios de manera eficiente?¿O se puede modificar fácilmente fparsec para que funcione de manera eficiente con flujos binarios?

¿Fue útil?

Solución

Puede que te interese Combinadores de Pickler. Estos son un poco como combinadores de analizador, pero están más enfocados en formatos binarios más simples (recolectores permitirle producir datos binarios y impicklers analizarlos). Hay un Artículo bastante legible sobre la idea (PDF) por Andrew Kennedy (el autor de unidades de medida).

No tengo mucha experiencia con estos yo mismo, pero me di cuenta de que puede ser relevante para ti. La idea se utiliza en el compilador F# para generar algunos recursos binarios (como citas almacenadas en recursos). Aunque, no estoy seguro de si el F# Implementación del compilador es bueno (es una de esas cosas de los primeros días del compilador F#).

Otros consejos

El problema de trabajar con flujos binarios no es un problema del analizador per se, es un problema de lexing.El lexer es lo que convierte los datos sin procesar en elementos que el análisis puede manejar.

La mayoría de los sistemas de análisis tienen pocos problemas al permitirle suministrar su propio lexer y, si ese es el caso, idealmente podría escribir fácilmente un lexer compatible que funcione en su flujo binario.

El problema, sin embargo, es que la mayoría de los sistemas de análisis y lexing actuales se crean a partir de una herramienta de nivel superior.Y lo más probable es que ESA herramienta no esté diseñada para funcionar con flujos binarios.Es decir, no es práctico especificar los tokens y la gramática del flujo binario que se pueden usar para crear los analizadores y lexers posteriores.Además, es probable que no haya soporte alguno para los conceptos de nivel superior de números binarios de varios bytes (cortos, largos, flotantes, etc.) que probablemente encontrará en una secuencia binaria, ni para que el analizador generado funcione bien con ellos. si realmente necesita trabajar en su valor real, nuevamente porque los sistemas están diseñados principalmente para tokens basados ​​en texto, y el tiempo de ejecución subyacente maneja los detalles de convertir ese texto en algo que la máquina pueda usar (como secuencias de números ascii en valores reales). enteros binarios).

Dicho todo esto, probablemente puedas usar la sección de análisis de la herramienta, ya que los analizadores trabajan más en tokens abstractos que les proporciona el lexer.Una vez que cree su gramática, a nivel simbólico, deberá rehacer el lexer para crear los tokens de problema del flujo binario para alimentar el analizador.

Esto es realmente bueno, porque el analizador tiende a ser mucho más complicado que el lexer básico, por lo que el conjunto de herramientas se encargaría de gran parte de la "parte difícil" por usted.Pero aún necesitaría crear su propio lexer e interconectarlo adecuadamente con el analizador generado.No es una tarea insuperable y, si la gramática es realmente compleja, probablemente valga la pena el esfuerzo a largo plazo.

Si todo es sencillo, probablemente sea mejor que lo hagas tú mismo a mano.Desde el principio, es difícil imaginar una gramática binaria difícil, ya que el principal punto de venta de un formato binario es que está mucho más cerca de la máquina, lo que contradice el texto con el que la mayoría de los analizadores están diseñados para trabajar.Pero no conozco su caso de uso.

Pero consideremos el caso de un desensamblador.Se trata de un lexer sencillo que puede comprender en un alto nivel los diferentes tipos de instrucciones (como los operandos que no tienen argumentos, los que toman un solo byte como argumento o una palabra) y enviarlos a un analizador. luego se puede usar para convertir las instrucciones a sus mnemónicos y operandos en la sintaxis normal del ensamblador, así como para manejar las referencias de etiquetas y demás.

Es un caso artificial, ya que un desensamblador normalmente no separa las fases de lexing y análisis, por lo general no es lo suficientemente complicado como para molestarlo, pero es una forma de ver el problema.

Adenda:

Si tiene suficiente información para convertir el flujo binario en texto para enviarlo al motor, entonces tiene suficiente información para, en lugar de crear texto, podría crear los tokens reales que el analizador querría ver en el lexer.

Dicho esto, lo que podría hacer es tomar su formato de texto, usarlo como base para su herramienta de análisis y gramática, y hacer que cree las máquinas Lexer y Parser para usted, y luego, manualmente, puede probar su analizador y su procesamiento mediante "pruebas de texto".

Pero cuando empiece a leer el binario, en lugar de crear texto para luego leerlo y analizarlo, simplemente cree los tokens que crearía el lexer (deben ser objetos simples) y bombee el analizador directamente.Esto le ahorrará el paso lex y le ahorrará algo de tiempo de procesamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top