2014-04-07 19 views
7

Tôi đang cố triển khai tính năng giống như DSL trong C#. Nó có thể trông giống như truy vấn LINQ. Tôi tự hỏi nếu nó có thể thực hiện các toán tử đơn hoặc nhị phân mới bằng Roslyn.Cách thêm toán tử mới vào C# bằng cách sử dụng Roslyn

Tôi đã googling vài ngày qua mà không thành công nhiều. Nó sẽ là tuyệt vời nếu ai đó có thể chỉ cho tôi một số mẫu hoặc tài liệu Roslyn.

+1

Tôi nghĩ bạn cần xem xét [ Tôi có thể hỏi những chủ đề nào ở đây?] (Http://stackoverflow.com/help/on-topic) –

+4

Câu hỏi chắc chắn KHÔNG yêu cầu đề xuất công cụ của bên thứ ba. Roslyn là một tính năng chính của phiên bản C# mới nhất. Người ta có thể nói rằng OP trước tiên nên kiểm tra trang của Roslyn. –

+1

Roslyn là một trình biên dịch, và chúng là [nguồn mở] (http://arstechnica.com/information-technology/2014/04/microsoft-open-sources-a-big-chunk-of-net/) nó. Vì vậy, về mặt kỹ thuật, bạn có thể thực hiện nhiều tính năng như bạn muốn, miễn là bạn có các kỹ năng cần thiết. – mason

Trả lời

9

Có hai cách làm thế nào bạn có thể sử dụng Roslyn để thực hiện một ngôn ngữ C# dựa trên mới.

  1. Sử dụng API Roslyn để phân tích mã nguồn thành cây cú pháp, sau đó chuyển đổi cây cú pháp thành C# thực và biên dịch điều đó.

    Đây là lý tưởng nếu ngôn ngữ của bạn thực sự là cú pháp hợp lệ C# mã, nhưng ngữ nghĩa khác nhau. Ví dụ, bạn có thể thực hiện await cách này, nếu bạn buộc await để trông giống như một cuộc gọi chức năng (ví dụ await(x) sẽ là hợp lệ, nhưng không await x).

    Nếu bạn muốn giới thiệu cú pháp mới (như một nhà điều hành mới), nó có thể làm việc, kể từ Roslyn không hỗ trợ phân tích cú pháp “vỡ” mã. Nhưng nó rất có thể sẽ không hoạt động tốt, bởi vì sau đó cây cú pháp có thể không nhìn theo cách bạn muốn. Tệ hơn nữa, kết quả có thể không nhất quán (đôi khi, cú pháp mới của bạn sẽ được phân tích cú pháp theo một cách, đôi khi khác).

  2. Vì Roslyn hiện là mã nguồn mở, bạn thực sự có thể sửa đổi mã nguồn của trình biên dịch theo bất kỳ cách nào bạn muốn, bao gồm thêm toán tử mới.

    Nhưng thực hiện điều đó rất có thể sẽ không đơn giản. Và tôi nghĩ rằng quy trình làm việc cũng phức tạp hơn: bạn cần phải biên dịch phiên bản trình biên dịch của riêng mình, không chỉ sử dụng thư viện từ NuGet như trong tùy chọn 1.

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