Pengurai mana yang tersedia untuk penguraian kode C #?
Saya mencari parser C # yang dapat digunakan di C # dan memberi saya akses ke informasi baris dan file tentang setiap artefak dari kode yang dianalisis.
Pengurai mana yang tersedia untuk penguraian kode C #?
Saya mencari parser C # yang dapat digunakan di C # dan memberi saya akses ke informasi baris dan file tentang setiap artefak dari kode yang dianalisis.
Jawaban:
Bekerja pada kode sumber:
Bekerja pada perakitan:
Masalah dengan assembly "parsing" adalah kami memiliki lebih sedikit informasi tentang baris dan file (informasi didasarkan pada file .pdb, dan Pdb berisi informasi baris hanya untuk metode)
Saya secara pribadi merekomendasikan Mono.Cecil dan NRefactory .
Mono (open source) termasuk kompiler C # (dan tentu saja parser)
Jika Anda akan mengkompilasi C # v3.5 ke rakitan .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()
metodenya.
Jika Anda terbiasa dengan ANTLR, Anda dapat menggunakan tata bahasa Antlr C # .
Saya telah mengimplementasikan apa yang Anda minta (Parsing AST dari kode C #) di proyek OWASP O2 Platform menggunakan SharpDevelop AST API.
Untuk membuatnya lebih mudah untuk dikonsumsi, saya menulis API cepat yang mengekspos sejumlah elemen kode sumber utama (menggunakan pernyataan, jenis, metode, properti, bidang, komentar) dan mampu menulis ulang kode C # asli ke dalam C # dan menjadi VBNET .
Anda dapat melihat API ini beraksi pada file skrip O2 XRule ini: ascx_View_SourceCode_AST.cs.o2 .
Misalnya, begini cara Anda memproses teks kode sumber C # dan mengisi sejumlah TreeView & 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");
}
Contoh pada ascx_View_SourceCode_AST.cs.o2 juga menunjukkan bagaimana Anda kemudian dapat menggunakan informasi yang dikumpulkan dari AST untuk memilih jenis, metode, komentar, dll .. pada kode sumber.
Untuk referensi di sini adalah kode API yang menulis (perhatikan bahwa ini adalah kesempatan pertama saya menggunakan parser C # AST SharpDevelop, dan saya masih memikirkan cara kerjanya):
Kami baru saja merilis parser C # yang menangani semua fitur C # 4.0 ditambah fitur asinkron baru: C # Parser dan CodeDOM
Pustaka ini menghasilkan model objek semantik yang menyimpan komentar dan informasi pemformatan dan dapat dimodifikasi dan disimpan. Ini juga mendukung penggunaan kueri LINQ untuk menganalisis kode sumber.
SharpDevelop , sebuah IDE open source, hadir dengan parser kode berbasis pengunjung yang bekerja dengan sangat baik. Ini dapat digunakan secara independen dari IDE.
Pertimbangkan untuk menggunakan refleksi pada biner yang dibangun daripada mengurai kode C # secara langsung. API refleksi sangat mudah digunakan dan mungkin Anda bisa mendapatkan semua informasi yang Anda butuhkan?
Lihat Gold Parser . Ini memiliki IU yang sangat intuitif yang memungkinkan Anda menguji tata bahasa Anda secara interaktif dan menghasilkan kode C #. Ada banyak contoh yang tersedia dengannya dan sepenuhnya gratis.
Mungkin Anda bisa mencoba Irony di irony.codeplex.com.
Sangat cepat dan tata bahasa ac # sudah ada.
Tata bahasanya sendiri ditulis langsung di c # dengan cara seperti BNF (dicapai dengan beberapa operator kelebihan beban)
Hal terbaiknya adalah bahwa "tata bahasa" menghasilkan AST secara langsung.
Sesuatu yang sedang mendapatkan momentum dan sangat cocok untuk pekerjaan itu adalah Nemerle
Anda dapat melihat bagaimana itu bisa menyelesaikannya dalam video berikut dari NDC:
Tidak dalam C #, tetapi pengurai C # 2/3/4 lengkap yang membuat AST lengkap tersedia dengan Perangkat Rekayasa Ulang Perangkat Lunak DMS kami .
DMS menyediakan infrastruktur yang luas untuk penguraian, pembangunan pohon, pembuatan tabel simbol dan analisis aliran, transformasi sumber-ke-sumber, dan regenerasi kode sumber dari AST (yang dimodifikasi). (Ini juga menangani banyak bahasa lain selain C #.)
EDIT (September) 2013: Jawaban ini belum diperbarui baru-baru ini. DMS telah lama menangani C # 5.0