Funktions definition in C++ Queltext suchen



  • Hallo,

    Ich wollte mit einem Programm (C++, boost) in einer Quelltext Datei (C++) nach allen Funktionen suchen (so dass ich die Zeile habe in der das passiert).

    Jetzt wollte ich mal fragen wie ich das am besten anstelle.
    Also nicht das lesen der Quelltext Datei sondern,
    das suchen eines C++ Funktions-Kopfes.

    RegEx? Gibt es eine Alternative? Damit stehe ich generell eher auf Kriegsfuß.



  • Du möchtest einen C++-Parser. Du nimmst die C++-Grammatik, fütterst die einem Parser und schnappst dir die "function-definition"s. Ist ein bisschen umständlich das zum laufen zu kriegen.
    Alternativ reicht es vielleicht auch nach sowas wie "([irgendwas])[whitespaces]{" zu suchen. Ein Lexer kann da helfen, ist aber auch nichts anderes als regex. Sowas kriegt man aber auch von Hand mit string::find gebaut.
    IDE's können sowas von Hause aus.



  • Yummi schrieb:

    Hallo,
    Ich wollte mit einem Programm (C++, boost) in einer Quelltext Datei (C++) nach allen Funktionen suchen (so dass ich die Zeile habe in der das passiert).

    Schwieriges Unterfangen, bis alles passt. Vielleicht einfacher, in jeder Funktion als erster Zeile ein passendes Makro aufrufen.



  • Oder Clang-Lib und den AST abmarschieren! Glaube der speichert auch die Zeile mit, usw...



  • EinerVonUns schrieb:

    Oder Clang-Lib und den AST abmarschieren! Glaube der speichert auch die Zeile mit, usw...

    Oder einfach clang-check mit den richtigen Argumenten aufrufen.



  • volkard schrieb:

    Schwieriges Unterfangen, bis alles passt. Vielleicht einfacher, in jeder Funktion als erster Zeile ein passendes Makro aufrufen.

    Und wie krieg ich das Makro da hin?
    Den Quell Code der zu untersuchenden Datei kann ich ja nicht ändern ... oder meinst du etwas anderes?

    EinerVonUns schrieb:

    Oder Clang-Lib und den AST abmarschieren! Glaube der speichert auch die Zeile mit, usw...

    Sagt mir jetzt beides nicht wirklich was ...
    Ziel ist es auch:
    a) nicht noch weitere Libs zu verwenden
    b) es weiterhin mit jemdem c++ compiler kompiliert.
    (fast google: hängt das in llvm?)

    PS: Ich passe damit ein Programm an, welches ich nicht selbst erstellt habe.



  • Was suchst Du jetzt eigentlich genau? Funktionsaufrufe? Funktionsdeklarationen? Funktionsdefinitionen?
    Und warum muss das aus einem selbst geschriebenen Programm geschehen? Reichen nicht andere Tools aus, das klingt doch jetzt eher nach einem Einmal-Refactoring?
    Das Problem ist, je nachdem, was Du nun genau erreichen möchtest, das kann man aus Deinem OP ja nicht ersehen, sehr kompliziert. So kompliziert, dass man da nicht fix mal mit C++ und Boost nen Zehn- (Hundert-, Tausend-, Hundertausend-)-Zeiler schreibt.
    Aber Du könntest mit C++ und Boost ein C++-Compiler-Frontend programmieren, das müsste schon genügen. Dann brauchst Du keine anderen Bibliotheken.



  • yummi schrieb:

    volkard schrieb:

    Schwieriges Unterfangen, bis alles passt. Vielleicht einfacher, in jeder Funktion als erster Zeile ein passendes Makro aufrufen.

    Und wie krieg ich das Makro da hin?
    Den Quell Code der zu untersuchenden Datei kann ich ja nicht ändern

    Nicht? Dachte, es sei Deine C++-Datei.

    yummi schrieb:

    ... oder meinst du etwas anderes?

    Ich meinte sowas wie

    #ifdef COLLECT_FUNCTIONS
    #define COLLECT\
    static bool collected=(ofstream("functions.txt")<<__FILE<<'\t'<<__LINE<<'\t'<<__FUNCTION);
    #else
    #define COLLECT
    #endif
    

Log in to reply