Domanda

Sto rispolverando un vecchio progetto di mine che calcola una serie di semplici metriche su grandi progetti software. Una delle metriche è la lunghezza di file / classi / metodi. Attualmente il mio codice "congetture" dove la classe / metodo confini sono basati su un algoritmo molto grezzo (attraversare il file, mantenendo una "profondità attuale" e regolando ogni volta che si incontrano tra parentesi non quotati; quando si torna al livello di una classe o di un metodo ha avuto inizio il , considerano uscito). Tuttavia, ci sono molti problemi con questa procedura, e un modo "semplice" di rilevare quando la profondità è cambiato non è sempre efficace.

Per fare questo dare risultati precisi, ho bisogno di usare il modo canonico (in ogni lingua) di rilevare definizioni di funzioni, definizioni di classe e cambiamenti di profondità. Ciò equivale a scrivere un semplice parser per generare alberi di analisi contenenti almeno questi elementi per ogni lingua che voglio il mio progetto sia applicabile agli.

Ovviamente i parser sono stati scritti per tutte queste lingue prima, quindi sembra che non avrei dovuto duplicare quello sforzo (anche se la scrittura parser è divertente). C'è qualche progetto open-source che raccoglie librerie parser pronti per l'uso per un po 'di lingue di origine? O devo solo essere usando ANTLR di fare il mio da zero (Nota:? Sarei felice di porto il progetto in un'altra lingua di fare uso di una grande risorsa esistente, quindi se siete a conoscenza di uno, non importa quale lingua è scritto in.)

È stato utile?

Soluzione

Se si vuole l'analisi linguaggio preciso, soprattutto a fronte di complicazioni linguistiche quali macro e condizionali preprocessore, è necessario parser linguistici completi. Questi sono in realtà un sacco di lavoro per la costruzione, e la maggior parte delle lingue non si prestano bene per i vari tipi di generatori di parser intorno. Né sono la maggior parte degli autori di un parser lingua interessati ad altri linguaggi; essi tendono a scegliere alcuni generatore di parser che non è ovviamente un posto di blocco enorme quando iniziano, implementano la loro parser per lo scopo specifico che intendono, e andare avanti.

Conseguenza: ci sono pochissime librerie di definizioni lingua in tutto che sono definite utilizzando un unico formalismo o di una fondazione comune. La folla ANTLR mantiene uno dei set più grandi secondo me, anche se per quanto posso dire la maggior parte di questi parser sono non-proprio-produzione capace. C'è sempre Bison, che è stato intorno abbastanza a lungo in modo che ci si aspetta una libreria di definizioni langauge essere da qualche parte raccolte, ma non ho mai visto uno.

Ho passato gli ultimi 15 anni la definizione di macchine base per l'analisi e la trasformazione del programma, e la costruzione di un altro tale biblioteca, chiamato il DMS Software Reengineering Toolkit . Ha parser di qualità di produzione per C, C ++, C #, Java, COBOL (IBM versione Enterprise), JCL, PHP, Python, ecc La tua opinione può naturalmente variano dalla mia, ma questi sono utilizzati ogni giorno con DMS per svolgere i compiti di cambiamento di massa su grandi corpi di codice.

Non so di eventuali altri in cui l'insieme di definizioni langauge sono maturi e strutturata su un unico fondamento ... può essere che i compilatori di IBM sono un tale insieme, ma IBM non offre la macchina o la definizioni di lingua.

Se tutto quello che vogliamo fare è metriche semplici di calcolo, si potrebbe essere in grado di vivere con solo lexer e ad hoc nido conteggio (come hai descritto). Anche quella di più difficile di quanto sembra per farlo funzionare a destra nella maggior parte dei casi (il check out Python, Perl e PHP sintassi stringa pazza). Quando tutto è detto e fatto, anche C è una sorprendente quantità di lavoro solo per definire un lexer precisa:. Abbiamo diverse migliaia di righe di sofisticate espressioni regolari per coprire tutte le strane lessemi che si trovano in Microsoft e / o GNU C

A causa DMS ha costantemente definito, maturare parser per molte lingue, ne consegue che DMS ha costantemente definito, lexer per gli stessi linguaggi di maturare. Abbiamo effettivamente costruire un Source Code (SCSE) che fornisce veloce ricerca attraverso grandi corpi di codici in più lingue che funziona Lexing le lingue che incontra e l'indicizzazione quei lessemi per la ricerca rapida. Lo SCSE così succede per calcolare il tipo di metriche si sta discutendo, anche, come indicizza il codice di base, più o meno il modo in cui lei descrive, con la differenza che ha questi langauage lexer precise per l'uso.

Altri suggerimenti

Si potrebbe essere interessato gcc-xml se si sta parsing C ++. Java CUP ha grammatiche per il linguaggio Java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top