2011-10-27 14 views
5

Pracuję nad narzędziami do gry, którą tworzę. Narzędzia służą jako prosty interfejs do tworzenia plików z edycjami. Kilka plików to pliki skryptów Pythona. Na przykład, mam plik Items.py który zawiera następujące (zminimalizowany na przykład)Manipulowanie plikiem Pythona z 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)) 

jak wspomniałem, chcę zapewnić przód do edytowania tego pliku bez wymagasz edytor wiedzieć Pythona/edytować plik bezpośrednio. Mój wydawca musi być w stanie:

  1. Znajdź i wymienić wszystkie typy klas (w tym przykładzie, że to będzie tylko Scripted Element)
  2. Znajdź i wymienić wszystkie utworzone elementy (w tym przypadku” d tylko być jednym, Abounding Crystal). Musiałbym znaleźć typ (w tym caseScriptedItem) i wszystkie wartości parametrów
  3. Zezwalać na edycję parametrów i tworzenie/usuwanie elementów.

Aby to zrobić, zacząłem pisać własny parser, szukając słowa kluczowego klasy i kiedy te nagrane klasy są używane do konstruowania obiektów. To działało dla prostych danych, ale kiedy zacząłem używać klas z złożonymi konstruktorami (listami, mapami itp.), To stało się coraz trudniejsze do prawidłowego analizowania.

Po przeszukaniu znalazłem IronPythona, który ułatwił przetwarzanie plików Pythona, więc to właśnie zrobiłem. Po zbudowaniu drzewa składni abstrakcyjnej użyłem PythonWalkers, aby zidentyfikować i znaleźć wszystkie potrzebne informacje. Działa to doskonale do odczytu w danych, ale nie widzę łatwego sposobu przesyłania zaktualizowanych danych do pliku Pythona. O ile mogę powiedzieć, nie ma sposobu, aby zmienić wartości w AST, a tym bardziej, aby przekonwertować AST z powrotem do pliku skryptu. Jeśli się mylę, chciałbym, aby ktoś mi powiedział, jak mogę to zrobić. Teraz muszę przeszukać plik, dopóki nie znajdę poprawnej linii, a następnie spróbuj przesłać dane do konstruktora, zapewniając poprawną kolejność.

Czy istnieje jakieś oczywiste rozwiązanie, którego nie widzę? Czy powinienem po prostu kontynuować pracę nad moim parserem i sprawić, by obsługiwał on bardziej złożone typy danych? Naprawdę, chociaż miałem go z parserem IronPython, ale nie myślałem o tym, jak trudno byłoby wprowadzić zmodyfikowane dane z powrotem do pliku.

Wszelkie sugestie będą mile widziane

Odpowiedz

1

Chcesz źródła do źródła program transformation tool.

Takie narzędzie analizuje język do wewnętrznej struktury danych (niezmiennie AST), pozwala modyfikować AST, a następnie może zregenerować tekst źródłowy ze zmodyfikowanej ASP, nie zmieniając w zasadzie nic na temat źródła, z wyjątkiem sytuacji, gdy zmiany AST zostały wykonane.

Takie narzędzie do transformacji programów musi przetworzyć tekst na AST, a "antyparsować" (zwane "Prettyprint") AST na tekst. Jeśli IronPython ma ładny wskaźnik, to właśnie tego potrzebujesz. Jeśli nie, możesz go zbudować, wykonując kilka (może dużo) wysiłku; jak zauważyliście, nie jest to tak łatwe, jak mogłoby się wydawać. Patrz moja odpowiedź Compiling an AST back to source code

Jeśli to nie zadziała, nasz DMS Software Reengineering Toolkit z jego Python front end może załatwić sprawę. Ma wszystkie powyższe właściwości.

0

Pod warunkiem, że można znaleźć kompletny i aktualny plik gramatyki bez kontekstu dla Pythona, można użyć generatora analizatora CoCo/R do wygenerowania parsera python w języku C#.

Możesz dodać kod produkcyjny do pliku gramatyki, aby wypełnić strukturę danych w aplikacji C#. Wspomniana struktura danych może zawierać wszystkie potrzebne informacje (metody i ich argumenty, właściwości, konstruktory, destruktory itp.). Kiedy już posiadasz tę strukturę danych, jest to tylko zadanie zaprojektowania interfejsu użytkownika i reprezentowania tej struktury danych w sposób, który umożliwia im edycję (jest to raczej zadanie projektowe niż skomplikowane zadanie programistyczne).

Na koniec przejrzyj strukturę danych i wypisz plik .py.

0

Możesz użyć modułu python inspect, aby wydrukować źródło obiektu. W twoim przypadku: Aby wydrukować źródło twojego modułu - plik, który właśnie sparsowałeś w IronPython. Nie sprawdziłem jeszcze, czy inspekcja działa z IronPythonem.

Co do dodawania rzeczy, to jest moduł, prawda? Możesz po prostu dodać elementy do modułu ... Załadowałbym moduł, a następnie go zmodyfikowałem, użyj inspect, aby wyświetlić go i zapisać na dysku.

Ze swojego wpisu wygląda na to, że jesteś już głęboko w okopach i dobrze się bawisz, więc byłbym naprawdę szczęśliwy, widząc tutaj post, w jaki sposób rozwiązałeś ten problem!

0

Dla mnie brzmi to bardziej jakbyś był w punkcie, w którym wpakowałeś to wszystko do bazy danych SQLite i zacząłem ją edytować w ten sposób. Podłączanie formularzy do edycji tabel jest prostsze w przypadku interfejsu użytkownika. W tym momencie generujesz nowe pliki Pythona, wyrzucając tabele z pewnym formatowaniem, aby dostarczyć otaczające skrypty Pythona.

SVN/Git/cokolwiek może scalić zaktualizowane zmiany za pośrednictwem plików Pythona.

Tak właśnie zrobiłem dla mojego projektu. Zacząłem używać Pythona do łączenia różnych elementów za pomocą ich obliczonych kluczy, a następnie dodałem trochę interfejsu formularzy, aby uniknąć edycji błędów w plikach Pythona.