Które parsery są dostępne do analizowania kodu C #?
Szukam parsera C #, który może być używany w C # i daje mi dostęp do informacji o wierszach i plikach o każdym artefakcie analizowanego kodu.
Które parsery są dostępne do analizowania kodu C #?
Szukam parsera C #, który może być używany w C # i daje mi dostęp do informacji o wierszach i plikach o każdym artefakcie analizowanego kodu.
Odpowiedzi:
Działa na kodzie źródłowym:
Prace przy montażu:
Problem z "parsowaniem" asemblera polega na tym, że mamy mniej informacji o liniach i plikach (informacje bazują na pliku .pdb, a Pdb zawiera informacje o liniach tylko dla metod)
Osobiście polecam Mono.Cecil i NRefactory .
Jeśli zamierzasz skompilować C # v3.5 do zestawów .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
CodeDomProvider.Parse()
metodę.
Jeśli znasz ANTLR, możesz użyć gramatyki Antlr C # .
Zaimplementowałem to, o co prosisz (analizowanie kodu w języku C # AST) w projekcie Platformy OWASP O2 przy użyciu interfejsów API SharpDevelop AST.
Aby ułatwić użytkowanie, napisałem szybkie API, które udostępnia szereg kluczowych elementów kodu źródłowego (przy użyciu instrukcji, typów, metod, właściwości, pól, komentarzy) i jest w stanie przepisać oryginalny kod C # na C # i VBNET .
Możesz zobaczyć ten interfejs API w akcji w tym pliku skryptu O2 XRule: ascx_View_SourceCode_AST.cs.o2 .
Na przykład w ten sposób można przetwarzać tekst kodu źródłowego C # i wypełniać szereg TreeViews & TextBoxes:
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");
}
Przykład w ascx_View_SourceCode_AST.cs.o2 pokazuje również, jak można następnie wykorzystać informacje zebrane z AST do wybrania w kodzie źródłowym typu, metody, komentarza itp.
Dla odniesienia tutaj jest napisany kod API (zwróć uwagę, że jest to mój pierwszy krok w używaniu parsera C # AST firmy SharpDevelop i wciąż zastanawiam się, jak to działa):
Niedawno wydaliśmy parser C #, który obsługuje wszystkie funkcje C # 4.0 oraz nową funkcję asynchroniczną: C # Parser i CodeDOM
Ta biblioteka generuje semantyczny model obiektów, który zachowuje komentarze i informacje o formatowaniu oraz może być modyfikowany i zapisywany. Obsługuje również użycie zapytań LINQ do analizowania kodu źródłowego.
SharpDevelop , IDE typu open source, zawiera parser kodu oparty na użytkownikach, który działa naprawdę dobrze. Może być używany niezależnie od IDE.
Rozważ użycie odbicia w skompilowanym pliku binarnym zamiast bezpośredniego analizowania kodu C #. Interfejs API refleksji jest naprawdę łatwy w użyciu i być może uda Ci się uzyskać wszystkie potrzebne informacje?
Spójrz na Gold Parser . Posiada bardzo intuicyjny IU, który umożliwia interaktywne testowanie gramatyki i generowanie kodu C #. Dostępnych jest wiele przykładów i jest całkowicie darmowy.
Może mógłbyś spróbować z Irony na irony.codeplex.com.
Jest bardzo szybki, a gramatyka ac # już istnieje.
Sama gramatyka jest napisana bezpośrednio w C # w sposób podobny do BNF (osiągnięty z niektórymi przeciążeniami operatorów)
Najlepsze jest to, że „gramatyka” tworzy AST bezpośrednio.
Coś, co nabiera rozpędu i jest bardzo odpowiednie do tej pracy, to Nemerle
możesz zobaczyć, jak to może rozwiązać ten problem w tych filmach z NDC:
Nie w C #, ale pełny parser C # 2/3/4, który buduje pełne AST jest dostępny z naszym zestawem narzędzi DMS Software Reengineering Toolkit .
DMS zapewnia rozległą infrastrukturę do analizowania, budowania drzew, konstrukcji tablic symboli i analiz przepływu, transformacji źródło-źródło i regeneracji kodu źródłowego ze (zmodyfikowanych) AST. (Obsługuje również wiele innych języków niż tylko C #).
EDYCJA (wrzesień) 2013: Ta odpowiedź nie była ostatnio aktualizowana. DMS od dawna obsługuje C # 5.0