2009-10-10 8 views
39

estoy después de crear un analizador simple mini-lenguaje en Python, programación cerca del dominio del problema y todo eso.Mini-idiomas en Python

De todos modos, me preguntaba cómo iba la gente de aquí haciendo eso: ¿cuáles son las formas preferidas de hacer este tipo de cosas en Python?

No voy a dar detalles específicos de lo que busco porque en este momento estoy investigando cuán fácil es todo este campo en Python.

Gracias por su ayuda!

+1

similares a: http://stackoverflow.com/questions/2945357/python-how-best-to-parse-a-simple-grammar –

Respuesta

34

Pyparsing es útil para escribir "pequeñas lenguas". Di un presentation at PyCon'06 para escribir un motor de juego de aventuras simple, en el que el lenguaje que se analizaba e interpretaba era el conjunto de comandos del juego ("inventario", "tomar espada", "libro desplegable", etc.). (Código de fuente here.)

También puede encontrar enlaces a otros artículos de pyparsing en la wiki de pyparsing Publications page.

+6

Pyparsing es una biblioteca absolutamente fantástico, puede analizar próximo a cualquier cosa con ceremonia mínima. Construí un analizador de PHP recursivo (análisis de código estático) en dos tardes usándolo. No podría recomendarlo lo suficiente. Los documentos tardan aproximadamente 2 horas en leerse. –

20

Tengo una experiencia limitada pero positiva con PLY (Python Lex-Yacc). Combina la funcionalidad Lex and Yacc en una sola clase de Python. Es posible que desee comprobarlo.

Compañero Stackoverflow'er Ned Batchelder tiene nice overview de herramientas disponibles en su sitio web. También hay una descripción general en el Python website.

3

Para ser productivo, siempre usaría un generador de analizador como CocoPy (Tutorial) para transformar su gramática en un analizador (correcto) (a menos que desee implementar el analizador manualmente para aprender).

El resto es escribir el intérprete/compilador real (Crear código de bytes basado en pila o AST de memoria para ser interpretado y luego evaluarlo).

4

Python es un lenguaje maravillosamente simple y extensible que sugiero simplemente crear un módulo completo de python y codificar en contra de eso.

Veo que mientras escribí lo anterior, ya se ha mencionado PLY.

19

recomendaría funcparserlib. Fue escrito especialmente para analizar pequeños lenguajes y DSL y es más rápido y más pequeño que pyparsing (ver estadísticas en su página de inicio). Los programadores minimalistas y funcionales deberían gustar funcparserlib.

Editar: Por cierto, yo soy el autor de esta biblioteca, así que mi opinión puede estar sesgada.

+4

Hubo un tiempo en que no quería promocionar ni defender mi módulo de pyparsing. ¡No seas tímido! Y asegúrese de escribir a Ned Batchelder para agregar 'funcparserlib' a su página del compendio del analizador, es un recurso común (y valioso) para muchos usuarios de Python en busca de una biblioteca de análisis sintáctico. – PaulMcG

+0

@Paul Gracias por su asesoramiento :) –

+0

Parece una biblioteca muy útil, ¡y el código parece muy claro! ¡Gracias! –

3

Si me lo pide ahora, me gustaría probar la biblioteca textx para Python. ¡Puedes crear un dsl fácilmente con python! Las ventajas son que crea un AST para usted, y el léxico y el análisis se combinan.

http://igordejanovic.net/textX/