Deklarationen aus Code auslesen

Hallo ihr,

ich suche nach einer Möglichkeit, Strukturdeklarationen aus einer C++ Codedatei (*.cpp) auszulesen. Das Problem ist, dass ich nicht weiß, wonach genau ich im Code suchen soll: Ab wann kann ich mir sicher sein, dass es sich wirklich um die Deklaration einer (neuen) Struktur handelt?
Allein nach dem Wort ‚struct‘ zu suchen, reicht natürlich nicht.

Meine Fragen:
Wie soll ich die Datei lesen? (Wie liest man nur bis zum nächsten Semikolon?)
Wie macht der Compiler das?
Woran erkenne ich eine neue Deklaration?

Danke für eure Hilfe!

Arlecks

also doxygen kann das , fragt sich jetzt eher wofür du das brauchst.
Für dokumentationen bzw auch zum analysieren ist doxygen ein wunderschönes tool. Kost nix :smile:

Danke für die schnelle Antwort!
hab mir doxygen angeschaut,sieht praktisch aus, aber:
ich muss für jedes Element einer Struktur das gleiche abarbeiten (die einzige Variable ist der Name des Elements).
Das dies nicht mir einer Schleife funktioniert, war meine Idee, ein zweites Programm den Code bearbeiten zu lassen. Der Einfachheit halber (zummindest für den Benutzer) sollte dieses Programme alle vorhandenen Strukturen selbst laden und anzeigen können.

Wie auch immer Doxygen das anstellt, den Sourcecode versteh’ ich in 10 Jahren nicht.
Ich erwarte keinen fertigen Code, schon eine Antwort auf die Semikolon-Frage würde mich weiterbringen.

Hallo Arlecks

Wie soll ich die Datei lesen?

Na, mit ofstream oder FILE* oder was Dir lieber ist.

(Wie liest man nur bis zum nächsten Semikolon?)

In einer Schleife rattern solange, bis

if (ch == ';')

true ist. Das ist nicht so schwer, ey?

Es gibt auch Freunde von std::string’s, die dann die Suchfunktion von diesen verwenden.
Ich mache das lieber so:

char\* openText (char \*fileName, char \*mode="rt");
// in der main():
char \*source = openText ("hat\_structs.h");

Die openText() steckt also die gesamte Datei in den char-Zeiger.

Wie macht der Compiler das?

Die schreiben sich halt ein paar Klassen, packen das rein, was die können sollen, und ab dafür. Meist werden Reguläre Ausdrücke eingesetzt. Perl wäre für Text eine gute Alternative: du könntest damit eine Datei mit Deinen struct’s generieren.

Woran erkenne ich eine neue Deklaration?
Allein nach dem Wort ‚struct‘ zu suchen, reicht natürlich
nicht.

Du weisst ja, wie man eine Structure schreibt?
Jetzt suche ich mit strstr() nach den Tokens, die in die Tüte kommen. Jetzt willst Du die „union“ vielleicht auch, kommt auf Dich drauf an.

Mit „struct“ bei C++:

  • Ich finde das Token „struct“ in „source“.
  • nachrücken um die strlen().
  • Das nächste Wort ist der Datentyp.
  • per Schleife nachrücken bis zum ‚{‘.
  • kopieren bis ‚}‘.

Mit „typedef struct“ in C geht es ähnlich, nur dass der Datentyp halt unten dran hängt. Aber du weisst ja Bescheid. Wenn einer C/C++ kann, weiss er auch, wie das geschrieben sein kann. Man muss halt recht fix sein im Umgang mit „char-Zeiger subtrahieren“ etc.

Aber glaube nicht, dass das ein Honiglecken ist. Ich plage mich seit 2,5 Jahren mit meiner CodeParser-Klasse. Mal läuft sie, mal nicht.

lG
Martin B

Hi,
au weia, da hast du dir ja ein kapitales Problem ausgesucht.
Ein Compiler arbeitet auf einer sog. Grammatik, für C++ wäre http://www.csci.csusb.edu/dick/c++std/cd2/gram.html ein Ausgangspunkt. Eine C(++)-Komplikation ist, dass Quellcode eine Mischung aus Präprozessor- und C(++)-Anweisungen ist, die auf unterschiedlichen Grammatiken basieren.
Du weißt genau dann, das du bei einer Deklaration bist, wenn du über Statement im Declaration-Zweig und dann bei class/struct gelandet bist.
Beim Compiler heißen die Ebenen, die so etwas machen, lexikalische und syntaktische Analyse und man nutzt dazu Hilfsmittel wie lex und yacc/bison. Aber dafür, mal eben die Deklarationen zu finden, ist das sehr viel und ziemlich heftige Theorie. Die Gefahr von quick & dirty Programmen ist ohne diese Theorie ist, dass man mit halt nicht alle Strukturen findet, zum Beispiel, wenn sich das struct-Schlüsselwort in einem Makro versteckt, die Struktur nicht benamst ist, die öffnende geschweifte Klammer noch in derselben Zeile, auch auskommentierte structs werden gefunden, …
Vorschläge: du guckst in Wikipedia unter Compiler, dann nach Information zum Thema wie schreibe ich einen Compiler (Code-Generierung und Optimierung brauchst du dafür nicht), oder in die Sourcen von gcc oder alles zusammen. Meiner Schätzung nach suchst du hinterher eine andere Lösung für dein Problem.

cu