Wie man auf Quellcode greift, ohne Kommentare zu erhalten

10

Ich suche nach einer Möglichkeit, nach Quellcode zu suchen, ohne aufgrund von Kommentaren manchmal falsch positiv zu sein. Zum Beispiel, wenn ich auf foo nach diesem .c-Quellcode suche:

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

Ein Naiver grepwird 3 Vorkommen finden, bei denen ich nur eines möchte. Ich habe dies auf StackOverflow gesehen, aber es erfüllt nicht meine Anforderungen: PHP ist auf der Plattform nicht verfügbar. Ich habe diesen Weg auch für einzeilige Kommentare gefunden, aber er löst nur einen Teil meines Problems.

Ich muss klassische Skript-Tools (awk, sed, bash, grep usw.) verwenden und es muss schnell sein, selbst wenn es Tausende von Dateien gibt.

Wissen Sie jetzt, ob und wie es möglich ist, den Quellcode und nur den Quellcode zu erfassen?

Coren
quelle
3
Das Erstellen einer Tags-Tabelle ist möglicherweise ein besserer Ansatz, je nachdem, was Sie tun.
Gilles 'SO - hör auf böse zu sein'

Antworten:

10

Sie können einen naiven Ansatz ausprobieren, um Nicht-Kommentare wie diesen abzugleichen:

 $ egrep -v "^(//|/\*| \*)" sourcecode

Dies wird nur inverse Spiel gegen Präfix Kommentare - die Zeilen beginnend mit entweder //, /*, *oder */- und daher wird es nicht blockiert auslassen , die mit dem sind auf Kommentar /*und */Paar.


quelle
Leicht geändert, um für eingerückte Kommentare zu funktionieren: $ egrep -v "^ [[: space:]] * ((// | / * | *)" Quellcode
mbonness
11

grep arbeitet mit reinem Text und weiß nichts über die zugrunde liegende Syntax Ihres C-Programms. Um nicht in Kommentaren zu suchen, haben Sie mehrere Möglichkeiten:

  1. Entfernen Sie C-Kommentare vor der Suche. gcc -fpreprocessed -dD -E yourfile.cWeitere Informationen finden Sie unter /programming/2394017/remove-comments-from-cc-code

  2. Schreiben / verwenden Sie einige hackige, halbwegs funktionierende Skripte, wie Sie sie bereits gefunden haben (z. B. überspringen Sie Zeilen, die mit //oder beginnen /*), um die Details aller möglichen C / C ++ - Kommentare zu verarbeiten (siehe auch den vorherigen Link für einige beängstigende Testfälle). . Dann haben Sie möglicherweise immer noch falsch positive Ergebnisse, müssen jedoch nichts vorverarbeiten.

  3. Verwenden Sie erweiterte Tools für die "semantische Suche" im Code. Ich habe "coccigrep" gefunden: http://home.regit.org/software/coccigrep/ Diese Art von Tools ermöglicht die Suche nach bestimmten Sprachanweisungen (dh eine Aktualisierung einer Struktur mit Vorname) und lässt die Kommentare sicher fallen.

sterben_sphynx
quelle
1

Hier ist eine spezielle Variante für alle anderen, die zu spät zu dieser Frage kommen:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

Eine Liste der C-Quelldateien

ls -1 src/*.c

werden an xargs weitergeleitet, das den Präprozessor in einer untergeordneten Shell ausführt

gcc -fpreprocessed -dD -E {} 2>&1

welches anschließend in einen gewünschten grep-Befehl geleitet wird

grep -wi -e one -e two -e three -n

Diese wird dann in sed weitergeleitet, um jeder Zeile den aktuellen Dateinamen voranzustellen

sed 's:^:{}\::'

Schließlich werden alle wiederholten Leerzeilen mit cat: zu einzelnen Zeilen zusammengefasst:

cat -s

Dies funktioniert auf einem RHEL6-System, aber ich gehe davon aus, dass es allgemein genug für andere * nix-Systeme ist.

David A. Pimentel
quelle