2010-11-07 6 views
8

Ich habe zwei Dateien mit C-Code, den ich vergleichen möchte. Ich suche nach einem Dienstprogramm, das für jede Datei einen Syntaxbaum erstellt und die Syntaxbäume vergleicht, anstatt nur den Text der Dateien zu vergleichen. Auf diese Weise werden kleinere Unterschiede in Formatierung und Stil ignoriert. Es wäre schön, dem Vergleichstool sogar sagen zu können, Unterschiede wie Variablennamen usw. zu ignorieren.Wie vergleichen Sie zwei Dateien, die C-Code enthalten, basierend auf der Codestruktur, nicht nur auf Textunterschieden?

Korrigieren Sie mich, wenn ich falsch liege, aber diff hat diese Fähigkeit nicht. Ich bin ein Ubuntu-Benutzer. Vielen Dank!

+2

Ist diese Hausaufgabe Plagiatserkennung? Viele Pakete dafür, wenn Sie das suchen. –

+0

Sie können dorthin gelangen, indem Sie das Format der Eingabe normalisieren und dann diffedieren. Das Dienstprogramm "Einzug" ist dafür hervorragend geeignet.Ich kann Ihnen keine Liste mit Optionen von oben geben, aber es kann leere Zeilen verschlingen, Klammerformat und Abstand standardisieren und so weiter. Variablennamen werden sehr viel schwieriger. – Cascabel

+0

Ich nehme an, es könnte für diesen Zweck verwendet werden, aber ich werde es tatsächlich verwenden, um zwei Dateien zu vergleichen, die ich geschrieben habe. Würde es Ihnen etwas ausmachen, die Namen von Plagiatserkennungs-Dienstprogrammen zu posten, mit denen Sie vertraut sind? Vielleicht könnten sie mir helfen. Vielen Dank! –

Antwort

2

Es gibt ein Programm namens codeCompare von devart (http://www.devart.com/codecompare/benefits.html#cc), das die folgende Funktion enthält (Ich weiß, dass es nicht genau das ist, wonach Sie gefragt haben, aber wahrscheinlich kann es dafür verwendet werden).

Die Funktion ist „Struktur-Vergleich“ genannt

Diese Funktionalität ermöglicht es Ihnen, verschiedene Dateirevision durch die presense der Strukturblöcke (Klassen, Felder, Methoden) zu vergleichen. Dabei werden verschiedene Versionen der gleichen Datei unabhängig von ihrem Ziel verglichen.

Struktur Vergleich kann auf die folgenden Sprachen angewendet werden:

  • C#
  • C++
  • Visual Basic
  • JavaScript

(Ich weiß es nicht C enthält , aber vielleicht mit der C++ Version können Sie das Problem lösen)

2

Unser SD Smart Differencer macht genau das, was Sie wollen. Es verwendet Parser in Compiler-Qualität, um Quellcode zu lesen und ASTs für zwei ausgewählte Dateien zu erstellen. Es vergleicht dann die Bäume, die durch die Syntax geleitet werden, so dass es nicht durch Leerzeichen, Layout oder Kommentare verwirrt wird. Weil es die Werte von Konstanten normalisiert, wird es nicht durch die Änderung der Radix oder wie Sie Escape-Sequenzen ausdrücken verwirrt!

Die Deltas werden auf der Ebene der Sprachkonstrukte (Variable, Ausdruck, Anweisung, Deklaration, Funktion, ...) in Bezug auf die Absicht des Programmierers (Löschen, Einfügen, Kopieren, Verschieben) mit dem Identifizieren eines Bezeichners gemeldet wurde in einem geänderten Block einheitlich umbenannt. Die SmartDifferencer hat Versionen für C (in einer Reihe von Dialekten; wenn Sie Compiler-genaue Parsen, der langauge Dialekt zählt) war gut für C++, Java, C#, JavaScript, COBOL, Python und viele andere Sprachen.

Wenn Sie verstehen möchten, wie eine Reihe von Dateien miteinander verwandt sind, akzeptiert unsere SD CloneDR eine sehr große Menge von Dateien und teilt Ihnen mit, was sie gemeinsam haben. Es findet Code, der über den gesamten Satz hinweg kopiert und eingefügt wurde. Sie müssen ihm nicht sagen, wonach er suchen soll; es findet es automatisch. Mit ASTs (wie oben) wird es nicht durch Leerzeichen Änderungen oder Umbenennungen von Bezeichnern getäuscht. Auf der Website gibt es eine Reihe von Beispiel-Clone-Erkennungsberichten für verschiedene Sprachen.

Verwandte Themen