haskell parsec

haskell - Cuál es la diferencia entre Text.ParserCombinators.Parsec y Text.Parsec



(2)

Creo que este último es una capa compatible con versiones anteriores para Parsec 2, implementado en términos de la API más nueva.

Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy Text.Parsec.Char Text.Parsec.Combinator Text.Parsec.Error Text.Parsec.Expr Text.Parsec.Language Text.Parsec.Perm Text.Parsec.Pos Text.Parsec.Prim Text.Parsec.String Text.Parsec.Token ParserCombinators Text.ParserCombinators.Parsec Text.ParserCombinators.Parsec.Char Text.ParserCombinators.Parsec.Combinator Text.ParserCombinators.Parsec.Error Text.ParserCombinators.Parsec.Expr Text.ParserCombinators.Parsec.Language Text.ParserCombinators.Parsec.Perm Text.ParserCombinators.Parsec.Pos Text.ParserCombinators.Parsec.Prim Text.ParserCombinators.Parsec.Token

¿Son lo mismo?


Por el momento, hay dos versiones principales ampliamente utilizadas de Parsec, Parsec 2 y Parsec 3.

Mi consejo es simplemente utilizar la última versión de Parsec 3. Pero si quieres hacer una elección consciente, sigue leyendo.

Nuevo en Parsec 3

Transformador de mónada

Parsec 3 introduce un transformador de mónada, ParsecT , que se puede usar para combinar el análisis sintáctico con otros efectos monádicos.

Corrientes

Aunque Parsec 2 le permite elegir el tipo de token (que es útil cuando desea separar el análisis léxico del análisis sintáctico), los tokens siempre se organizan en listas. La lista puede no ser la estructura de datos más eficiente para almacenar textos grandes.

Parsec 3 puede trabajar con flujos arbitrarios: estructuras de datos con una interfaz tipo lista. Puede definir sus propias transmisiones, pero Parsec 3 también incluye una implementación de Stream popular y eficiente basada en ByteString (para el análisis basado en Char ), expuesta a través de los módulos Text.Parsec.ByteString y Text.Parsec.ByteString.Lazy .

Razones para preferir Parsec 2

Menos extensiones requeridas

Las funciones avanzadas proporcionadas por Parsec 3 no se ofrecen de forma gratuita: para implementarlas, se requieren varias extensiones de idioma.

Ninguna de las dos versiones es Haskell-2010 (es decir, ambas usan extensiones), pero Parsec 2 usa menos extensiones que Parsec 3, así que las posibilidades de que un compilador determinado compile Parsec 2 son más altas que las de Parsec 3.

En este momento ambas versiones funcionan con GHC, mientras que Parsec 2 también se reported que se compila con JHC y se incluye como una de las bibliotecas estándar de JHC.

Actuación

Originalmente (es decir, a partir de la versión 3.0), Parsec 3 era considerablemente más lento que Parsec 2. Sin embargo, se ha trabajado para mejorar el rendimiento de Parsec 3 y, a partir de la versión 3.1, Parsec 3 es solo un poco más lento que Parsec 2 (puntos de referencia: 1 , 2 ) .

Capa de compatibilidad

Ha sido posible "reimplementar" toda la API Parsec 2 en Parsec 3. Esta capa de compatibilidad es provista por el paquete Parsec 3 bajo la jerarquía de módulo Text.ParserCombinators.Parsec (la misma jerarquía que es usada por Parsec 2), mientras que la nueva API Parsec 3 está disponible bajo la jerarquía Text.Parsec .

Esto significa que puede usar Parsec 3 como reemplazo directo para Parsec 2.