Parser per C #


101

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:


118

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 .


1
CS-Script ( csscript.net ): il motore di script C # può essere incluso in questo elenco. L'esempio di "Introduzione al CTP" Roslyn "di Microsoft" è molto simile a quello di CS-script.
Dzmitry Lahoda

1
Mentre menzioni i costi, nota che Roslyn richiede almeno la versione Pro di Visual Studio.
kristianp

7

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


Qual è il vantaggio di utilizzare Mono rispetto ad altri parser? Posso ottenere informazioni sull'AST di un programma C # utilizzando un visitatore? In tal caso, puoi indirizzarmi alla pagina che mostra la pagina per quello?
yeeen

6

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


1
Guarda in particolare il CodeDomProvider.Parse()metodo.
Don Kirkby

3
No, non guardare il metodo CodeDomProvider.Parse () che genera un'eccezione NotImplemented nelle build pubbliche! (Visual Studio utilizza un parser interno proprietario).
Robin Davies


4

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):


Sì, questa sembra essere la più semplice delle soluzioni almeno in base a ciò che ho visto. Stavo cercando un parser decente e mi sono imbattuto in questo blog svengrand.blogspot.com/2010/10/… che descrive anche come utilizzare il parser C # di SharpDevelop.
Alex

3

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.



2

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.


2

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?


3
La riflessione è un cattivo modo di fare analisi statiche; fornisce solo le informazioni che la logica di riflessione può estrarre (ad esempio, "nomi di metodi nella classe". Non fornisce informazioni dettagliate ("qual è il lato destro di questo compito?") e limita così fortemente quel tipo di staticità analisi che si possono fare
Ira Baxter

@Ira Baxter Ci sono alcune limitazioni, ma ricorda che puoi anche ottenere il codice IL tramite riflessione. Ciò significa che puoi capire quali metodi vengono chiamati, cosa sono assegnati a quali variabili, ecc. Non riesco a pensare a molti casi in cui non è sufficiente. Guarda cosa possono fare tutti i plugin Reflector.
Hallgrim

come si ottiene il codice IL effettivo tramite Reflection? Per quanto ne so, Reflection non lo fornisce ed è necessario utilizzare CCI Vedi: stackoverflow.com/questions/2824086/…
Ash

2

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.


2
L'OP ha chiesto qualcosa che possa analizzare C #, non qualcosa in C # che analizzi qualcos'altro.
Ira Baxter

2

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.


Il commento in Irony.Samples / CSharp / CSharpGrammar.cs dice "NOTA: questa grammatica è solo una demo, ed è una demo non funzionante". Quindi non è almeno un'implementazione completa.
vladich

2

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


1

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

puoi vedere come potrebbe risolverlo in questi video di NDC:


Nemerle è un linguaggio di programmazione. Un bel linguaggio di programmazione, sono d'accordo, ma la domanda era come analizzare il codice C # all'interno di C #!
Qwertie

crei regole in nemerle e lo usi da C #, niente dice che il parser deve essere in C #, ma qualunque cosa, downvote via.
Stéphane

1

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


-1

GPPG potrebbe essere utile, se sei disposto a scrivere il tuo parser (il che è divertente).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.