PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [GCC] Information zum GCC-C/C++-Front-End


SimonX
2010-03-05, 16:33:39
Hi,

Ich suche allgemeine Information zum C/C++ Front-End vom GCC 4.x.

Ich habe das: http://gcc.gnu.org/onlinedocs/gccint/index.html
bereits gefunden, aber es hilft mir nicht meine allgemeine Fragen zum Output vom Front-End zu beantworten.

Die wichtigsten Fragen sind:
- Kann man den Output vom Front-End benutzen um original C/C++ Code unverändert wieder als C/C++ Code auszugeben? (Inklusive C/C++ Kommentare im Orginal?)
- Hat der Output vom Front-End auch noch detail-Infos von #define Marcro's, so das man auch diese unverändert ausgeben kann?

Kennt jemand vielleicht ein GCC-Developer Forum in dem ich solche Fragen stellen könnte?

Warum stelle ich diese Frage?:

Ich möchte den GCC-Front-End benutzen um ein vollständiges und vernünftiges Reformatieren von C/C++-Code zu implementieren.

Tools wie Uncrustify habe alle ihre Schwächen und nach meinem ersten Einblick in den Code von Uncrustify ist mein Eindruck der, das der C/C++ Parser zu wenig Infos sammelt und dadurch kein vollständiges Reformatieren möglich ist.

Beispiel:

if (a
||b||
c) {
....
}

kann uncrustify nicht wirklich reformatieren. Wenn ich eine maximal Zeilenlänge von 80 Zeichen im style vorgeschrieben habe, dann würde ich dies erwarten:

if (a || b || c) {
........
}

Aber bei uncrustify kommt irgendwas wie:

if ( a
|| b ||
c)
{
.....
}

raus.

Ich glaube, das liegt am Parser, der die eigentlich C/C++ Syntax nur pro Zeile versteht.

Gnafoo
2010-03-05, 17:35:38
Imho ergibt das nicht viel Sinn, so wie du es vorhast. Ein Frontend macht ja eigentlich deutlich mehr, als für eine simple Reformatierung notwendig wäre und selbst wenn du lexikalische und syntaktische Analyse getrennt nutzen kannst, wird dir das vermutlich nicht viel helfen, weil das Frontend die Informationen schlicht nicht benötigt und daher vermutlich verwirft. D. h.:

1.) Üblicherweise werden Kommentare schon im ersten Schritt, nämlich der lexikalischen Analyse verworfen. Das ist für den Compiler ja sowieso nur unnötiger Ballast und kommt daher im erzeugten Tokenstrom normal nicht mehr vor.

2.) Makros werden vor der eigentlichen Übersetzung vom Präprozessor ersetzt. D. h. das Frontend erhält bereits den Quellcode mit eingesetzten Makros und der Compiler braucht sich nicht mehr darum zu kümmern, wird sie also vermutlich ebenso verwerfen (wenn sie nach dem Präprozessor überhaupt noch da sind).

Vermutlich wäre es einfacher, ANTLR (oder einen beliebigen anderen Parser-Generator) herzunehmen und eine Parser-Definition für C/C++ zu suchen (z. B. http://www.antlr.org/grammar/list), die man ggf. an die eigenen Ansprüche anpassen kann. Dann kriegt man direkt einen Syntaxbaum und kann mit einigen Anpassungen vermutlich auch die Kommentare und Makros darin unterbringen.

Edit: oder man sucht nach einem besseren Code-Formatter ^^.

Coda
2010-03-05, 17:38:42
Nach dem Präprozessor sind natürlich keine Makros mehr da.

C/C++ Parsen ist nicht einfach, vor allem wenn man auch noch die includes und Makros berücksichtigen will. Als freie Präprozessor-Implementierung bietet sich dazu aber boost::wave an.

Gast
2010-03-05, 18:04:26
der gcc hat ne mailingliste wo du fragen kannst