¿Cuál es la ventaja de usar un generador de parser como happy en lugar de usar combinadores de parser?


Para aprender a escribir y analizar una gramática libre de contexto, quiero elegir una herramienta. Para Haskell, hay dos grandes opciones: Happy, que genera un analizador a partir de una descripción gramatical y *Parsec, que te permite codificar directamente un analizador en Haskell.

¿Cuáles son las (des)ventajas de ambos enfoques?

Author: fuz, 2011-09-01

5 answers

DSL externo vs interno

El formato de especificación del analizador para Happy es un DSL externo, mientras que con Parsec tiene todo el poder de Haskell disponible al definir sus analizadores. Esto significa que puede, por ejemplo, escribir funciones para generar analizadores, usar la plantilla Haskell, etc.

Reglas de precedencia

Con Happy, puedes usar precedentes para simplificar tu gramática, mientras que con Parsec tienes que anidar las reglas gramaticales correctamente usted mismo. Por lo tanto, cambiar la precedencia de un operador es mucho más tedioso en Parsec.

Comprobación estática

Happy le advertirá sobre ambigüedades en su gramática en tiempo de compilación. (Aunque no es bueno para decirte dónde están.) Con Parsec, no recibe ninguna advertencia hasta que su analizador falla en tiempo de ejecución.

 23
Author: hammar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 13:18:08

Esta es la decisión tradicional: uso lex/yacc (happy) o escribo mi propio analizador sintáctico (mayormente recursivo), solo que la biblioteca parsec es como un DSL para hacerlo bien.

Si uno tiene experiencia con el enfoque yacc/lex, usar happy será una curva de aprendizaje más pequeña.

 4
Author: Ingo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 11:06:55

Estoy acostumbrado a la biblioteca combinator parser uu-parsinglib de la universidad de utrecht. Uno puede tener corrección de errores y permutaciones gratis, y también las cosas que tiene parsec. También me gusta porque mi gramática implementada se parece a una gramática EBNF, sin tantas cosas monádicas, y es fácil de leer.

 1
Author: carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 14:22:08

En mi opinión, Parsec oculta la mayoría de los detalles gramaticales desagradables y le permite escribir sus analizadores de manera más intuitiva. Si quieres aprender estas cosas en primer lugar ir con algún analizador-generador como Happy (o incluso tratar de implementar uno usted mismo).

 1
Author: Carsten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-03 13:57:42

Los combinadores de parser ingenuos no permiten la recursión a la izquierda en las reglas gramaticales y no he encontrado una biblioteca que lo haga.

Happy permite BNF completo en las especificaciones del idioma, y algunos pentagramas útiles como las reglas de prioridad. Por lo tanto, para casos complicados Happy y generadores de analizador en general son mucho mejores. Sin embargo, en el caso de lenguajes simples y estúpidos con gramáticas analizables LL(k), usaría una biblioteca de combinadores de parser como más amigable para el mantenedor.

 0
Author: permeakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-03 15:13:32