parsing haskell parsec happy uu-parsinglib

Parsec o feliz(con alex) o uu-parsinglib



haskell happy (1)

Personalmente prefiero Parsec con la ayuda de Alex para leer.

Prefiero Parsec a Happy porque 1) Parsec es una biblioteca, mientras que Happy es un programa y escribirás en un idioma diferente si usas Happy y luego compilas con Happy. 2) Parsec le brinda habilidades de análisis sensibles al contexto gracias a su interfaz monádica. Puede utilizar el estado adicional para el análisis sensible al contexto, y luego inspeccionar y decidir dependiendo de ese estado. O simplemente mire un poco de valor analizado antes y decida los siguientes analizadores, etc. (por ejemplo, a <- parseSomething; if test a then ... do ... ) Y cuando no necesite ninguna información sensible al contexto, simplemente puede use el estilo aplicativo y obtenga una implementación como implementada en YACC o una herramienta similar.

Como inconveniente de Parsec, nunca sabrá si su analizador Parsec contiene una recursión izquierda, y su analizador se atascará en el tiempo de ejecución (porque Parsec es básicamente un analizador descendente recursivo descendente). Tienes que encontrar recursiones a la izquierda y eliminarlas. Los analizadores estilo YACC pueden proporcionarle algunas garantías estáticas e información (como cambiar / reducir conflictos, terminales no utilizados, etc.) que no puede obtener con Parsec.

Alex es altamente recomendado para la relajación en ambas situaciones ( creo que debes usar a Alex si decides continuar con Happy ). Porque incluso si usa Parsec, realmente simplifica la implementación de su analizador, y también atrapa una gran cantidad de errores (por ejemplo, analizar una palabra clave como identificador fue un error común que hice mientras estaba usando Parsec sin Alex. Es solo un ejemplo ).

Puede echar un vistazo a mi analizador Lua implementado en Alex + Parsec. Y aquí está el código para usar tokens generados por Alex en Parsec .

EDIT: Gracias John L para las correcciones. Al parecer, también puedes hacer un análisis sensible al contexto con Happy. Además, Alex para el lexing no se requiere en Happy, aunque se recomienda.

Voy a escribir un analizador de lenguaje verilog (o vhdl) y haré muchas manipulaciones (tipo de transformaciones) de los datos analizados. Tengo la intención de analizar archivos realmente grandes (diseños Verilog completos, tan grandes como 10K líneas) y, en última instancia, apoyaré a la mayoría de los Verilog. No me importa escribir, pero no quiero volver a escribir ninguna parte del código cada vez que agregué soporte para alguna otra regla.

En Haskell, ¿qué biblioteca recomendarías? Conozco a Haskell y he usado Happy antes (para jugar). Siento que hay posibilidades en el uso de Parsec para transformar la cadena analizada en el código (lo cual es una gran ventaja). No tengo experiencia con uu-paringlib.

Entonces, para analizar una gramática completa de verilog / VHDL, ¿cuál de ellos se recomienda? Mi principal preocupación es la facilidad y la "corrección" con la que puedo manipular los datos analizados a mi antojo. La velocidad no es una preocupación principal.