Parser dla C #


101

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:


118

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 .


1
CS-Script ( csscript.net ) - silnik skryptów C # może zawierać tę listę. Przykład „Wprowadzenie do Microsoft„ Roslyn ”CTP” jest bardzo podobny do tego, co potrafi skrypt CS.
Dzmitry Lahoda

1
Wspominając o kosztach, pamiętaj, że Roslyn wymaga co najmniej wersji Pro programu Visual Studio.
kristianp

7

Mono (open source) zawiera kompilator C # (i oczywiście parser)


Jaka jest przewaga używania Mono nad innym parserem? Czy mogę uzyskać informacje o AST programu C # za pomocą gościa? Jeśli tak, czy możesz skierować mnie do strony, na której znajduje się odpowiednia strona?
yeeen

6

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


1
Szczególnie spójrz na CodeDomProvider.Parse()metodę.
Don Kirkby

3
Nie, nie patrz na metodę CodeDomProvider.Parse (), która zgłasza wyjątek NotImplemented w publicznych kompilacjach! (Visual Studio używa zastrzeżonego wewnętrznego analizatora składni).
Robin Davies


4

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


Tak, to wydaje się być najłatwiejszym rozwiązaniem, przynajmniej na podstawie tego, co widziałem. Szukałem porządnego parsera i natknąłem się na tego bloga svengrand.blogspot.com/2010/10/…, który również szczegółowo opisuje, jak używać parsera C # firmy SharpDevelop.
Alex

3

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.



2

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.


2

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?


3
Odbicie to zły sposób wykonywania analizy statycznej; dostarcza tylko informacji, które logika odbicia może wyodrębnić (np. „nazwy metod w klasie”. Nie dostarcza szczegółowych informacji („jaka jest prawa strona tego przypisania?”) i tak poważnie ogranicza ten rodzaj statycznego analizy, które można zrobić
Ira Baxter

@Ira Baxter Istnieją pewne ograniczenia, ale pamiętaj, że możesz również uzyskać kod IL poprzez odbicie. Oznacza to, że możesz zrozumieć, jakie metody są wywoływane, co jest przypisane do jakich zmiennych itp. Nie przychodzi mi do głowy wiele przypadków, w których to nie wystarczy. Spójrz tylko, co potrafią wszystkie wtyczki Reflector.
Hallgrim

jak uzyskać rzeczywisty kod IL poprzez Reflection? O ile mi wiadomo, Reflection tego nie zapewnia i musisz użyć CCI Zobacz: stackoverflow.com/questions/2824086/…
Ash

2

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.


2
OP poprosił o coś, co może analizować C #, a nie coś w C #, co analizuje coś innego.
Ira Baxter

2

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.


Komentarz w Irony.Samples / CSharp / CSharpGrammar.cs mówi: „UWAGA: Ta gramatyka to tylko demo, a to jest zepsute demo”. Więc nie jest to przynajmniej pełna implementacja.
vladich

2

Zdecydowanie powinieneś sprawdzić Roslyn, ponieważ MS właśnie otworzył (lub wkrótce otworzy) kod z licencją Apache 2 tutaj . Możesz również sprawdzić sposób analizowania tych informacji za pomocą tego kodu z GitHub .


1

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:


Nemerle to język programowania. Ładny język programowania, zgadzam się, ale pytanie brzmiało, jak analizować kod C # w C #!
Qwertie

tworzysz reguły w nemerle i używasz go z C #, nic nie powiedziało, że parser musi być w C #, ale cokolwiek, negatywnie.
Stéphane

1

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.