it-swarm-eu.dev

Parser per C #

Quali parser sono disponibili per l'analisi del codice C #?

Sto cercando un parser C # che può essere utilizzato in C # e che mi dia accesso alle informazioni di linea e file su ogni artefatto del codice analizzato.

99
Julien Hoarau

Funziona sul codice sorgente:

Lavori sull'assemblaggio:

Il problema con il "parsing" di Assembly è che abbiamo meno informazioni su linea e file (le informazioni si basano sul file .pdb e Pdb contiene informazioni sulle linee solo per i metodi)

Raccomando personalmente Mono.Cecil e NRefactory .

116
Julien Hoarau

Mono (open source) include compilatore C # (e ovviamente parser)

7
aku

Se stai per compilare gli assembly C # v3.5 in .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

6
zproxy

Se hai familiarità con ANTLR, puoi usare Antlr C # grammar .

5
prosseek

Ho implementato esattamente ciò che stai chiedendo (analisi AST del codice C #) nel progetto OWASP O2 Platform utilizzando SharpDevelop AST.

Per semplificare il consumo ho scritto un'API rapida che espone una serie di elementi chiave del codice sorgente (usando 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 O2: ascx_View_SourceCode_AST.cs.o2 .

Ad esempio, ecco come elaborare un testo in codice sorgente C # e popolare un numero di TreeView e caselle di testo:

    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 è possibile quindi utilizzare le informazioni raccolte da AST per selezionare sul codice sorgente un tipo, metodo, commento, eccetera..

Per riferimento qui è il codice API che ha scritto (nota che questo è il mio primo passaggio nell'uso del C # AST di SharpDevelop, e sto ancora cercando di capire come funziona):

4
Dinis Cruz

Di recente abbiamo 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 semantici che conserva commenti e informazioni di formattazione e può essere modificato e salvato. Supporta anche l'uso di query LINQ per analizzare il codice sorgente.

3
Ken Beckett
2
Galwegian

SharpDevelop , un IDE open source, viene fornito con un parser di codice basato su visitatori che funziona davvero bene. Può essere utilizzato indipendentemente dall'IDE.

2
Akselsson

Considera di utilizzare la riflessione su un file binario incorporato 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?

2
Hallgrim

Forse potresti provare con Irony su irony.codeplex.com.

È molto veloce ed esiste già una grammatica c #.

La stessa grammatica è scritta direttamente in c # in un modo simile a BNF (raggiunta con alcuni operatori di sovraccarico)

La cosa migliore è che la "grammatica" produce direttamente AST.

2
SeeSoft

Dai un'occhiata a Parser d'oro . Ha una IU molto intuitiva che ti consente di testare interattivamente la tua grammatica e generare codice C #. Ci sono molti esempi disponibili con esso ed è completamente gratuito.

2
sbeskur

Dovresti assolutamente dare un'occhiata a Roslyn poiché MS ha appena aperto (o presto aprirà) il codice con una licenza Apache 2 qui . Puoi anche controllare un modo per analizzare queste informazioni con questo codice da GitHub .

2
Jason

Qualcosa che sta guadagnando slancio e molto appropriato per il lavoro è Nemerle

puoi vedere come potrebbe risolverlo in questi video da NDC:

1
Stéphane

Non in C #, ma un parser C # 2/3/4 completo che crea AST completi è disponibile con il nostro DMS Software Reengineering Toolkit .

DMS offre una vasta infrastruttura per l'analisi, la costruzione di alberi, la costruzione di tabelle di simboli e analisi del flusso, la trasformazione da sorgente a sorgente e la rigenerazione del codice sorgente dagli AST (modificati). (Gestisce anche molte altre lingue oltre a C #.)

EDIT (settembre) 2013: questa risposta non è stata aggiornata di recente. DMS ha gestito a lungo C # 5.0

1
Ira Baxter