2008-09-18 14 views
11

Recientemente escribí un analizador 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.Implementación de Python de Parsec?

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 combinadores). ¿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í.

Respuesta

3

Una opción que puede considerar, si un analizador de LL está bien para usted, es dar ANTLR, también puede generar Python (en realidad es LL (*) como lo nombran, * representa la cantidad de mirar hacia adelante puede hacer frente a).

+1

En mi caso necesito más de lo que el análisis tradicional lo permite. Todos mis intentos de escribir un analizador sintáctico de contexto tradicional han caído en su cara por razones teóricas. Estoy bastante seguro en este punto de que necesito un lexing condicional como mínimo. ¿ANTLR todavía se aplicaría? –

+0

Tiene * anticipación con ANTLR y, si lo necesita, puede agregar sintaxis y predicados a su gramática (también existen predicados semánticos). use antlrwork, es realmente útil para diseñar/depurar gramática (http://www.antlr.org/works/index.html). También hay gramáticas preparadas en el sitio ANTLR. –

1

Hay ANTLR, que es LL (*), hay PyParsing, que es más fácil de usar y es como una DSL, y luego está Parsing que es como Menhir de OCaml.

+0

Estoy investigando PyParsing ahora, parece el más cercano a Parsec que he visto. Estoy aceptando tu respuesta por ahora. Esperemos que PyParsing funcione :) ¡Gracias! –

+0

Me preocupa leer esto en la documentación de PyParsing: El rendimiento del pyparsing puede ser lento para gramáticas complejas y/o grandes cadenas de entrada. –

0

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

4

PySec es otro analizador monádico, no sé mucho sobre él, pero vale la pena mirar here

7

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

1

Nada le impide desviar su analizador de la ruta "sin 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, consider - es un analizador sintáctico 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.

Cuestiones relacionadas