2010-11-07 16 views
8

Ho due file contenenti codice C che desidero confrontare. Sto cercando un'utilità che costruisca un albero di sintassi per ogni file e confronti gli alberi di sintassi, invece di confrontare semplicemente il testo dei file. In questo modo le differenze minori nella formattazione e nello stile saranno ignorate. Sarebbe anche bello poter dire allo strumento di confronto di ignorare differenze come nomi di variabili, ecc.Come si confrontano due file contenenti codice C in base alla struttura del codice, non solo le differenze testuali?

Correggimi se ho torto, ma diff non ha questa capacità. Sono un utente di Ubuntu. Grazie!

+2

È questo rilevamento di plagio di compiti a casa? Un sacco di pacchetti per questo se è quello che stai cercando. –

+0

È possibile ottenere parzialmente lì normalizzando il formato dell'input, quindi diff. L'utilità 'indent' è ottima per questo.Non posso darti una lista di opzioni in cima alla mia testa, ma può inghiottire righe vuote, standardizzare il formato e la spaziatura delle parentesi graffe e così via. I nomi variabili saranno molto più complicati. – Cascabel

+0

Suppongo che potrebbe essere usato a tale scopo, ma in realtà lo userò per confrontare due file che ho scritto. Ti dispiacerebbe pubblicare i nomi di qualsiasi utilità di rilevamento di plagio con cui sei familiare? Forse potrebbero essere di aiuto per me. Grazie! –

risposta

2

C'è un programma chiamato codeCompare da devart (http://www.devart.com/codecompare/benefits.html#cc) che include la seguente funzione (so che non è esattamente quello che hai chiesto ma probabilmente può essere usato per quello).

La funzione è chiamata "Struttura di confronto"

Questa funzionalità consente di confrontare diversi revisione del file dal presense dei blocchi di struttura (classi, campi, metodi). A quella versioni diverse dello stesso file vengono confrontati indipendentemente dalla loro destinazione.

Struttura confronto può essere applicato ai seguenti lingue:

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

(lo so che non include C , ma forse con la versione C++ puoi risolvere il problema)

2

Il nostro SD Smart Differencer fa esattamente quello che vuoi. Usa parser di qualità del compilatore per leggere il codice sorgente e creare AST per due file selezionati. Quindi confronta gli alberi guidati dalla sintassi, quindi non viene confuso da spazi, layout o commenti. Poiché normalizza i valori delle costanti, non viene confuso dal cambiamento di radix o dal modo in cui hai espresso le sequenze di escape!

I delta sono riportati al livello dei costrutti langauge (variabile, espressione, istruzione, dichiarazione, funzione, ...) in termini di intento programmatore (cancella, inserisci, copia, sposta) completa con la determinazione di un identificatore è stato rinominato in modo coerente in un blocco modificato.

Lo SmartDifferencer ha versioni disponibili per C (in un certo numero di dialetti, se il parsing accurato per il compilatore, il dialetto langauge è importante) è valido per C++, Java, C#, JavaScript, COBOL, Python e molti altri linguaggi.

Se si desidera comprendere in che modo un insieme di file è correlato tra loro, il nostro SD CloneDR accetterà un insieme di file molto ampio e dirà cosa hanno in comune. Trova il codice che è stato copiato e incollato su tutto il set. Non devi dirgli cosa cercare; lo trova automaticamente. Usando AST (come sopra), non viene ingannato dalle modifiche dello spazio bianco o dai nomi degli identificatori. Nel sito Web sono disponibili numerosi report di rilevamento dei cloni di esempio per varie lingue.

Problemi correlati