2011-10-27 11 views
5

Estoy trabajando en algunas herramientas para un juego que estoy haciendo. Las herramientas sirven como interfaz para facilitar la edición de archivos del juego. Varios de los archivos son archivos de scripts Python. Por ejemplo, tengo un archivo Items.py que contiene lo siguiente (minimizada por ejemplo)Manipulando un archivo Python desde C#

from ItemModule import * 

import copy 

class ScriptedItem(Item): 
    def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower): 
     Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID()) 
    def Clone(self): 
     return copy.deepcopy(self) 

ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50)) 

Como ya he mencionado, quiero ofrecer una interfaz para editar este archivo sin exigir a un editor para saber pitón/editar el archivo directamente. Mi editor tiene que ser capaz de:

  1. Buscar y enumerar todos los tipos de clase (en este ejemplo, sería solamente objeto con el Script)
  2. Encuentra y una lista de todos los elementos creados (en este caso hay' d solo uno, Abounding Crystal). Necesitaría encontrar el tipo (en este caseScriptedItem) y todos los valores de los parámetros
  3. Permitir la edición de parámetros y la creación/eliminación de elementos.

Para hacer esto, comencé a escribir mi propio analizador sintáctico, buscando la palabra clave class y cuando estas clases grabadas se usan para construir objetos. Esto funcionó para datos simples, pero cuando comencé a usar clases con constructores complejos (listas, mapas, etc.) se hizo cada vez más difícil de analizar correctamente.

Después de buscar, descubrí que IronPython facilitaba el análisis de archivos Python, así que eso es lo que hice. Una vez que construí el Árbol de sintaxis abstracta, utilicé PythonWalkers para identificar y encontrar toda la información que necesitaba. Esto funciona perfectamente para leer datos, pero no veo una manera fácil de insertar datos actualizados en el archivo de Python. Por lo que puedo decir, no hay forma de cambiar los valores en el AST y mucho menos volver a convertir el AST en un archivo de script. Si me equivoco, me encantaría que alguien me dijera cómo podría hacer esto. Lo que tendría que hacer ahora es buscar en el archivo hasta encontrar la línea correcta, luego intentar insertar los datos en el constructor, asegurando el orden correcto.

¿Hay alguna solución obvia que no estoy viendo? ¿Debería seguir trabajando en mi analizador sintáctico y hacerlo compatible con tipos de datos más complejos? Realmente pensé que lo tenía con el analizador de IronPython, pero no pensé en lo difícil que sería volver a introducir los datos modificados en el archivo.

Cualquier sugerencia sería apreciada

Respuesta

1

¿Quieres una fuente-a-fuente program transformation tool.

Dicha herramienta analiza un lenguaje a una estructura de datos interna (invariablemente un AST), le permite modificar el AST y luego puede regenerar el texto fuente del AST modificado sin cambiar prácticamente nada de la fuente, excepto cuando el AST cambia fueron hechos.

Dicha herramienta de transformación de programas tiene que analizar el texto de ASTs, y ASTs "anti-parse" (llamado "Prettyprint") al texto. Si IronPython tiene una bonita impresora, eso es lo que necesitas. Si no es así, puede compilar uno con algunos (quizás mucho) esfuerzo; como has observado, esto no es tan fácil como uno podría pensar. Véase mi respuesta Compiling an AST back to source code

Si eso no funciona, nuestra DMS Software Reengineering Toolkit con su Python front end podría hacer el truco. Tiene todas las propiedades anteriores.

0

Siempre que pueda encontrar un archivo de gramática libre de contexto completo y actualizado para Python, puede usar CoCo/R generador de analizador para generar un analizador de Python en C#.

Puede agregar código de producción al archivo de la gramática para completar una estructura de datos en su aplicación C#. Dicha estructura de datos puede contener toda la información que necesita (métodos y sus argumentos, propiedades, constructores, destructores, etc.). Una vez que tenga esta estructura de datos, es solo una tarea de diseñar una interfaz para el usuario y representar esta estructura de datos de manera que sea editable para ellos (esto es más una tarea de diseño que una tarea de programación complicada).

Finalmente, recorra su estructura de datos y escriba un archivo .py.

0

Puede usar el módulo python inspect para imprimir la fuente de un objeto. En su caso: para imprimir la fuente de su módulo, el archivo que acaba de analizar con IronPython. Sin embargo, todavía no he verificado si la inspección funciona con IronPython.

En cuanto a agregar cosas, bueno, es un módulo, ¿verdad? Simplemente puede agregar cosas a un módulo ... Cargaría el módulo y luego lo modificaría, use inspect para ver su impresión y guardarlo en el disco.

Desde su publicación, parece que ya está en lo más profundo de las trincheras y se está divirtiendo, por lo que estaría encantado de ver una publicación aquí sobre cómo resolvió este problema.

0

Para mí, suena más como si estuvieras en el punto en el que introduces todo en una base de datos sqlite y comienzas a editarlo de esa manera. Conectar algunos formularios para editar tablas es más simple para la interfaz de usuario. En ese momento, usted genera nuevos archivos python al descargar sus tablas con algún formato para proporcionar las secuencias de comandos Python circundantes.

SVN/Git/lo que sea puede combinar los cambios actualizados a través de los archivos de python.

Esto es lo que terminé haciendo para mi proyecto en cualquier caso. Empecé a usar Python para conectar los diversos elementos usando sus claves calculadas y luego agregué algunas formas de UI para evitar errores de edición en los archivos de Python.

Cuestiones relacionadas