2011-11-15 43 views
7

Tôi đang tìm kiếm khả năng chuyển đổi toàn bộ các phương thức thành các cây Biểu thức. Viết nó ra sẽ hút. :)Tìm kiếm trình biên dịch C# => Trình biên dịch LINQ

Vì vậy (ví dụ tầm thường) cho văn bản sau đây:

public static int Add(int a, int b) 
{ 
    return a + b; 
} 

Tôi muốn hoặc là có được một đối tượng trong bộ nhớ mà đại diện này, hoặc văn bản sau đây:

ParameterExpression a = Expression.Parameter(typeof(int), "a"); 
ParameterExpression b = Expression.Parameter(typeof(int), "b"); 
var expectedExpression = Expression.Lambda<Func<int, int, int>>(
     Expression.Add(a,b), 
     a, 
     b 
    ); 

Bất kỳ ý tưởng? Có ai có thể làm điều gì đó với Roslyn có thể làm điều này?

CHỈNH SỬA: Làm rõ: Tôi muốn hút bất kỳ phương thức C# nào (ví dụ: phương thức trên) dưới dạng văn bản và tạo ra một biểu thức kết quả. Về cơ bản, tôi đang tìm cách biên dịch bất kỳ phương thức C# nào thành các cây Biểu thức.

Trả lời

8

Có Roslyn có thể làm, nhưng Roslyn có cây biểu hiện riêng của mình (chúng được gọi là cây cú pháp), các công cụ Roslyn cho phép bạn tải và thực thi biểu thức hoặc báo cáo.

Bạn sẽ phải viết trình đi bộ cú pháp cây của riêng mình để chuyển đổi cây cú pháp Roslyn thành cây biểu thức của bạn, nhưng mọi thứ có thể không khớp chính xác.

+0

Tôi cho rằng Roslyn có thể làm được. Bạn có biết bất kỳ nguồn hiện có nào đã thực hiện nó chưa? Tôi đang tìm một cái gì đó có sẵn. – Shlomo

+0

Roslyn là ra cho một tháng duy nhất, tôi nghĩ rằng nó sẽ mất đôi khi bởi vì mọi người sẽ viết và thử nghiệm với nó. Nhưng bạn có thể làm một cái gì đó trên plex mã cho trình biên dịch biểu hiện sử dụng mỉa mai vv Tôi nghĩ rằng đôi khi mọi người sẽ đăng dự án trên plex mã cho Roslyn hoặc bạn có thể bắt đầu một và yêu cầu mọi người đóng góp và nó sẽ xây dựng từ đó. –

0

Bản thân cây biểu thức không được tạo khi chạy từ bất kỳ thứ gì khác ngoài Expression s hoặc lambdas (nghĩa là không thể truy xuất câu lệnh bổ sung đầu tiên từ tệp thực thi của bạn dưới dạng cây biểu thức). Tuy nhiên, bạn có thể sử dụng mã DOM trên mã C# (không phải là tệp thực thi) và xây dựng một trình dịch từ DOM thành một cây biểu thức.

+0

Khá các cây biểu thức đảo ngược * được * tạo vào thời gian thực thi. Khi trình biên dịch thấy một biểu thức lambda với một kiểu đích của một cây biểu thức, nó phát ra IL để xây dựng một cây biểu thức tại thời gian thực hiện. Bạn có thể viết mã C# để xây dựng một cây biểu thức quá, như được hiển thị trong câu hỏi. –

+0

Tôi xin lỗi vì tôi có thể đã hiểu sai những gì tôi dự định truyền đạt. Tôi không loại trừ 'Expression' hoặc lambdas thực tế, mà chỉ là các câu lệnh thông thường, chẳng hạn như nói 'var a = 1 + 2;'. Các câu lệnh như vậy không ở dạng cây biểu thức trong thời gian thực hiện. – doctorless

+0

Nhưng các biểu thức lambda có thể được chuyển đổi thành các cây biểu thức sao cho cây cú pháp trừu tượng được biểu diễn * bởi * một cây biểu thức tại thời gian thực hiện. Nó vẫn không thực sự rõ ràng những gì bạn có nghĩa là - Tôi đề nghị bạn chỉnh sửa câu trả lời của bạn để làm rõ. –

1

Tại sao không:

Expression<Func<int,int,int>> expr = (a,b) => a + b; 
+0

Tôi sẽ làm rõ câu hỏi của mình. Tôi muốn một hàm có thể quét văn bản của phương thức ở trên và tạo ra văn bản để xây dựng cây Biểu thức hoặc chính đối tượng cây Biểu thức. – Shlomo

1

Xem billchi_ms trả lời tại địa chỉ: http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/e6364fec-29c5-4f1d-95ce-796feb25a8a9

Câu trả lời ngắn gọn là chúng tôi có thể cung cấp, hoặc ai đó có thể viết một cái cây Roslyn để ET v2, nhưng cây Roslyn có thể đại diện cho ngôn ngữ đầy đủ của VB và C# khi ETS v2 có thể không (ví dụ, nhập định nghĩa hoặc một số tham chiếu liên quan đến ref).

Các vấn đề liên quan