Trình phân tích cú pháp cho C #


101

Trình phân tích cú pháp nào có sẵn để phân tích cú pháp mã C #?

Tôi đang tìm một trình phân tích cú pháp C # có thể được sử dụng trong C # và cấp cho tôi quyền truy cập vào thông tin dòng và tệp về từng đồ vật của mã được phân tích.

Câu trả lời:


118

Hoạt động trên mã nguồn:

  • CSParser : Từ C # 1.0 đến 2.0, mã nguồn mở
  • Metaspec C # Parser : Từ C # 1.0 đến 3.0, sản phẩm thương mại (khoảng 5000 $)
  • #nhìn nhận! : Từ C # 1.0 đến 3.0, sản phẩm thương mại (khoảng 900 €) (câu trả lời của SharpRecognize )
  • SharpDevelop Parser (câu trả lời của Akselsson )
  • NRefactory : Từ C # 1.0 đến 4.0 (+ async), mã nguồn mở, trình phân tích cú pháp được sử dụng trong SharpDevelop. Bao gồm phân tích ngữ nghĩa.
  • C # Parser và CodeDOM : Một C # 4.0 Parser hoàn chỉnh, đã hỗ trợ tính năng không đồng bộ C # 5.0. Sản phẩm thương mại (49 $ đến 299 $) (câu trả lời của Ken Beckett )
  • Microsoft Roslyn CTP : Trình biên dịch dưới dạng dịch vụ.

Hoạt động trên lắp ráp:

Vấn đề với assembly "phân tích cú pháp" là chúng ta có ít thông tin hơn về dòng và tệp (thông tin dựa trên tệp .pdb và Pdb chỉ chứa thông tin về dòng cho các phương thức)

Tôi khuyên bạn nên dùng Mono.CecilNRefactory .


1
CS-Script ( csscript.net ) - C # Script Engine có thể phù hợp với danh sách này. Mẫu "Giới thiệu CTP" Roslyn "của Microsoft" giống như CS-script có thể làm.
Dzmitry Lahoda

1
Trong khi bạn đang đề cập đến chi phí, hãy lưu ý rằng Roslyn yêu cầu ít nhất phiên bản Pro của Visual Studio.
kristianp

7

Mono (mã nguồn mở) bao gồm trình biên dịch C # (và tất nhiên là trình phân tích cú pháp)


Lợi thế của việc sử dụng Mono so với các trình phân tích cú pháp khác là gì? Tôi có thể lấy thông tin về AST của chương trình C # bằng cách sử dụng khách truy cập không? Nếu vậy, bạn có thể hướng dẫn tôi đến trang hiển thị trang đó không?
yeeen 17/09/09

6

Nếu bạn định biên dịch C # v3.5 sang các hợp ngữ .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


1
Đặc biệt nhìn vào CodeDomProvider.Parse()phương pháp.
Don Kirkby

3
Không, đừng nhìn vào phương thức CodeDomProvider.Parse () tạo ra một ngoại lệ NotImplemented trong các bản dựng công khai! (Visual Studio sử dụng trình phân tích cú pháp nội bộ độc quyền).
Robin Davies


4

Tôi đã triển khai những gì bạn đang yêu cầu (Phân tích cú pháp AST của mã C #) tại dự án Nền tảng OWASP O2 bằng cách sử dụng các API SharpDevelop AST.

Để dễ sử dụng hơn, tôi đã viết một API nhanh để hiển thị một số phần tử mã nguồn chính (sử dụng câu lệnh, kiểu, phương thức, thuộc tính, trường, nhận xét) và có thể viết lại mã C # ban đầu thành C # và vào VBNET .

Bạn có thể thấy API này đang hoạt động trên tệp kịch bản O2 XRule này: ascx_View_SourceCode_AST.cs.o2 .

Ví dụ: đây là cách bạn xử lý văn bản mã nguồn C # và điền một số TreeView & TextBox:

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

Ví dụ trên ascx_View_SourceCode_AST.cs.o2 cũng cho thấy cách bạn có thể sử dụng thông tin thu thập được từ AST để chọn loại, phương pháp, nhận xét, v.v. trên mã nguồn.

Để tham khảo, đây là mã API đã viết (lưu ý rằng đây là lần đầu tiên tôi sử dụng trình phân tích cú pháp C # AST của SharpDevelop và tôi vẫn đang suy nghĩ về cách hoạt động của nó):


Vâng, đây có vẻ là giải pháp dễ nhất trong số các giải pháp ít nhất dựa trên những gì tôi đã thấy. Tôi đang tìm kiếm một trình phân tích cú pháp tốt và tình cờ thấy blog này svengrand.blogspot.com/2010/10/… , trang này cũng hướng dẫn chi tiết cách sử dụng trình phân tích cú pháp C # của SharpDevelop.
Alex

3

Gần đây chúng tôi đã phát hành trình phân tích cú pháp C # xử lý tất cả các tính năng của C # 4.0 cùng với tính năng không đồng bộ mới: Trình phân tích cú pháp C # và CodeDOM

Thư viện này tạo ra một mô hình đối tượng ngữ nghĩa giữ lại các nhận xét và thông tin định dạng và có thể được sửa đổi và lưu lại. Nó cũng hỗ trợ việc sử dụng các truy vấn LINQ để phân tích mã nguồn.



2

SharpDevelop , một IDE mã nguồn mở, đi kèm với một trình phân tích mã dựa trên khách truy cập, hoạt động thực sự tốt. Nó có thể được sử dụng độc lập với IDE.


2

Cân nhắc sử dụng phản xạ trên một nhị phân được xây dựng thay vì phân tích mã C # trực tiếp. API phản chiếu thực sự dễ sử dụng và có lẽ bạn có thể nhận được tất cả thông tin mình cần?


3
Suy ngẫm là một cách không tốt để thực hiện phân tích tĩnh; nó chỉ cung cấp thông tin mà logic phản xạ có thể trích xuất (ví dụ: "tên của các phương thức trong lớp". Nó không cung cấp thông tin chi tiết ("phía bên phải của phép gán này là gì?") và do đó hạn chế nghiêm trọng kiểu tĩnh đó phân tích người ta có thể làm.
Ira Baxter

@Ira Baxter Có một số hạn chế, nhưng hãy nhớ rằng bạn cũng có thể lấy mã IL thông qua phản chiếu. Điều này có nghĩa là bạn có thể hiểu những phương thức nào được gọi, những gì được gán cho những biến nào, v.v. Tôi không thể nghĩ ra nhiều trường hợp mà nó không đủ. Chỉ cần nhìn vào những gì mà tất cả các plugin Reflector có thể làm.
Hallgrim

làm thế nào để bạn nhận được mã IL thực tế thông qua Reflection? Theo như tôi biết Reflection không cung cấp này và bạn cần phải sử dụng CCI Xem: stackoverflow.com/questions/2824086/...
Ash

2

Hãy xem Gold Parser . Nó có một IU rất trực quan cho phép bạn kiểm tra ngữ pháp của mình một cách tương tác và tạo mã C #. Có rất nhiều ví dụ có sẵn với nó và nó hoàn toàn miễn phí.


2
OP yêu cầu thứ gì đó có thể phân tích cú pháp C #, không phải thứ gì đó trong C # có thể phân tích cú pháp thứ gì đó khác.
Ira Baxter

2

Có lẽ bạn có thể thử với Irony trên irony.codeplex.com.

Nó rất nhanh và ngữ pháp ac # đã tồn tại.

Bản thân ngữ pháp được viết trực tiếp bằng c # theo cách giống như BNF (có một số lỗi nạp chồng toán tử)

Điều tốt nhất với nó là "ngữ pháp" tạo ra AST trực tiếp.


Nhận xét trong Irony.Samples / CSharp / CSharpGrammar.cs cho biết "LƯU Ý: Ngữ pháp này chỉ là bản demo và nó là bản demo bị hỏng". Vì vậy, ít nhất nó không phải là một triển khai hoàn chỉnh.
vladich

2

Bạn chắc chắn nên kiểm tra Roslyn vì MS mới mở (hoặc sẽ sớm mở) mã có giấy phép Apache 2 tại đây . Bạn cũng có thể xem cách phân tích cú pháp thông tin này bằng mã này từ GitHub .


1

Một thứ đang có động lực và rất thích hợp với công việc là Nemerle

bạn có thể xem cách nó có thể giải quyết nó trong các video này từ NDC:


Nemerle là một ngôn ngữ lập trình. Tôi đồng ý là một ngôn ngữ lập trình hay, nhưng câu hỏi đặt ra là làm thế nào để phân tích cú pháp mã C # bên trong C #!
Qwertie

bạn tạo quy tắc trong nemerle và sử dụng nó từ C #, không có gì nói rằng trình phân tích cú pháp phải ở trong C #, nhưng bất cứ điều gì, hãy từ chối.
Stéphane

1

Không có trong C #, nhưng trình phân tích cú pháp C # 2/3/4 đầy đủ để xây dựng các AST đầy đủ có sẵn với Bộ công cụ tái cấu trúc phần mềm DMS của chúng tôi .

DMS cung cấp một cơ sở hạ tầng rộng lớn để phân tích cú pháp, xây dựng cây, xây dựng các bảng ký hiệu và phân tích luồng, chuyển đổi từ nguồn sang nguồn và tái tạo mã nguồn từ các AST (đã sửa đổi). (Nó cũng xử lý nhiều ngôn ngữ khác ngoài C #.)

EDIT (Tháng 9) 2013: Câu trả lời này chưa được cập nhật gần đây. DMS từ lâu đã xử lý C # 5.0


-1

GPPG có thể được sử dụng, nếu bạn sẵn sàng viết trình phân tích cú pháp của riêng mình (thật thú vị).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.