2011-10-27 5 views
5

Sto lavorando su alcuni strumenti per un gioco che sto realizzando. Gli strumenti servono come front end per semplificare la modifica dei file di gioco. Molti dei file sono file di script Python. Per esempio, io ho un file Items.py che contiene la seguente (minimizzato per esempio)Manipolazione di un file Python da 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)) 

come ho già detto, voglio fornire un front-end per la modifica di questo file senza l'esigenza che un editor di sapere python/modificare il file direttamente. Il mio editore ha bisogno di essere in grado di:

  1. Trova ed elenca tutti i tipi di classe (in questo esempio, sarebbe solo Articolo Sceneggiato)
  2. Trova ed elenca tutti gli elementi creati (in questo caso c'e' d solo uno, Cristallo abbondante). Avrei bisogno di trovare il tipo (in questo caseScriptedItem) e tutti i valori dei parametri
  3. Permetti la modifica dei parametri e la creazione/rimozione di elementi.

Per fare ciò, ho iniziato a scrivere il mio parser, cercando la parola chiave class e quando queste classi registrate sono utilizzate per costruire oggetti. Questo ha funzionato per dati semplici, ma quando ho iniziato a utilizzare classi con costruttori complessi (elenchi, mappe, ecc.) È diventato sempre più difficile analizzare correttamente.

Dopo aver cercato in giro, ho trovato che IronPython ha reso facile l'analisi dei file Python, quindi è quello che ho fatto. Una volta creato l'Abstract Syntax Tree ho usato PythonWalkers per identificare e trovare tutte le informazioni di cui ho bisogno. Questo funziona perfettamente per la lettura dei dati, ma non vedo un modo semplice per inserire dati aggiornati nel file Python. Per quanto posso dire, non c'è modo di modificare i valori nell'AST e molto meno di convertire l'AST in un file di script. Se sbaglio, mi piacerebbe che qualcuno mi dicesse come potrei farlo. Quello che dovrei fare ora è cercare nel file finché non trovo la linea corretta, quindi provare a inserire i dati nel costruttore, assicurando l'ordine corretto.

C'è qualche soluzione ovvia che non vedo? Dovrei continuare a lavorare sul mio parser e farlo supportare tipi di dati più complessi? Io davvero se l'avessi con il parser IronPython, ma non pensavo a quanto sarebbe difficile spingere nuovamente i dati modificati nel file.

Tutti i suggerimenti sarebbero apprezzati

risposta

1

Volete una source-to-source program transformation tool.

Tale strumento analizza una lingua in una struttura di dati interna (invariabilmente un AST), consente di modificare l'AST e quindi può rigenerare il testo di origine dall'AST modificato senza modificare sostanzialmente nulla sull'origine, tranne dove cambia l'AST sono stati fatti.

Tale strumento di trasformazione del programma deve analizzare il testo in AST e "anti-parse" (chiamati "Prettyprint") in testo. Se IronPython ha una bellaprinter, è quello che ti serve. In caso contrario, puoi costruirne uno con alcuni (forse molti) sforzi; come hai osservato, non è così facile come si potrebbe pensare. Vedere la mia risposta Compiling an AST back to source code

Se questo non funziona, la nostra DMS Software Reengineering Toolkit con la sua Python front end potrebbe fare il trucco. Ha tutte le proprietà sopra.

0

A patto che sia possibile trovare un file di grammatica libero da contesto completo e aggiornato per Python, è possibile utilizzare il generatore di parser CoCo/R per generare un parser python in C#.

È possibile aggiungere il codice di produzione al file di grammatica stesso per popolare una struttura di dati nell'app C#. Detta struttura dati può contenere tutte le informazioni di cui hai bisogno (metodi e relativi argomenti, proprietà, costruttori, distruttori, ecc.). Una volta che hai questa struttura dati, è solo un compito di progettare un front-end per l'utente e rappresentare questa struttura dati in un modo che possa renderlo modificabile (è più un compito di progettazione che una complicata attività di programmazione).

Infine, scorrere la struttura dei dati e scrivere un file .py.

0

È possibile utilizzare il modulo python inspect per stampare l'origine di un oggetto. Nel tuo caso: per stampare la fonte del tuo modulo - il file che hai appena analizzato con IronPython. Tuttavia, non ho ancora verificato se Inspect funziona con IronPython.

Come aggiungere cose, beh, è ​​un modulo, giusto? Puoi semplicemente aggiungere cose ad un modulo ... Carico il modulo e poi lo altero, usa inspect per visualizzarlo e salvarlo su disco.

Dal tuo post, sembra che tu sia già nel profondo delle trincee e che ti diverta, quindi sarei davvero felice di vedere un post qui su come hai risolto questo problema!

0

A me sembra più come se foste al punto in cui inserite tutto in un database SQLite e iniziate a modificarlo in questo modo. Collegando alcuni moduli per modificare le tabelle è più semplice per l'interfaccia utente. A quel punto generi nuovi file Python scaricando le tue tabelle con un po 'di formattazione per fornire gli script Python circostanti.

SVN/Git/qualsiasi cosa può unire le modifiche aggiornate tramite i file python.

Questo è quello che ho fatto per il mio progetto in ogni caso. Ho iniziato a usare python per collegare i vari elementi usando le loro chiavi calcolate e poi ho aggiunto alcune interfacce utente per evitare errori di modifica nei file python.