Parser für C #

101

Welche Parser stehen zum Parsen von C # -Code zur Verfügung?

Ich suche nach einem C # -Parser, der in C # verwendet werden kann und mir Zugriff auf Zeilen- und Dateiinformationen zu jedem Artefakt des analysierten Codes gibt.

Julien Hoarau
quelle

Antworten:

118

Funktioniert mit Quellcode:

Arbeiten an der Montage:

Das Problem beim "Parsen" von Assemblys besteht darin, dass wir weniger Informationen über Zeile und Datei haben (die Informationen basieren auf der PDF-Datei, und Pdb enthält Zeileninformationen nur für Methoden).

Ich persönlich empfehle Mono.Cecil und NRefactory .

Julien Hoarau
quelle
1
CS-Script ( csscript.net ) - Die C # Script Engine passt möglicherweise zu dieser Liste. Ein Beispiel für "Einführung in das Microsoft" Roslyn "CTP" ist dem CS-Skript sehr ähnlich.
Dzmitry Lahoda
1
Beachten Sie, dass Roslyn mindestens die Pro-Version von Visual Studio benötigt, während Sie die Kosten erwähnen.
Kristianp
7

Mono (Open Source) enthält C # -Compiler (und natürlich Parser)

aku
quelle
Was ist der Vorteil von Mono gegenüber anderen Parsern? Kann ich mit einem Besucher Informationen über den AST eines C # -Programms erhalten? Wenn ja, können Sie mich zu der Seite weiterleiten, auf der die Seite dafür angezeigt wird?
Yeeen
6

Wenn Sie C # v3.5 in .net-Assemblys kompilieren möchten:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx

zproxy
quelle
1
Schauen Sie sich insbesondere die CodeDomProvider.Parse()Methode an.
Don Kirkby
3
Nein, sehen Sie sich nicht die CodeDomProvider.Parse () -Methode an, die in öffentlichen Builds eine NotImplemented-Ausnahme auslöst! (Visual Studio verwendet einen proprietären internen Parser).
Robin Davies
4

Ich habe genau das implementiert, was Sie verlangen (AST-Analyse von C # -Code) beim OWASP O2 Platform- Projekt mithilfe von SharpDevelop AST-APIs.

Um das Konsumieren zu vereinfachen, habe ich eine schnelle API geschrieben, die eine Reihe wichtiger Quellcodeelemente (mithilfe von Anweisungen, Typen, Methoden, Eigenschaften, Feldern, Kommentaren) verfügbar macht und den ursprünglichen C # -Code in C # und in VBNET umschreiben kann .

Sie können diese API in Aktion in dieser O2 XRule-Skriptdatei sehen: ascx_View_SourceCode_AST.cs.o2 .

So verarbeiten Sie beispielsweise einen C # -Quellcodetext und füllen eine Reihe von TreeViews & TextBoxen:

    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");                                
    }

Das Beispiel auf ascx_View_SourceCode_AST.cs.o2 zeigt auch, wie Sie anhand der vom AST gesammelten Informationen einen Typ, eine Methode, einen Kommentar usw. im Quellcode auswählen können.

Als Referenz dient hier der API-Code, der geschrieben wurde (beachten Sie, dass dies mein erster Versuch ist, den C # AST-Parser von SharpDevelop zu verwenden, und ich habe immer noch einen Überblick darüber, wie er funktioniert):

Dinis Cruz
quelle
Ja, dies scheint die einfachste der Lösungen zu sein, zumindest basierend auf dem, was ich gesehen habe. Ich suchte nach einem anständigen Parser und stieß auf diesen Blog svengrand.blogspot.com/2010/10/…, in dem auch die Verwendung des C # -Parsers von SharpDevelop beschrieben wird.
Alex
3

Wir haben kürzlich einen C # -Parser veröffentlicht, der alle C # 4.0-Funktionen sowie die neue asynchrone Funktion verarbeitet: C # -Parser und CodeDOM

Diese Bibliothek generiert ein semantisches Objektmodell, das Kommentare und Formatierungsinformationen enthält und geändert und gespeichert werden kann. Es unterstützt auch die Verwendung von LINQ-Abfragen zur Analyse des Quellcodes.

Ken Beckett
quelle
2

SharpDevelop , eine Open-Source-IDE, enthält einen besucherbasierten Code-Parser, der sehr gut funktioniert. Es kann unabhängig von der IDE verwendet werden.

Akselsson
quelle
2

Ziehen Sie in Betracht, eine erstellte Binärdatei zu reflektieren, anstatt den C # -Code direkt zu analysieren. Die Reflection-API ist wirklich einfach zu bedienen und vielleicht können Sie alle Informationen erhalten, die Sie benötigen?

Hallgrim
quelle
3
Reflexion ist ein schlechter Weg, um statische Analysen durchzuführen. Es liefert nur die Informationen, die die Reflexionslogik extrahieren kann (z. B. "Namen von Methoden in der Klasse". Es liefert keine Detailinformationen ("Was ist die rechte Seite dieser Zuweisung?") und schränkt diese Art von Statik so stark ein Analyse kann man machen.
Ira Baxter
@Ira Baxter Es gibt einige Einschränkungen, aber denken Sie daran, dass Sie den IL-Code auch über Reflection erhalten können. Dies bedeutet, dass Sie verstehen können, welche Methoden aufgerufen werden, welche Variablen zugewiesen werden usw. Ich kann mir nicht viele Fälle vorstellen, in denen dies nicht ausreicht. Schauen Sie sich an, was alle Reflector-Plugins können.
Hallgrim
Wie erhält man den tatsächlichen IL-Code über Reflection? Soweit mir bekannt ist, bietet Reflection dies nicht und Sie müssen CCI verwenden. Siehe: stackoverflow.com/questions/2824086/…
Ash
2

Schauen Sie sich Gold Parser an . Es verfügt über eine sehr intuitive Benutzeroberfläche, mit der Sie Ihre Grammatik interaktiv testen und C # -Code generieren können. Es gibt viele Beispiele und es ist völlig kostenlos.

sbeskur
quelle
2
Das OP fragte nach etwas, das C # analysieren kann, nicht nach etwas in C #, das etwas anderes analysiert.
Ira Baxter
2

Vielleicht könnten Sie es mit Irony auf irony.codeplex.com versuchen.

Es ist sehr schnell und es gibt bereits eine Grammatik.

Die Grammatik selbst wird direkt in c # auf BNF-ähnliche Weise geschrieben (erreicht bei einigen Operatorüberladungen)

Das Beste daran ist, dass die "Grammatik" den AST direkt erzeugt.

SeeSoft
quelle
Der Kommentar in Irony.Samples / CSharp / CSharpGrammar.cs lautet "HINWEIS: Diese Grammatik ist nur eine Demo und eine kaputte Demo". Es ist also zumindest keine vollständige Implementierung.
Vladich
2

Sie sollten sich unbedingt Roslyn ansehen, da MS gerade den Code mit einer Apache 2-Lizenz hier geöffnet hat (oder bald öffnen wird) . Sie können auch nach einer Möglichkeit suchen, diese Informationen mit diesem Code von GitHub zu analysieren .

Jason
quelle
1

Nemerle gewinnt an Dynamik und ist für den Job sehr geeignet

Sie können sehen, wie es es lösen könnte in diesen Videos von NDC:

Stéphane
quelle
Nemerle ist eine Programmiersprache. Eine nette Programmiersprache, stimme ich zu, aber die Frage war, wie man C # -Code in C # analysiert!
Qwertie
Sie erstellen Regeln in Nemerle und verwenden sie in C #. Nichts sagt, dass der Parser in C # sein muss, aber was auch immer, stimmen Sie ab.
Stéphane
1

Nicht in C #, sondern mit unserem DMS Software Reengineering Toolkit ist ein vollständiger C # 2/3/4 Parser verfügbar, der vollständige ASTs erstellt .

DMS bietet eine umfangreiche Infrastruktur für das Parsen, das Erstellen von Bäumen, das Erstellen von Symboltabellen und Flussanalysen, die Umwandlung von Quelle zu Quelle und die Regeneration von Quellcode aus den (modifizierten) ASTs. (Es werden auch viele andere Sprachen als nur C # behandelt.)

EDIT (September) 2013: Diese Antwort wurde kürzlich nicht aktualisiert. DMS hat C # 5.0 schon lange verarbeitet

Ira Baxter
quelle
-1

GPPG kann hilfreich sein, wenn Sie bereit sind, Ihren eigenen Parser zu schreiben (was Spaß macht).

Leppie
quelle