C ++ - Codegenerierung mit Python

8

Kann mir jemand auf eine Dokumentation hinweisen, wie man Skripte in Python (oder Perl oder einer anderen Linux-freundlichen Skriptsprache) schreibt, die C ++ - Code aus XML- oder py-Dateien über die Befehlszeile erzeugen. Ich würde gerne in der Lage sein, einige XML-Dateien zu schreiben und dann einen Shell-Befehl auszuführen, der diese Dateien liest und .h-Dateien mit vollständig inlined Funktionen erzeugt, z. Streaming-Operatoren, Konstruktoren usw.

    
user357525 03.06.2010, 13:57
quelle

8 Antworten

9

Wenn Sie dies einfach mit Standard-Python-Kram machen wollen, können Sie versuchen, Vorlagendateien zu erstellen, die die Python-3-Zeichenkettenformatierung verwenden. Eine Klassenvorlage könnte beispielsweise so aussehen:

%Vor%

Dann ist Ihr Python-Code sehr einfach:

%Vor%

Natürlich können Sie viele weitere Felder neben 'className' mit demselben Trick hinzufügen. Wenn Sie keine Dinge wie die Erzeugung von bedingten Codes benötigen, können Sie aus so etwas ganz einfach eine Menge Geld herausholen.

    
Ross 20.07.2012 15:56
quelle
2

Ich fürchte, Sie werden keine bereits eingebaute Lösung finden, die Ihre speziellen XML- oder Python-Dateien übernimmt und sie "out-of-the-box" in Ihre benötigte Ausgabe umwandelt.

Sie müssen das Parsen, die Datenverarbeitung und die Ausgabe selbst durchführen. Nicht ganz allein. Hier sind einige Hinweise zum Parsen und zur Ausgabe.

Python kommt mit zwei verschiedenen XML-Parsern ( SAX und DOM - Scrollt runter, um einige Beispiele zu sehen) . Sie müssen einen von ihnen verwenden, um die Quelldateien zu lesen.

Um die Ausgabe einfacher zu erstellen, können Sie wahrscheinlich eine Templating-Bibliothek wie StringTemplate verwenden oder einfach den Code manuell generieren. wenn es klein ist.

    
kikito 03.06.2010 14:42
quelle
1

Sie können sich Shedskin ansehen, ein Projekt, das C ++ - Code aus Python-Code generiert / p>

Je nachdem, was Ihre Gründe sind, kann es ein wenig sinnlos sein, wie Satanicpuppy es ausdrückte.

    
Wayne Werner 03.06.2010 14:14
quelle
1

Sieh dir Gepard an. Es ist eine Vorlagen-Engine, die in Python geschrieben wurde.

    
jopa 03.06.2010 14:16
quelle
1

Vor ein paar Jahren habe ich an einem Projekt gearbeitet, das die gemeinsame Nutzung von Shared-Memory-Management für große Simulationssysteme vereinfacht. Wir verwendeten einen verwandten Ansatz, bei dem das Layout der Daten im Shared Memory in XML-Dateien und einem in python geschriebenen Code-Generator definiert wurde, die XML-Dateien lesen und eine Reihe von Header-Dateien ausgeben, die Strukturen und zugehörige Funktionen / Operatoren / etc definieren XML-Beschreibung Zu der Zeit sah ich mir mehrere Templating-Engines an und zu meiner Überraschung stellte ich fest, dass es einfacher und sehr unkompliziert war, es einfach "von Hand" zu machen.

Wenn Sie die XML-Datei lesen, füllen Sie einfach eine Reihe von Datenstrukturen aus, die Ihrem Code entsprechen. Header-Dateiobjekte enthalten Klassen und Klassen enthalten Variablen (die anderen Klassen angehören können). Geben Sie jedem Objekt eine printSelf() -Methode, die über ihren Inhalt iteriert und printSelf() für jedes Objekt aufruft, das sie enthält.

Es scheint zunächst etwas entmutigend, aber wenn Sie erst einmal angefangen haben, ist es ziemlich einfach. Oh, und ein Tipp, der hilft, mit dem generierten Code, fügen Sie ein Einrückungsargument zu printSelf() hinzu und erhöhen Sie es auf jeder Ebene. Es macht den generierten Code viel einfacher zu lesen.

    
Rakis 03.06.2010 14:45
quelle
1

Aus meiner eigenen Erfahrung kann ich Jinja2 ( Ссылка ) empfehlen. Obwohl die Hauptzielsprache von Jinja HTML ist, funktioniert es ziemlich gut für C ++. Und das ist nicht nur meine Meinung, siehe Ссылка :). Es gibt eine eigenständige Version ( Ссылка ), die nützlich sein könnte, da Jinja2 selbst nur eine API ist. Ich verwende die Standalone-Version für mein Projekt hier Ссылка mit angepassten Umgebungseinstellungen, so dass die öffnenden und schließenden Tags von Jinja2 übereinstimmen mehr C ++ Stil.

    
TomSmartBishop 01.09.2016 03:05
quelle
0

Ich arbeite tatsächlich mit einer alten Entwicklungsumgebung, die etwas ähnliches tut. 4GL und viele Modelle des alten 4GL-Paradigmas verwenden C und C ++ als die Sprache, in der sie ihren generierten Code ausgeben.

4GL ist ziemlich resigniert auf den Staubhaufen der Geschichte. Das Problem ist, dass Sie bei der Generierung des C-Codes durch die Maschine die Leistungssteigerungen verlieren, die sich aus der Verwendung von C ergeben hätten, und der Code ist äußerst schwierig zu warten. Könnte auch nur das Programm in Python schreiben.

    
Satanicpuppy 03.06.2010 14:08
quelle
0

Ich hoffe, es wird für jemanden nützlich sein (Sie können Win32 Zwischenablage verwenden, um Daten einzulesen)

%Vor%

Ausgabe:

%Vor%     
kris2k 08.01.2018 20:34
quelle

Tags und Links