2010-06-19 26 views
31

Hay muchos productos de código abierto parser implementations disponibles para nosotros en Haskell. Parsec parece ser el estándar para el análisis de texto y attoparsec parece ser una opción popular para el análisis binario, pero no sé mucho más que eso. ¿Existe un árbol de decisión particular que sigas para elegir una implementación de analizador? ¿Has aprendido algo interesante sobre las fortalezas o debilidades de las bibliotecas?Elegir un analizador Haskell

Respuesta

49

Tiene muchas buenas opciones.

Para el análisis de peso ligero de tipos de cadena:

Para el análisis sintáctico cadena de bytes para llevar, por ejemplo, de HTTP headers.

Para los datos binarios reales la mayoría de la gente usa ya sea:

  • binary - para el análisis sintáctico binario perezoso
  • cereal - para el estricto análisis binario

El principal pregunta que debe hacerse es ¿cuál es el tipo de cadena subyacente?

Esa decisión, que determina en gran medida el conjunto de herramientas analizador que va a utilizar.

La segunda pregunta es: ¿ya tengo una gramática para el tipo de datos?Si es así, sólo puede utilizar feliz

Y, obviamente, para los tipos de datos personalizados hay una variedad de buenos programas de análisis existentes:

+1

gracias por la respuesta detallada – Keith

+1

Fantástica respuesta, muchas gracias. – Litherum

9

Sólo para añadir al mensaje de Don: Personalmente, me gusta bastante Text.ParserCombinators.ReadP (parte de base) sin sin sentido cosas rápidas y fáciles. Particularmente cuando Parsec parece excesivo.

Hay una biblioteca bytestringreadp para la versión de bytes, pero no cubre las cadenas de caracteres Char8, y sospecho que attoparsec sería una mejor opción en este momento.

4

Recientemente convertí un código de Parsec a Attoparsec. Ambos son bastante capaces.

Attoparsec gana en rendimiento y memoria, pero Parsec proporciona mejores informes de errores y tiene una documentación más completa.