Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

1

07.02.2011, 23:37

c++ parser für "autobinder" von Skriptsprachen

Hey,

Hier geht es um ein kleines Programm welches in der Lage ist C-Source zu parsen und anhand dessen automatisch entsprechende "bindings" für eine Skriptsprache zu erstellen (in diesem besonderen Falle Squirrel). Neulich fragte mich einer nach diesem Programm und es kam mir in den Sinn, dass es ggf. auch anderen helfen könnte.

Motivation:
Vor einiger Zeit habe ich mit Skriptsprachen und deren Anbindung an C++ beschäftigt. Dabei sieht das Muster oft sehr ähnlich aus, egal ob python, lua, squirrel usw. Da ich aber an einem sehr großen Projekt mitarbeite, welches viele Methoden/Klassen etc. hat, welche angebunden werden sollte, das aber eine überaus stupide Arbeit ist, dachte ich daran es zu automatisieren. Es gibt einen sehr guten C/C++-Source Parser aber leider nur für den GCC (GCC-XML). Nach längeren Suchen fand ich keine gescheite Lösung und habe daher selbst was zusammengestrickt.
Der Parser ist zwar für squirrel ausgelegt, sollte sich aber leicht auf andere Skriptsprachen umbauen lassen (einfach GenerateBindings umschreiben).

Aktueller Stand:
Ich selbst arbeite schon lange nicht mehr daran, weil die Anbindung erstmal auf Eis gelegt wurde. Für die üblichen Anwendungsfälle sollte der Parser allerdings funktionieren. Natürlich werden wahrscheinlich gleich ein paar kommen und was von boost::spirit etc. sprechen, was wahrscheinlich auch eine wesentlich bessere/stabiliere Lösung ist. Der Parser versagt für die auskommentieren virtual Vererbungen in der test.h.

Exemplarisch Main.cpp (kompletter Source siehe Anhang):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <list>
#include <string>
#include <fstream>
#include <iostream>
#include "parser.h"


int main(int argc, char* argv[])
{
    //parse files
    std::list<std::string> content;
    std::list<std::string> additional_includes;
    std::list<std::string> words_to_ignore;
    Object Root(ROOT, "");

    additional_includes.push_back("list");
    words_to_ignore.push_back("SplitInput");
    words_to_ignore.push_back("GenerateBindings");

    const char *files[] = {"test.h", "SyncSystem.h" };
    for(int counter = 0; counter < 1; counter++)//hier die zahl ändern!
    {
        Root.SubObjects.push_back(Object(DOCUMENT, files[counter]));
        std::ifstream input(files[counter]);
        SplitInput(input, content);
        Parse(content, Root.SubObjects.back());
    }
    Modify(Root, additional_includes, words_to_ignore);
    DebugPrint(Root);

    //generate bindings
    std::ofstream output_header("Bindings.h");
    std::ofstream output_cpp("Bindings.cpp");

    GenerateBindings(Root, output_header, true);
    GenerateBindings(Root, output_cpp, false);

    return 0;
}


Vielleicht ist ja jemand mal in den gleichen "Dilemma" oder jemand interessiert sich intensiver für dieses Thema und möchte es verbessern oder kann es für seinen Anwendungsfall gebrauchen.

P.S: dieser Code kann neben der auto binding Geschichte natürlich auch für das Auffinden von toten Funktionen genutzt werden, wenn z.b. in einer Datei alle wirklich gelinkten Aufrufe drinne stehen (der Borland Builder erstellt z.b. solch eine Datei).
»Nox« hat folgende Datei angehängt:
  • autobinder.zip (12,78 kB - 48 mal heruntergeladen - zuletzt: 22.02.2024, 04:24)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nox« (13.07.2011, 00:21)