2008-10-17 48 views
15

Hiện tại, có thể dịch mã C# thành một cây cú pháp trừu tượng không?Dịch mã C# sang AST?

Chỉnh sửa: một số làm rõ; Tôi không nhất thiết mong đợi trình biên dịch tạo ra AST cho tôi - một trình phân tích cú pháp sẽ ổn, mặc dù tôi muốn sử dụng một cái gì đó "chính thức". Lambda biểu hiện là tiếc là sẽ không đủ cho họ không cho phép tôi sử dụng các cơ quan tuyên bố, đó là những gì tôi đang tìm kiếm.

+0

Tự hỏi làm cách nào để tìm cách dịch mã C# sang AST? – yeeen

+0

Tôi tạm dừng dự án. –

+4

Giữ lâu dài ... Lol –

Trả lời

17

Dự án Roslyn nằm trong Visual Studio 2010 và cung cấp cho bạn quyền truy cập có lập trình vào Syntax Tree, trong số những thứ khác.

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here "); 
var root = (CompilationUnitSyntax)tree.Root; 
+0

Tôi sẽ đăng bài này như là một câu trả lời cho câu hỏi của riêng tôi, nhưng bạn đánh tôi với nó. =) –

6

Kiểm tra hỗ trợ .NET CodeDom. Có một bài viết cũ về dự án mã cho một C# CodeDOM parser, nhưng nó sẽ không hỗ trợ các tính năng ngôn ngữ mới.

Cũng có nghĩa vụ phải hỗ trợ trong #develop để tạo cây CodeDom từ mã nguồn C# theo số posting này.

0

Vui lòng xem dự án R # (xin lỗi tài liệu bằng tiếng Nga, nhưng có một số ví dụ về mã). Nó cho phép các thao tác AST trên mã C#. SVN

http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml

dự án là here: (URL cập nhật, cảm ơn, derigel)

Cũng xin vui lòng xem ngôn ngữ Nemerle. Nó là một ngôn ngữ .Net với sự hỗ trợ mạnh mẽ cho lập trình meta.

+0

Kho lưu trữ hiện có tại http://svn.rsdn.ru/svn/RSharp/ – derigel

12

Hiện tại, bạn có thể dịch mã C# thành Cây cú pháp trừu tượng không?

Vâng, trivially trong những hoàn cảnh đặc biệt (= bằng cách sử dụng mới Expressions framework):

// Requires 'using System.Linq.Expressions;' 
Expression<Func<int, int>> f = x => x * 2; 

Điều này tạo ra một cây biểu thức lambda, tức là một chức năng thực thi một int và trả lại gấp đôi. Bạn có thể sửa đổi các cây biểu hiện bằng cách sử dụng khuôn khổ Expressions (= các lớp từ trong không gian tên đó) và sau đó biên dịch nó ở thời gian chạy:

var newBody = Expression.Add(f.Body, Expression.Constant(1)); 
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters); 
var compiled = f.Compile(); 
Console.WriteLine(compiled(5)); // Result: 11 

Chú ý rằng tất cả các biểu thức là không thay đổi nên họ phải được xây dựng một lần nữa bởi thành phần. Trong trường hợp này, tôi đã thêm vào trước một bổ sung 1.

Lưu ý rằng các cây biểu thức này chỉ hoạt động trên các biểu thức thực tế tức là nội dung được tìm thấy trong hàm C#. Bạn không thể nhận được các cây cú pháp cho các cấu trúc cao hơn như các lớp theo cách này. Sử dụng khung công tác CodeDom cho chúng.

+0

Erik chấp nhận điều này? Nó sử dụng các hình thức rất lambda ông nói rằng ông không muốn. –

+1

Ira: bạn nên chú ý đến sự phát triển của cuộc thảo luận. Mục nhập này đã được đăng * trước * chỉnh sửa/làm rõ của Erik. Rõ ràng, không có câu trả lời nào khác tốt hơn * vào thời điểm đó * (chú ý: * một năm trước! *) Nên anh không chấp nhận câu trả lời khác. Câu trả lời của bạn có lẽ là điều anh ta muốn. –

2

Dường như loại chức năng này sẽ được bao gồm với bất kỳ điều gì đến sau C# 4, theo số Anders Hejlsberg's 'Future of C#' PDC video.

+0

Điều này rất hữu ích để xem C# không cung cấp thư viện nào để chúng tôi thao túng API C#. Đó là do trình biên dịch của nó là một trình biên dịch cổ điển, một hộp đen! – yeeen

2

ANTLR Parser Generator có ngữ pháp cho C# 3.0 bao gồm mọi thứ ngoại trừ cú pháp LINQ.

+0

Tôi đã sử dụng ANTLR trong quá khứ và nó khá đẹp. Tôi đã không sử dụng ngữ pháp C#, nhưng hầu hết các cộng tác viên có khá cluey. – Travis

1

C# front end for DMS phân tích cú pháp đầy đủ C# 3.0 của chúng tôi bao gồm LINQ và tạo AST. DMS trên thực tế là một hệ sinh thái để phân tích/chuyển đổi mã nguồn bằng cách sử dụng AST cho các langauges được cung cấp trước.

EDIT 3/10/2010: ... Bây giờ xử lý đầy đủ C# 4.0

EDIT: 2014/06/27: Xử lý C# 5.0 từ khá sớm.

CHỈNH SỬA: 15/6/2016: Xử lý C# 6.0. Xem https://stackoverflow.com/a/37847714/120163 để biết mẫu AST.

+0

2004? Tôi đoán năm 2010. – Cheeso

+0

@ Cheeso: Hmm, 2004 có nghĩa là chúng tôi đã moi MS. Vâng, nó không bao giờ làm để gợi ý rằng, vì vậy tôi sửa đổi nó nói năm 2010. Cố định. –

4

Có rất nhiều mạnh mẽ hơn R # dự án. Nemerle.Peg:

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/

Và nó có C# Parser mà parsers tất cả các mã C# và chuyển nó thành AST!

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/

Bạn có thể tải về cài đặt ở đây: https://code.google.com/p/nemerle/

+0

Hơn nữa. Nemerle có thể biên dịch các nguồn C# bằng trình biên dịch Nemerle! :) –

1

Đó là kỳ lạ mà không ai gợi ý hack Mono biên dịch C# hiện có.

3

Cá nhân, tôi sẽ sử dụng NRefactory, đây là nguồn mở, miễn phí và phổ biến.