Quali parser sono disponibili per l'analisi del codice C #?
Sto cercando un parser C # che possa essere utilizzato in C # e che mi dia accesso alle informazioni sulla riga e sul file su ogni artefatto del codice analizzato.
Quali parser sono disponibili per l'analisi del codice C #?
Sto cercando un parser C # che possa essere utilizzato in C # e che mi dia accesso alle informazioni sulla riga e sul file su ogni artefatto del codice analizzato.
Risposte:
Funziona sul codice sorgente:
Lavori su montaggio:
Il problema con il "parsing" dell'assembly è che abbiamo meno informazioni su riga e file (le informazioni sono basate su file .pdb e Pdb contiene informazioni sulle righe solo per i metodi)
Personalmente consiglio Mono.Cecil e NRefactory .
Mono (open source) include il compilatore C # (e ovviamente il parser)
Se hai intenzione di compilare assembly da C # v3.5 a .net:
var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx
CodeDomProvider.Parse()
metodo.
Se hai familiarità con ANTLR, puoi usare la grammatica C # di Antlr .
Ho implementato proprio quello che chiedi (analisi AST del codice C #) sulla piattaforma OWASP O2 utilizzando le API AST SharpDevelop.
Per rendere più facile il consumo ho scritto una rapida API che espone una serie di elementi chiave del codice sorgente (utilizzando istruzioni, tipi, metodi, proprietà, campi, commenti) ed è in grado di riscrivere il codice C # originale in C # e in VBNET .
Puoi vedere questa API in azione su questo file di script XRule di O2: ascx_View_SourceCode_AST.cs.o2 .
Ad esempio, questo è il modo in cui si elabora un testo di codice sorgente C # e si popola un numero di TreeView e TextBox:
public void updateView(string sourceCode)
{
var ast = new Ast_CSharp(sourceCode);
ast_TreeView.show_Ast(ast);
types_TreeView.show_List(ast.astDetails.Types, "Text");
usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
methods_TreeView.show_List(ast.astDetails.Methods,"Text");
fields_TreeView.show_List(ast.astDetails.Fields,"Text");
properties_TreeView.show_List(ast.astDetails.Properties,"Text");
comments_TreeView.show_List(ast.astDetails.Comments,"Text");
rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");
}
L'esempio su ascx_View_SourceCode_AST.cs.o2 mostra anche come utilizzare le informazioni raccolte dall'AST per selezionare sul codice sorgente un tipo, un metodo, un commento, ecc.
Per riferimento, ecco il codice API che ha scritto (si noti che questo è il mio primo passaggio all'utilizzo del parser C # AST di SharpDevelop e sto ancora pensando a come funziona):
Abbiamo recentemente rilasciato un parser C # che gestisce tutte le funzionalità di C # 4.0 oltre alla nuova funzionalità asincrona: C # Parser e CodeDOM
Questa libreria genera un modello a oggetti semantico che conserva commenti e informazioni di formattazione e può essere modificato e salvato. Supporta inoltre l'uso di query LINQ per analizzare il codice sorgente.
SharpDevelop , un IDE open source, viene fornito con un parser di codice basato sui visitatori che funziona davvero bene. Può essere utilizzato indipendentemente dall'IDE.
Considerare di usare la riflessione su un binario compilato invece di analizzare direttamente il codice C #. L'API di riflessione è davvero facile da usare e forse puoi ottenere tutte le informazioni di cui hai bisogno?
Dai un'occhiata a Gold Parser . Ha una IU molto intuitiva che ti consente di testare in modo interattivo la tua grammatica e generare codice C #. Ci sono molti esempi disponibili con esso ed è completamente gratuito.
Forse potresti provare con Irony su irony.codeplex.com.
È molto veloce e la grammatica ac # esiste già.
La grammatica stessa è scritta direttamente in c # in un modo simile a BNF (ottenuto con alcuni sovraccarichi di operatori)
La cosa migliore è che la "grammatica" produce direttamente l'AST.
Qualcosa che sta guadagnando slancio e molto appropriato per il lavoro è Nemerle
puoi vedere come potrebbe risolverlo in questi video di NDC:
Non in C #, ma con il nostro DMS Software Reengineering Toolkit è disponibile un parser C # 2/3/4 completo che crea AST completi .
DMS fornisce una vasta infrastruttura per l'analisi, la costruzione di alberi, la costruzione di tabelle di simboli e analisi di flusso, la trasformazione da sorgente a sorgente e la rigenerazione del codice sorgente dagli AST (modificati). (Gestisce anche molti altri linguaggi oltre al C #.)
EDIT (settembre) 2013: questa risposta non è stata aggiornata di recente. DMS gestisce da tempo C # 5.0