Parser untuk C #

101

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.

Julien Hoarau
sumber

Jawaban:

118

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 .

Julien Hoarau
sumber
1
CS-Script ( csscript.net ) - C # Script Engine dapat menyesuaikan daftar ini. Contoh dari "Memperkenalkan Microsoft" Roslyn "CTP" sangat mirip dengan CS-script.
Dzmitry Lahoda
1
Saat Anda menyebutkan biaya, perhatikan bahwa Roslyn memerlukan setidaknya versi Pro dari Visual Studio.
kristianp
7

Mono (open source) termasuk kompiler C # (dan tentu saja parser)

aku
sumber
Apa keuntungan menggunakan Mono dibandingkan parser lainnya? Bisakah saya mendapatkan info tentang AST dari program C # menggunakan pengunjung? Jika demikian, dapatkah Anda mengarahkan saya ke halaman yang menampilkan halaman untuk itu?
yeeen
6

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

zproxy
sumber
1
Terutama lihat CodeDomProvider.Parse()metodenya.
Don Kirkby
3
Tidak, jangan lihat metode CodeDomProvider.Parse () yang melontarkan pengecualian NotImplemented di build publik! (Visual Studio menggunakan parser internal berpemilik).
Robin Davies
5

Jika Anda terbiasa dengan ANTLR, Anda dapat menggunakan tata bahasa Antlr C # .

prosseek
sumber
4

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

Dinis Cruz
sumber
Ya, ini tampaknya solusi termudah setidaknya berdasarkan apa yang telah saya lihat. Saya sedang mencari parser yang layak dan menemukan blog ini svengrand.blogspot.com/2010/10/… yang juga merinci bagaimana menggunakan parser C # SharpDevelop.
Alex
3

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.

Ken Beckett
sumber
2

SharpDevelop , sebuah IDE open source, hadir dengan parser kode berbasis pengunjung yang bekerja dengan sangat baik. Ini dapat digunakan secara independen dari IDE.

Akselsson
sumber
2

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?

Hallgrim
sumber
3
Refleksi adalah cara yang buruk untuk melakukan analisis statis; ia hanya memberikan informasi yang dapat diekstrak oleh logika refleksi (misalnya, "nama metode di kelas". Ia tidak memberikan informasi detail ("apa sisi kanan dari tugas ini?") dan sangat membatasi jenis statis analisis yang bisa dilakukan.
Ira Baxter
@Ira Baxter Ada beberapa batasan, tetapi ingat bahwa Anda juga bisa mendapatkan kode IL melalui refleksi. Ini berarti Anda dapat memahami metode apa yang dipanggil, apa yang ditugaskan ke variabel mana, dll. Saya tidak dapat memikirkan banyak kasus di mana itu tidak cukup. Lihat saja apa yang bisa dilakukan semua plugin Reflector.
Hallgrim
bagaimana Anda mendapatkan kode IL yang sebenarnya melalui Refleksi? Sejauh yang saya tahu, Refleksi tidak menyediakan ini dan Anda perlu menggunakan CCI Lihat: stackoverflow.com/questions/2824086/…
Ash
2

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.

sbeskur.dll
sumber
2
OP meminta sesuatu yang dapat mengurai C #, bukan sesuatu di C # yang mengurai sesuatu yang lain.
Ira Baxter
2

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.

SeeSoft
sumber
Komentar di Irony.Samples / CSharp / CSharpGrammar.cs mengatakan "CATATAN: Tata bahasa ini hanyalah demo, dan ini adalah demo rusak". Jadi setidaknya ini bukan implementasi yang lengkap.
vladich
2

Anda pasti harus memeriksa Roslyn karena MS baru saja membuka (atau akan segera membuka) kode dengan lisensi Apache 2 di sini . Anda juga dapat melihat cara untuk mengurai info ini dengan kode ini dari GitHub .

Jason
sumber
1

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:

Stéphane
sumber
Nemerle adalah bahasa pemrograman. Bahasa pemrograman yang bagus, saya setuju, tetapi pertanyaannya adalah bagaimana mengurai kode C # di dalam C #!
Qwertie
Anda membuat aturan di nemerle, dan menggunakannya dari C #, tidak ada yang mengatakan parser harus dalam C #, tapi apa pun, turunkan suara.
Stéphane
1

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

Ira Baxter
sumber
-1

GPPG mungkin berguna, jika Anda ingin menulis parser Anda sendiri (yang menyenangkan).

leppie
sumber