2012-02-23 15 views
13

Estoy buscando escribir un filtro de importación de Python o preprocesador para archivos fuente que son esencialmente Python con elementos de lenguaje adicionales. El objetivo es leer el archivo fuente, analizarlo en un árbol sintáctico abstracto, aplicar algunas transformaciones para implementar las nuevas partes del idioma y escribir una fuente válida de Python que CPython pueda utilizar. Quiero escribir esto en Python y estoy buscando el mejor analizador para la tarea.Analizador de Python para Python-like language

El analizador incorporado en Python no es apropiado porque requiere que los archivos fuente sean Python reales, que no serán. Hay toneladas de analizadores (o generadores de analizadores sintácticos) que funcionarán con Python, pero es difícil saber cuál es la mejor para mis necesidades sin un montón de investigación.

En resumen, mis requisitos son:

  1. Analizador está escrito en Python o tiene enlaces Python.
  2. Viene con una gramática de Python que puedo ajustar, o puede consumir fácilmente una gramática modificable de Python disponible en otros lugares (como http://docs.python.org/reference/grammar.html).
  3. Puede volver a serializar el AST después de transformarlo.
  4. No debería ser demasiado horrible para trabajar con API.

¿Alguna sugerencia?

+0

Para que quede claro: el idioma que desea analizar ni siquiera * * parse como Python puro. ¿Correcto? –

+0

¿Ha considerado buscar en PyYAML? – inspectorG4dget

+0

@SvenMarnach: Eso es correcto. – kindall

Respuesta

9

Lo primero que viene a la mente es lib2to3. Es una implementación completa de Python puro de un analizador de Python. Lee un archivo de gramática de Python y analiza los archivos fuente de Python de acuerdo con esta gramática. Ofrece una gran infraestructura para realizar manipulaciones AST y escribir código Python muy formateado; después de todo, su propósito es transformar dos lenguajes de Python con gramáticas ligeramente diferentes.

Desafortunadamente falta documentación y no garantiza una interfaz estable. Sin embargo, hay proyectos que se construyen encima de lib2to3, y el source code es bastante legible. Si la estabilidad de la API es un problema, puede simplemente bifurcarlo.

+1

¡Buen punto! "Después de todo, su propósito es transformar dos lenguajes similares a Python con gramáticas ligeramente diferentes" –

+0

Tengo dos excelentes respuestas aquí, pero este es claramente el enfoque que debo probar primero. – kindall

2

Me gusta SimpleParse mucho, pero nunca intenté alimentarlo con el Python grammar (por cierto, ¿es una gramática determinista?). Si se ahoga, PLY hará el trabajo.

Consulte esto compilation sobre las herramientas de análisis de Python.

+0

* Por cierto, es una gramática determinista * Sí (y notablemente simple). –

1

Yo recomendaría que se echa un vistazo a mi biblioteca: https://github.com/erezsh/lark

Se puede analizar todas las gramáticas libres de contexto, crea automáticamente un AST (con números de columna línea de &), y acepta la gramática en formato EBNF, que es considerado el estándar.

Puede analizar fácilmente un idioma como Python, y puede hacerlo más rápido que cualquier otra biblioteca de análisis escrita en Python.

De hecho, ya hay una example python grammar y parser