it-swarm-id.com

Parser untuk C #

Parser mana yang tersedia untuk mem-parsing kode C #?

Saya mencari parser C # yang dapat digunakan dalam C # dan memberi saya akses ke informasi baris dan file tentang setiap artefak dari kode yang dianalisis.

99
Julien Hoarau

Bekerja pada kode sumber:

Bekerja di Majelis:

Masalah dengan Majelis "parsing" adalah bahwa kami memiliki lebih sedikit informasi tentang baris dan file (informasi didasarkan pada file .pdb, dan Pdb berisi informasi baris hanya untuk metode)

Saya pribadi menyarankan Mono.Cecil dan NRefactory .

116
Julien Hoarau

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

7
aku

Jika Anda akan mengkompilasi C # v3.5 ke .net assemblies:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.Microsoft.com/en-us/library/Microsoft.csharp.csharpcodeprovider.aspx

6
zproxy

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

5
prosseek

Saya telah mengimplementasikan apa yang Anda minta (AST Parsing dari kode C #) di OWASP O2 Platform proyek menggunakan SharpDevelop AST API.

Untuk membuatnya lebih mudah dikonsumsi, saya menulis API cepat yang memaparkan sejumlah elemen kode sumber utama (menggunakan pernyataan, tipe, metode, properti, bidang, komentar) dan dapat menulis ulang kode C # asli menjadi C # dan ke VBNET .

Anda dapat melihat API ini beraksi pada file skrip O2 XRule ini: ascx_View_SourceCode_AST.cs.o2 .

Misalnya ini adalah bagaimana Anda memproses teks kode sumber C # dan mengisi sejumlah 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");                                
    }

Contoh pada ascx_View_SourceCode_AST.cs.o2 juga menunjukkan bagaimana Anda kemudian dapat menggunakan informasi yang dikumpulkan dari AST untuk memilih pada kode sumber jenis, metode, komentar, dll ..

Untuk referensi di sini adalah kode API yang menulis (perhatikan bahwa ini adalah pass pertama saya menggunakan SharpDevelop's C # AST parser, dan saya masih mendapatkan kepalaku tentang cara kerjanya):

4
Dinis Cruz

Kami baru-baru ini merilis parser C # yang menangani semua fitur C # 4.0 ditambah fitur async baru: C # Parser dan CodeDOM

Perpustakaan ini menghasilkan model objek semantik yang menyimpan komentar dan memformat informasi dan dapat dimodifikasi dan disimpan. Ini juga mendukung penggunaan kueri LINQ untuk menganalisis kode sumber.

3
Ken Beckett
2
Galwegian

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

2
Akselsson

Pertimbangkan untuk menggunakan refleksi pada biner yang dibuat alih-alih menguraikan kode C # secara langsung. API refleksi sangat mudah digunakan dan mungkin Anda bisa mendapatkan semua informasi yang Anda butuhkan?

2
Hallgrim

Mungkin Anda bisa mencoba dengan Irony di irony.codeplex.com.

Ini sangat cepat dan tata bahasa c # sudah ada.

Tata bahasa itu sendiri ditulis langsung dalam c # dalam cara seperti BNF (dicapai dengan beberapa operator kelebihan)

Hal terbaik dengan itu adalah bahwa "tata bahasa" menghasilkan AST secara langsung.

2
SeeSoft

Lihat Parser Emas . Ini memiliki IU yang sangat intuitif yang memungkinkan Anda menguji tata bahasa Anda secara interaktif dan menghasilkan kode C #. Ada banyak contoh yang tersedia dan sepenuhnya gratis.

2
sbeskur

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

2
Jason

Sesuatu yang mendapatkan momentum dan sangat sesuai untuk pekerjaan itu adalah Nemerle

anda dapat melihat bagaimana cara menyelesaikannya di video-video ini dari NDC:

1
Stéphane

Tidak dalam C #, tetapi parser C # 2/3/4 lengkap yang membuat AST lengkap tersedia dengan Perangkat Deng Rekayasa Perangkat Lunak DMS .

DMS menyediakan infrastruktur yang luas untuk penguraian, pembangunan pohon, konstruksi 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

1
Ira Baxter