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.
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.
Antworten:
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 .
Mono (Open Source) enthält C # -Compiler (und natürlich Parser)
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
CodeDomProvider.Parse()
Methode an.
Wenn Sie mit ANTLR vertraut sind, können Sie die Antlr C # -Grammatik verwenden .
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):
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.
SharpDevelop , eine Open-Source-IDE, enthält einen besucherbasierten Code-Parser, der sehr gut funktioniert. Es kann unabhängig von der IDE verwendet werden.
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?
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.
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.
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:
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