2010-04-02 15 views
8

Sto rispolvendo un mio vecchio progetto che calcola un numero di semplici metriche su grandi progetti software. Una delle metriche è la lunghezza di file/classi/metodi. Attualmente il mio codice "indovina" dove i limiti di classe/metodo sono basati su un algoritmo molto grezzo (attraversa il file, mantenendo una "profondità attuale" e regolandolo ogni volta che incontri parentesi non quotate; quando ritorni al livello inizia una classe o metodo , consideralo uscito). Tuttavia, ci sono molti problemi con questa procedura e un modo "semplice" di rilevare quando la tua profondità è cambiata non è sempre efficace.Fonte di parser per i linguaggi di programmazione?

Per ottenere risultati precisi, è necessario utilizzare la modalità canonica (in ciascuna lingua) per rilevare definizioni di funzioni, definizioni di classi e modifiche di profondità. Ciò equivale a scrivere un semplice parser per generare alberi di analisi contenenti almeno questi elementi per ogni lingua a cui voglio che il mio progetto sia applicabile.

Ovviamente i parser sono stati scritti per tutte queste lingue prima, quindi sembra che non dovrei duplicare questo sforzo (anche se scrivere parser è divertente). Esiste un progetto open source che raccoglie le librerie di parser pronte per l'uso per un sacco di lingue di partenza? O dovrei semplicemente usare ANTLR per creare il mio da zero? (Nota: sarei lieto di portare il progetto in un'altra lingua per utilizzare una grande risorsa esistente, quindi se ne conoscete uno, non importa in che lingua è scritto.)

+1

Esistono librerie di evidenziazione della sintassi (mi vengono in mente i frammenti) che gestiscono molte lingue diverse. Mi chiedo se uno di loro fornirebbe abbastanza informazioni per il tuo caso. Sospetto di no, ma potrebbe valere la pena dare un'occhiata. – Ken

risposta

6

Se si desidera un parsing accurato del linguaggio, specialmente di fronte a complicazioni linguistiche come macro e condizionali del preprocessore, è necessario un parser di lingua completo. Questi sono in realtà un bel po 'di lavoro da costruire, e la maggior parte delle lingue non si prestano bene ai vari tipi di generatori di parser in circolazione. Né la maggior parte degli autori di un parser linguistico è interessata ad altre lingue; tendono a scegliere un generatore di parser che non è ovviamente un enorme posto di blocco quando iniziano, implementa il parser per lo scopo specifico che intendono, e procede.

Conseguenza: ci sono pochissime librerie di definizioni linguistiche in giro che sono definite utilizzando un singolo formalismo o una base condivisa. La folla di ANTLR mantiene uno dei set più grandi IMHO, anche se per quanto ne so, molti di questi parser non sono abbastanza capaci di produrre. C'è sempre Bison, che è stato in giro abbastanza a lungo così ti aspetteresti che una libreria di definizioni di langauge venisse raccolta da qualche parte, ma non ne ho mai vista una.

Ho passato gli ultimi 15 anni a definire i macchinari di base per l'analisi e la trasformazione dei programmi e a costruire un'altra libreria, denominata DMS Software Reengineering Toolkit. Ha parser di qualità di produzione per C, C++, C#, Java, COBOL (versione IBM Enterprise), JCL, PHP, Python, ecc. La tua opinione può ovviamente variare da quella mia, ma questi sono usati quotidianamente con DMS per svolgere compiti di cambiamento di massa su grandi corpi di codice.

Non conosco nessun altro in cui il set di definizioni di langauge sia maturo e costruito su un'unica base ... potrebbe essere che i compilatori IBM siano un tale insieme, ma IBM non offre i macchinari o le definizioni della lingua.

Se tutto ciò che si vuole fare è calcolare metriche semplici, si potrebbe essere in grado di convivere con solo lexer e conteggio del nido ad hoc (come descritto). Anche questo è più difficile di quanto sembra farlo funzionare nella maggior parte dei casi (controlla le sintassi di Python's, Perl's e PHP crazy string). Quando tutto è detto e fatto, anche C è una quantità sorprendente di lavoro solo per definire un lexer accurato: abbiamo diverse migliaia di linee di espressioni regolari sofisticate per coprire tutti gli strani lessemi che trovi in ​​Microsoft e/o GNU C.

Poiché DMS ha preimpostazioni mature definite in modo coerente per molte lingue, ne consegue che DMS ha definito coerentemente i lexer maturi per le stesse lingue. Realmente realizziamo uno Source Code Search Engine (SCSE) che fornisce una ricerca veloce su grandi corpi di codici in più lingue che funziona lesseggiando le lingue che incontra e indicizzando quei lessemi per una rapida ricerca. L'SCSE si dà il caso che calcoli anche il tipo di metrica che stai discutendo, in quanto indicizza il codice base, più o meno come descrivi, eccetto che ha i lessici accurati di langauage da usare.

+0

Ira, grazie per una risposta affascinante! Il DMS Software Reengineering Toolkit sembra piuttosto una versione più ampia (più pensata, meno metrica) di ciò che sto cercando di fare. Hmm. E 'interessante il fatto che si parla di PHP, perché questo è esattamente quello che mi ha spinto alla decisione che avevo bisogno di un vero e proprio parser. Se posso chiedere, hai qualche raccomandazioni se decido di scrivere le mie parser per diverse lingue? (Poi di nuovo, guardando il sito Web di Semantic Designs, le strategie per scrivere una tale serie di parser potrebbero sfiorare i segreti commerciali! Se è così, ti preghiamo di ignorare la domanda.) – Arkaaito

+1

Non facciamo nulla di segreto. La strategia per la scrittura parser facilmente è quello di ottenere il più forte della tecnologia di analisi è possibile ottenere (GLR), la definizione lingua più precisa (PHP non supera questo test prett male), il codice di una grammatica e spingere milioni di righe di codice attraverso di essa alla ricerca di guasti. Il vero problema è solo sudore; anche con questa strategia, ci vuole molta energia per ogni lingua. Il punto di costruzione del DMS era evitare la duplicazione dell'infrastruttura comune per ogni nuova lingua (avevo già fatto questo genere di cose per 25 anni prima che decidessi di creare DMS). –

2

essere interessato a gcc-xml se si sta analizzando C++. Java CUP ha grammatiche per il linguaggio Java.

+0

gcc-xml non fornirà alcuna informazione sui corpi delle funzioni, solo dichiarazioni. È difficile ottenere metriche utili quando si visualizzano solo le intestazioni delle funzioni. –

Problemi correlati