-1

Ich möchte einen Code schreiben, der Ähnlichkeiten zwischen Code-Dateien finden kann (vielleicht Ähnlichkeit nach Prozentsatz finden oder zumindest "raten", welche Dateien kopiert werden könnten), ich führe 30 Dateien und maximal 500 Zeilen aus Datei. Ich möchte doppelte Dateien identifizieren (oder solche, die verdächtigt werden, dupliziert zu werden).Doppelte Programme

begegne ich mehrere Probleme:

  • Abstand:

diese 2 Probleme ohne Kommentare oder andere Kommentare Datei mit Kommentaren gegen file: ein Code kann mehrere Leerzeichen oder Zeilenumbrüche

  • Kommentare haben Ich denke, ich kann lösen, indem ich alle Leerzeichen und Zeilenumbrüche und Kommentare aus dem Code entfernen, aber dann finde ich die folgenden

    • Dateien, die zu "verstecken" die Ähnlichkeit versuchen, die folgenden 2 folgenden C-Dateien als Beispiel

    Code 1:

    void main() 
    { 
        int x; 
        int y; 
        scanf("%d", &x); 
        switch(x) 
        { 
         case 1: 
         //some code 
         break; 
    
         case 2: 
         //some code 
         break; 
        } 
    } 
    

    Code 2:

    #define ONE 1 
    #define TWO 2 
    void main() 
    { 
        int a, b; 
        scanf("%d", &a); 
        switch(a) 
        { 
         case ONE: 
         //some code 
         break; 
    
         case TWO: 
         //some code 
         break; 
        } 
    } 
    

    Ich würde jede Hilfe (vielleicht mit vorhandenen Tools oder durch einen Algorithmus vorschlagen)

    Danke.

  • Antwort

    0

    Sie könnten interessiert sein zu betrachten MOSS, ein System in Stanford entwickelt, das versucht, genau Ihr Problem zu lösen.

    Wenn Sie Ihren eigenen Ansatz zu entwickeln, aber neugierig sind, hier einige Ideen, die Probleme, die Sie bisher genannten Adresse:

    1. Analysieren Sie den Code in einem AST, so dass Sie leicht Code manipulieren kann als eine Datenstruktur und ignorieren Probleme wie Leerzeichen.
    2. Sie können Änderungen in Variablennamen erkennen, indem Sie die Variablen selbst umbenennen, indem Sie ein Schema verwenden, das eine eindeutige Benennung basierend auf der Deklarationsreihenfolge und dem Gültigkeitsbereich garantiert. Für einige Inspiration, siehe .