C++-Quellcode-Formatierer

Ich codiere ein Tool zum Analysieren von C++-Code. Ich möchte nicht am Ende einen halben Compiler codieren. Obwohl mir Clang bekannt ist, ist das für meine Zwecke zu viel.

Ich habe von Hand geparst, bin aber auf einen zu vielen Codierungsstil gestoßen.

Ich suche ein Tool, das C++-Code analysiert, mit nur einem wichtigen Faktor:

Es muss in der Lage sein, die gesamte Funktionsdeklaration in einer einzigen Zeile unterzubringen.

Also Dinge wie

unsigned
int
myclass::
myfunc
(int x;
int y)
{
}

und all seinen vielen Variationen, werden sollte

unsigned int myclass::myfunc(int x; int y)
{
}

Das ist alles, was ich für dieses spezielle Projekt brauche - die Fähigkeit, jede Funktion in einer Datei zu finden und ihren Rückgabetyp zu erhalten.

Schön, wenn es Linux ist, aber ich kann mit Windows leben.

GUI wäre nett, mit Vorschau als Bonus.

Der Stapelmodus wäre schön, einschließlich der Möglichkeit, ein bestimmtes Verzeichnis rekursiv zu verarbeiten.

Aber keines dieser netten Elemente ist obligatorisch, nur die single line for the function declaration requirement is.

Sie können die kostenlose Visual Studio Community Edition verwenden. Es unterstützt C++ und die Codeformatierung ist sehr gut und kann bis zu einem gewissen Grad an Ihre Vorlieben angepasst werden.
Aber unterstützt es meine einzige Anforderung?
Teilweise. Ersetzen Sie alle \ndurch [space], STRG+A, STRG+K, dann STRG+F zum Formatieren, dann ersetzen Sie alle {durch \n{und ersetzen Sie alle }durch \n}. Dies kann per Skript ausgeführt werden, um alle Dateien zu durchlaufen.
Community Edition verfügt auch über eine Webversion, auf der eine Webseite ausgeführt wird, die mit praktisch allen Betriebssystemen kompatibel ist
@Franck, hast du eine URL dafür?
hier die Hauptseite. Rechts unten können Sie sich für 5 kostenlose Basislizenzen anmelden. Der gesamte Code wurde mit Git gespeichert, sodass eine integrierte Quellcodeverwaltung vorhanden ist
„Ich suche ein Tool, das C++-Code analysiert, mit nur einem wichtigen Faktor: Es muss in der Lage sein, die gesamte Funktionsdeklaration in einer einzigen Zeile abzulegen.“ Dies ist kein Parser. Vielleicht suchen Sie nach einem C++-Parser, mit dem Sie einen hübschen Drucker bauen können. Aber das sagt dein Titel nicht aus. Dann sagen Sie: „Sie müssen jede Funktion finden und ihren Rückgabetyp erhalten.“ Also, was wollen Sie? Wenn Sie den Rückgabetyp tatsächlich möchten, benötigen Sie auch eine Vorverarbeitung und Symboltabellen. Diese SR-Anfrage ist sehr schlecht geschrieben.
@Mawg: ... Also, was meinst du mit "du willst den Rückgabetyp"? Sie möchten nur die Zeichenkette, die zum Deklarieren des Typs verwendet wird, oder etwas Tieferes? Wenn der Funktionsheader "int foo(...)" ist, dann ist der Rückgabetyp offensichtlich "int". Was ist der Rückgabetyp für "T foo(...)"; ist es "T" oder die Typedef hinter T? Wie wäre es mit "A:B:C:T foo(...)"? Was ist, wenn der Rückgabetyp ein Vorlagenaufruf ist? Ein Makroaufruf? Beinhaltet eine Präpräprozessor-Bedingung?
Wow! Das ist eine schwierige Frage. In unserem Code gibt es keine Vorlagen, daher würde ein einfacher Rückgabetyp ausreichen. Aber das ist ein sehr guter Punkt. Es sieht so aus, als müsste ich am Ende einen halben Compiler codieren :-(
@Mawg: Sie haben die Frage, was Sie für den Rückgabetyp wünschen, nicht beantwortet. Es könnte hilfreich sein, wenn Sie uns auch sagen, was Sie mit dem Ergebnis machen werden. Ohne eine Antwort ist es für den Rest von uns nicht möglich, die Nützlichkeit von Antworten zu beurteilen (z. B. „astyle“ oder gnu indent).
Ich bin seit einiger Zeit in einem neuen Job, daher geht es hier nur um historisches Interesse. IIRC, ich wollte Code parsen und Code-Stubs für die Verwendung in Unit-Tests generieren. Für typisierte Funktionen wollte ich eine return-Anweisung hinzufügen, um den Compiler bei Laune zu halten. Allerdings gehe ich nie so weit, da ich einen Parser finden könnte, der den Code verarbeiten könnte

Antworten (3)

http://astyle.sourceforge.net/

aStyle - keine Konkurrenz. Ich benutze das schon seit einiger Zeit, da ich auf dem Weg zur Arbeit eher Funktionen in Notepad++ schreibe und es dann vor dem Einbinden in Projekte damit verschönere - es macht meiner Meinung nach wirklich einen tollen Job.

unterstützt es meine einzige Anforderung? Wenn das so ist, wie?
Sechs Monate und keine Beweise dafür, dass dies die Forderung von OP stützt. Abwertung als "keine qualitativ hochwertige Antwort".

GNU Indent kann damit umgehen:

indent b.c

Eingang:

unsigned
int
myfunc
(int x;
int y)
{
}

Ausgang:

unsigned int myfunc (int x; int y)
{
}

Ich möchte nicht am Ende einen halben Compiler codieren

Es ist nicht so kompliziert für die Funktion, die Sie anfordern. Hier ist ein Perl- Skript, um Ihnen den Einstieg zu erleichtern.

Die Arrays keywords_nospaceund keywords_spaceenthalten die Wörter/Zeichen am Ende der Zeilen, die Sie kombinieren möchten. Die erste dient zum Kombinieren ohne Leerzeichen, und die zweite fügt Leerzeichen hinzu.

use strict;
use warnings;

open(my $in, "<", $ARGV[0]) or die "Can't open file: $!";
open(my $out, ">", "restructured_$ARGV[0]");

my $word;
my @keywords_nospace = ("::","myfunc");
my @keywords_space = ("unsigned","int",";");

while (<$in>) {
   for $word (@keywords_nospace) {chomp if (/\Q$word\E$/i);} # removes trailing spaces and newline
   for $word (@keywords_space)
     {
       if (/\Q$word\E$/i)
     {
       chomp; # Removes trailing spaces and newline
       $_ = "$_ "; # Add a space at the end of the line
     }
     }
  print $out $_;
}

Sie können beliebig viele Schlüsselwörter hinzufügen. Speichern Sie in einer .plDatei und führen Sie sie in der Befehlszeile aus mit:

perl script_name.pl input.cpp

Dies sollte eine neue Datei im Verzeichnis mit dem Namen restructured_input.cpp. Ich habe es an Ihrer Beispielfunktion getestet und die gewünschte Ausgabe erhalten.

Nur weil dies an seinem spezifischen Beispiel "funktioniert", ist dies nicht allgemein. Sie können kein beliebiges Stück C++-Code "umformatieren", ohne einen vollständigen C++-Parser zu haben. Makros, Präprozessor-Bedingungen, Typen, Vorlagenspezifikationen (insbesondere ">>"), Lambda-Deklarationen, Verschachtelungen, was auch immer, alles wird das verkomplizieren, was in der "Funktionskopfzeile" weit über das hinausgeht, was dieses Skript (oder jedes Skript, das nicht im Wesentlichen analysieren) tun können.
@IraBaxter Es soll nicht allgemein sein . Ich verstehe, dass tatsächliche Programme komplexer sind, aber das OP hat nach einer sehr spezifischen Anforderung gefragt und ein sehr einfaches Beispiel geliefert. Die Antwort stimmt mit diesen überein und dient nur dem Zweck zu zeigen, wie es für so einfache Fälle gemacht werden kann. Wenn das OP weitere Anforderungen benötigt, liegt es an ihm, diese in der Frage gemäß den Regeln dieser Site anzugeben.
Er sagte, ich suche ein Tool, das C++-Code analysiert . Ich denke, es ist vernünftig anzunehmen, dass er beliebigen C++-Code verarbeiten wollte, nicht nur das Beispiel.