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.
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:
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 .
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
CodeDomProvider.Parse()
Yönteme özellikle bakın .
ANTLR'ye aşina iseniz, Antlr C # dilbilgisini kullanabilirsiniz .
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):
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.
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.
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?
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.
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.
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 .
Hız kazanan ve işe çok uygun bir şey Nemerle'dir.
Bunu nasıl çözebileceğini NDC'nin şu videolarında görebilirsiniz:
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
Kendi ayrıştırıcınızı yazmaya istekli iseniz (ki bu eğlenceli) GPPG yararlı olabilir.