Frage
Welche Parser sind in C # -Code Parsen?
Ich bin für einen C # Parser, der in C # verwendet werden kann, und gib mir den Zugriff auf Linie und Dateiinformationen zu dem einzelnen Artefakt des analysierten Code.
Lösung
Arbeiten auf Quellcode:
- CSParser : Von C # 1.0 bis 2.0, Open-Source
- Metaspec C # Parser : Von C # 1.0 bis 3.0, Handelsprodukt (ca. 5000 $)
- #recognize : Von C # 1.0 bis 3.0, Handelsprodukt (ca. 900 €) (Antwort von SharpRecognize )
- SharpDevelop Parser (Antwort von Akselsson )
- NRefactory : Von C # 1,0 bis 4,0 (+ async), Open-Source-Parser in SharpDevelop verwendet. Enthält semantische Analyse.
- C # Parser und CodeDOM : Eine vollständige C # 4.0-Parser, unterstützen bereits die C # 5.0 Asynchron-Funktion. Handelsprodukt (49 $ bis 299 $) (Antwort von Ken Beckett )
- Microsoft Roslyn CTP : Compiler als Dienstleistung an.
Arbeiten auf Montage:
- System.Reflection
- Microsoft Common Compiler Infrastructure : Von C # 1.0 bis 3.0, Lizenz Microsoft Public. Wird von FXCop und Spec #
- Mono.Cecil : Von C # 1.0 bis 3.0, Open-Source
Das Problem bei Montage „Parsen“ ist, dass wir weniger Informationen über Linie und Datei (die Informationen beruhen auf PDB-Datei, und PDB enthält Zeilen Informationen nur für Methoden)
I personnaly empfehlen Mono.Cecil und NRefactory .
Andere Tipps
Mono (Open Source) enthält C # Compiler (und natürlich Parser)
Wenn Sie vorhaben, C # v3.5 auf .NET-Assemblies kompilieren:
var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
http://msdn.microsoft.com/en- us / library / microsoft.csharp.csharpcodeprovider.aspx
Wenn Sie mit ANTLR vertraut sind, können Sie Antlr C # Grammatik verwenden.
Ich habe gerade realisiert, was Sie fordern (AST Parsen von C # -Code) an dem OWASP O2 Platform Projekt mit SharpDevelop AST-APIs.
Um es einfacher zu konsumieren ich eine schnelle API geschrieben, die eine Reihe von Schlüsselquellcodeelementen aussetzt (unter Verwendung von Aussagen, Typen, Methoden, Eigenschaften, Felder, Kommentaren) und ist in der Lage den ursprünglichen C # Code in C # neu zu schreiben und in VBNET.
Sie können diese API in Aktion sehen auf dieser O2 anschließende Klicken auf REGEL Skriptdatei: ascx_View_SourceCode_AST.cs.o2 .
Zum Beispiel ist dies, wie Sie einen C # Quellcode Text verarbeiten und eine Reihe von TreeViews & Textfeldern füllen:
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 dann die von dem AST gesammelten Informationen können auf dem Quellcode einen Typen, Methode, Kommentar, usw. wählen ..
hier als Referenz ist der API-Code, der geschrieben (beachten Sie, dass dies mein erster Pass ist bei Verwendung von SharpDevelop des C # AST-Parsers, und ich bin immer noch meinen Kopf immer um, wie es funktioniert):
Wir haben kürzlich einen C # Parser freigegeben, die alle C # 4.0-Features behandelt und die neue Asynchron-Funktion: C # Parser und CodeDOM
Diese Bibliothek erzeugt ein semantisches Objektmodell, das Kommentare und Formatierungsinformationen behält und können geändert und gespeichert werden. Es unterstützt auch die Verwendung von LINQ-Abfragen Quellcodes zu analysieren.
SharpDevelop , einem Open-Source-IDE, kommt mit einem Besucher-basierten Code-Parser die funktioniert wirklich gut. Es kann unabhängig von den IDE verwendet werden.
Betrachten Reflexion auf einem integrierten binären zu verwenden, anstatt den C # -Code direkt zu parsen. Die Reflection-API ist wirklich einfach zu bedienen und vielleicht können Sie alle Informationen, die Sie brauchen?
Hier finden Sie aktuelle Gold-Parser . Es hat eine sehr intuitive IU, die Sie interaktiv testen Sie Ihre Grammatik und generieren C # -Code können. Es gibt viele Beispiele mit ihm zur Verfügung und es ist völlig kostenlos.
Vielleicht könnten Sie versuchen, mit Irony auf irony.codeplex.com.
Es ist sehr schnell und eine c # Grammatik ist bereits vorhanden.
Die Grammatik selbst geschrieben wird direkt in c # in einer BNF wie Art und Weise (mit einigen Betreibern Überlastungen acheived)
Das Beste, was mit ihm ist, dass die „Grammatik“ direkt mit dem AST produziert.
Etwas, das Dynamik und sehr geeignet für den Job gewinnt, ist Nemerle
Sie können sehen, wie sie es in diesen Videos von NDC lösen könnte:
Nicht in C #, aber ein vollständigen C # 2/3/4 Parser, der ist mit unserem DMS Software Reengineering Toolkit .
DMS bietet eine breite Infrastruktur für die Analyse, Baum Gebäude, Bau von Symboltabellen und Flussanalysen, Quelle-Source-Transformation und Regeneration des Quellcodes aus den (modifiziert) Äste. (Es ist auch für viele andere Sprachen als nur C #).
EDIT (September) 2013: Diese Antwort wurde vor kurzem nicht aktualisiert. DMS hat langstieligen C # 5.0
GPPG könnte von Nutzen sein, wenn Sie bereit sind, Ihre eigenen zu schreiben Parser (der Spaß macht).