C # için ayrıştırıcı


101

C # kodunu ayrıştırmak için hangi ayrıştırıcılar kullanılabilir?

C # 'da kullanılabilen ve analiz edilen kodun her eseri hakkındaki satır ve dosya bilgilerine erişimimi sağlayan bir C # ayrıştırıcı arıyorum.

Yanıtlar:


118

Kaynak kod üzerinde çalışır:

Montajda çalışır:

Derleme "ayrıştırma" ile ilgili sorun, satır ve dosya hakkında daha az bilgiye sahip olmamızdır (bilgiler .pdb dosyasına dayanır ve Pdb yalnızca yöntemler için satır bilgileri içerir)

Ben şahsen Mono.Cecil ve NRefactory'yi tavsiye ederim .


1
CS-Script ( csscript.net ) - C # Script Engine bu listeyi paketleyebilir . "Microsoft" Roslyn "CTP'ye Giriş" örneği, CS-script'in yapabileceği gibi.
Dzmitry Lahoda

1
Maliyetlerden bahsederken, Roslyn'in en azından Visual Studio'nun Pro sürümünü gerektirdiğini unutmayın.
kristianp

7

Mono (açık kaynak), C # derleyicisini (ve elbette ayrıştırıcıyı) içerir


Mono kullanmanın diğer ayrıştırıcıya göre avantajı nedir? Ziyaretçi kullanarak bir C # programının AST'si hakkında bilgi alabilir miyim? Öyleyse, beni bunun için sayfayı gösteren sayfaya yönlendirebilir misiniz?
yeeen

6

C # v3.5'ten .net derlemelerine derleyecekseniz:

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
CodeDomProvider.Parse()Yönteme özellikle bakın .
Don Kirkby

3
Hayır, genel derlemelerde NotImplemented istisnası atan CodeDomProvider.Parse () yöntemine bakmayın! (Visual Studio, özel bir dahili ayrıştırıcı kullanır).
Robin Davies


4

OWASP O2 Platformunda tam istediğiniz şeyi (C # kodunun AST çözümlemesi) uyguladımSharpDevelop AST API'lerini kullanarak projesinde .

Tüketmeyi kolaylaştırmak için, bir dizi anahtar kaynak kodu öğelerini (ifadeler, türler, yöntemler, özellikler, alanlar, yorumlar kullanarak) ortaya çıkaran ve orijinal C # kodunu C # ve VBNET'e yeniden yazabilen hızlı bir API yazdım. .

Bu API'yi bu O2 XRule komut dosyası dosyasında çalışırken görebilirsiniz : ascx_View_SourceCode_AST.cs.o2 .

Örneğin, bir C # kaynak kodu metnini bu şekilde işler ve birkaç TreeView & TextBox'ı doldurursunuz:

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

Ascx_View_SourceCode_AST.cs.o2 üzerindeki örnek ayrıca kaynak kodunda bir tür, yöntem, açıklama vb. toplanan bilgileri nasıl kullanabileceğinizi de gösterir.

Referans için burada yazan API kodu (SharpDevelop'un C # AST ayrıştırıcısını ilk kez kullandığımı ve hala nasıl çalıştığını anlamaya çalıştığımı unutmayın):


Evet, en azından gördüklerime dayanarak çözümlerin en kolayı bu gibi görünüyor. İyi bir ayrıştırıcı arıyordum ve bu bloga rastladım svengrand.blogspot.com/2010/10/… , ayrıca SharpDevelop'un C # ayrıştırıcısının nasıl kullanılacağını da açıklıyor .
Alex

3

Kısa bir süre önce, tüm C # 4.0 özelliklerinin yanı sıra yeni eşzamansız özelliği işleyen bir C # ayrıştırıcı yayınladık: C # Ayrıştırıcı ve CodeDOM

Bu kütüphane, yorumları ve biçimlendirme bilgilerini tutan ve değiştirilip kaydedilebilen bir anlamsal nesne modeli oluşturur. Ayrıca, kaynak kodunu analiz etmek için LINQ sorgularının kullanımını destekler.



2

Açık kaynaklı bir IDE olan SharpDevelop , gerçekten iyi çalışan ziyaretçi tabanlı bir kod ayrıştırıcı ile birlikte gelir. IDE'den bağımsız olarak kullanılabilir.


2

Doğrudan C # kodunu ayrıştırmak yerine yerleşik bir ikili dosyada yansımayı kullanmayı düşünün. Yansıma API'sinin kullanımı gerçekten çok kolay ve belki de ihtiyacınız olan tüm bilgileri elde edebilirsiniz?


3
Yansıma, statik analiz yapmanın kötü bir yoludur; yalnızca yansıma mantığının çıkarabileceği bilgileri sağlar (örneğin, "sınıftaki yöntemlerin adları". Ayrıntılı bilgi sağlamaz ("bu atamanın sağ tarafı nedir?") ve bu nedenle bu tür statikleri ciddi şekilde sınırlar. yapabileceğiniz bir analiz.
Ira Baxter

@Ira Baxter Bazı sınırlamalar vardır, ancak IL kodunu yansıtma yoluyla da alabileceğinizi unutmayın. Bu, hangi yöntemlerin çağrıldığını, hangi değişkenlere neyin atandığını vb. Anlayabileceğiniz anlamına gelir. Yeterli olmadığı pek çok durum düşünemiyorum. Reflector eklentilerinin neler yapabileceğine bir bakın.
Hallgrim

Gerçek IL kodunu Reflection aracılığıyla nasıl alırsınız? Bildiğim kadarıyla Reflection bunu sağlamaz ve CCI kullanmanız gerekir Bkz: stackoverflow.com/questions/2824086/…
Ash

2

Gold Parser'a bir göz atın . Dilbilginizi etkileşimli olarak test etmenizi ve C # kodu oluşturmanızı sağlayan çok sezgisel bir IU'ya sahiptir. Kullanılabilecek birçok örnek var ve tamamen ücretsizdir.


2
OP, C # içinde başka bir şeyi ayrıştıran bir şey değil, C # ayrıştırabilen bir şey istedi.
Ira Baxter

2

Belki irony.codeplex.com'da Irony ile deneyebilirsiniz.

Çok hızlı ve ac # dilbilgisi zaten var.

Dilbilgisinin kendisi doğrudan c # ile BNF benzeri bir şekilde yazılır (bazı operatörlerin aşırı yüklenmeleriyle sağlandı)

Bununla ilgili en iyi şey, "dilbilgisinin" AST'yi doğrudan üretmesidir.


Irony.Samples / CSharp / CSharpGrammar.cs'deki yorum "NOT: Bu dilbilgisi sadece bir demodur ve bozuk bir demodur" diyor. Yani en azından tam bir uygulama değil.
vladich

2

MS burada Apache 2 lisansıyla kodu yeni açtığından (veya yakında açacağından) beri Roslyn'i kesinlikle kontrol etmelisiniz . Ayrıca bu bilgiyi GitHub'daki bu kodla ayrıştırmanın bir yolunu da inceleyebilirsiniz .


1

Hız kazanan ve işe çok uygun bir şey Nemerle'dir.

Bunu nasıl çözebileceğini NDC'nin şu videolarında görebilirsiniz:


Nemerle bir programlama dilidir. Güzel bir programlama dili, kabul ediyorum, ancak soru C # kodunun C # içinde nasıl ayrıştırılacağıydı!
Qwertie

nemerle'de kurallar yaratırsınız ve onu C #'dan kullanırsınız, hiçbir şey ayrıştırıcının C #'da olması gerektiğini söylemez, ama her neyse, olumsuz oy verin.
Stéphane

1

C # dilinde değil, ancak tam AST'leri oluşturan tam bir C # 2/3/4 ayrıştırıcı, DMS Yazılım Yeniden Yapılandırma Araç Kitimizde mevcuttur .

DMS, ayrıştırma, ağaç oluşturma, sembol tablolarının ve akış analizlerinin oluşturulması, kaynaktan kaynağa dönüşüm ve (değiştirilmiş) AST'lerden kaynak kodun yeniden oluşturulması için geniş bir altyapı sağlar. (Aynı zamanda C # dışında birçok dili de işler.)

DÜZENLEME (Eylül) 2013: Bu cevap yakın zamanda güncellenmedi. DMS uzun süredir C # 5.0 kullanıyor


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.