python parsing parsec combinators

Implementación Python de Parsec?



parsing combinators (6)

Recientemente escribí un analizador sintáctico en Python usando Ply (es una reimplementación de python de yacc). Cuando ya casi había terminado con el analizador, descubrí que la gramática que necesito analizar requiere que realice una búsqueda durante el análisis para informar al lector. Sin mirar para informar al lector, no puedo analizar correctamente las cadenas en el idioma.

Dado que puedo controlar el estado del lector de las reglas de la gramática, creo que resolveré mi caso de uso usando una tabla de búsqueda en el módulo analizador, pero puede ser muy difícil de mantener / probar. Entonces quiero saber sobre algunas de las otras opciones.

En Haskell usaría Parsec, una biblioteca de funciones de análisis (conocidas como combinators). ¿Hay una implementación Python de Parsec? ¿O tal vez alguna otra biblioteca de calidad de producción llena de funcionalidad de análisis para poder construir un analizador sensible al contexto en Python?

EDITAR: todos mis intentos de análisis sin contexto han fallado. Por esta razón, no espero que ANTLR sea útil aquí.


Creo que pyparsing se basa en los mismos principios que parsec.


Está ANTLR, que es LL (*), hay PyParsing, que es más amigable para los objetos y es algo así como un DSL, y luego está el Parseo que es como el Menhir de OCaml.


Nada le impide desviar su analizador de la ruta "libre de contexto" usando PLY. Puede pasar información al lector durante el análisis, y de esta manera lograr una flexibilidad total. Estoy bastante seguro de que puedes analizar todo lo que quieras con PLY de esta manera.

Para un ejemplo práctico, considere : es un analizador para ANSI C escrito en Python con PLY. Resuelve el problema clásico C typedef - identifier (que hace que la gramática de C no sea sensible al contexto) rellenando una tabla de símbolos en el analizador que se utiliza en el lexer para resolver nombres de símbolos como tipos o no.


PySec es otro analizador monádico, no sé mucho al respecto, pero vale la pena mirar aquí


Una opción que puede considerar, si un analizador de LL está bien para usted, es darle una prueba ANTLR , también puede generar Python (en realidad es LL (*) como lo nombran, * representa la cantidad de anticipación que puede hacer frente con).


ANTLR es excelente y tiene la ventaja adicional de trabajar en varios idiomas.