haskell parsec attoparsec

attoparsec o parsec en haskell



(1)

Tengo que analizar algunos archivos y convertirlos a algunos tipos de datos predefinidos.

Haskell parece proporcionar dos paquetes para eso:

  1. attoparsec
  2. parsec

¿Cuál es la diferencia entre los dos y cuál es más adecuada para analizar un archivo de texto de acuerdo con algunas reglas?


Parsec

Parsec es bueno para analizadores sintácticos "de cara al usuario": cosas donde tiene una cantidad limitada de entrada, pero los mensajes de error importan. No es terriblemente rápido, pero si tienes pequeñas entradas, esto no debería importar. Por ejemplo, elegiría Parsec para prácticamente cualquier herramienta de lenguaje de programación ya que, en términos absolutos, incluso los archivos fuente más grandes no son tan grandes, pero los mensajes de error realmente importan.

Parsec puede trabajar en diferentes tipos de entrada, lo que significa que puede usarlo con un String estándar o con un flujo de tokens desde un lexer externo de algún tipo. Dado que puede usar String , maneja Unicode perfectamente para ti; los analizadores básicos integrados como el digit y la letter son compatibles con Unicode.

Parsec también viene con un transformador de mónada, lo que significa que puede aplicar capas en una pila de mónadas. Esto podría ser útil si desea realizar un seguimiento del estado adicional durante su análisis, por ejemplo. También podría buscar más efectos truculentos como el análisis no determinista o algo así: la magia habitual de los transformadores de mónada.

Attoparsec

Attoparsec es mucho más rápido que Parsec. Debes usarlo cuando esperes obtener grandes cantidades de información o el rendimiento realmente importa. Es ideal para cosas como código de red (análisis de estructura de paquetes), analizar grandes cantidades de datos sin formato o trabajar con formatos de archivo binarios.

Attoparsec puede funcionar con ByteString s, que son datos binarios . Esto lo convierte en una buena opción para implementar cosas como formatos de archivos binarios. Sin embargo, dado que esto es para datos binarios, no maneja cosas como la codificación de texto; para eso, debe usar el módulo attoparsec para Text .

Attoparsec admite el análisis incremental, que Parsec no. Esto es muy importante para ciertas aplicaciones, como el código de red, pero no importa para otros.

Mensajes de error peores que Parsec y sacrifica algunas características de alto nivel para el rendimiento. Está especializado en Text o ByteString , por lo que no puede usarlo con tokens de un lexer personalizado. Tampoco es un transformador de mónada.

¿Cúal?

En definitiva, Parsec y Attoparsec se adaptan a nichos muy diferentes. La diferencia de alto nivel es el rendimiento: si lo necesita, elija Attoparsec; si no lo haces, solo ve con Parsec.

Mi heurística habitual es elegir Parsec para los lenguajes de programación, los formatos de archivo de configuración y la entrada del usuario, así como casi cualquier cosa que haría con una expresión regular. Estas son cosas que generalmente se producen a mano, por lo que los analizadores no necesitan escalar, pero sí deben informar los errores.

Por otro lado, elegiría Attoparsec para cosas como la implementación de protocolos de red, manejo de datos binarios y formatos de archivos o lectura en grandes cantidades de datos generados automáticamente. Cosas en las que se trata de limitaciones de tiempo o grandes cantidades de datos, que generalmente no están escritos directamente por un ser humano.

Como puede ver, la elección en realidad es bastante simple: los casos de uso no se superponen demasiado. Lo más probable es que quede bastante claro cuál usar para cualquier aplicación determinada.