Pregunta

Recientemente escribí un analizador en Python usando Ply (es una reimplementación de yacc en Python).Cuando casi terminé con el analizador, descubrí que la gramática que necesito analizar requiere que haga algunas búsquedas durante el análisis para informar al lexer.Sin hacer una búsqueda para informar al lexer, no puedo analizar correctamente las cadenas en el idioma.

Dado que puedo controlar el estado del lexer a partir de las reglas gramaticales, creo que resolveré mi caso de uso utilizando una tabla de búsqueda en el módulo analizador, pero puede resultar demasiado 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 combinadores).¿Existe una implementación Python de Parsec?¿O quizás alguna otra biblioteca de calidad de producción llena de funciones de análisis para poder crear 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í.

¿Fue útil?

Solución

Una opción que puede considerar, si le parece bien un analizador LL, es dar antlr Si lo intenta, también puede generar Python (en realidad es LL (*) como lo llaman, * representa la cantidad de anticipación que puede manejar).

Otros consejos

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

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

Está ANTLR, que es LL(*), está PyParsing, que es más compatible con objetos y es algo así como un DSL, y luego está Analizando que es como el Menhir de OCaml.

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

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

antlr es excelente y tiene el beneficio adicional de trabajar en varios idiomas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top