2009-10-13 45 views
26

Tôi đang lập kế hoạch để viết trình biên dịch C# 3.0 trong C#. Tôi có thể lấy ngữ pháp để tạo trình phân tích cú pháp ở đâu?Tôi có thể tìm ngữ pháp C# 3.0 ở đâu?

Tốt nhất là loại hoạt động với ANTLR v3 mà không sửa đổi.

+6

Bạn biết rằng chúng tôi đã gửi miễn phí một trình biên dịch biên dịch C# 3, phải không? :-) Nhưng nghiêm túc, tại sao bạn xây dựng của riêng bạn? Chỉ để cho vui, hoặc có mục đích kinh doanh nào đó? (Lý do tôi hỏi là vì chúng tôi rất quan tâm đến việc học những gì "dịch vụ" mọi người muốn ra khỏi trình biên dịch của chúng tôi khác đơn giản là "nhổ tôi ra một số IL cho mã nguồn này".) –

+1

Eric: Chủ yếu cho vui. Tuy nhiên, tôi nghĩ ra một số ý tưởng ngôn ngữ theo thời gian mà tôi muốn tôi có thể kiểm tra. –

+0

@Mehrdad, nếu bạn nhận được một số mã đi, tôi có thể chơi xung quanh với nó :) –

Trả lời

7

Tôi đã chạy vào ANTLR C# Grammar on CodePlex. Đó là một dự án tương đối mới và sử dụng ANTLR 3.2. Nó nói nó hỗ trợ C# 4.0 và được cấp phép theo Giấy phép Công cộng Eclipse (EPL).

Tôi đã chơi với nó một chút. Nó có một loạt các tệp thử nghiệm chứa các biểu thức. Nó hỗ trợ lambdas, bối cảnh không an toàn, ... như bạn mong đợi một cách tự nhiên. Nó phân tích một tệp C# và đưa cho bạn một cây cú pháp trừu tượng. Bạn có thể làm bất cứ điều gì bạn muốn với nó.

3

Bạn đang tìm kiếm thứ gì đó như this hoặc this?

Vui lòng tham khảo C# ANLTR grammar câu hỏi.

+1

Ngữ pháp được liên kết không phải là C# 3.0. Nó không hỗ trợ lambdas. Điều đó đặc biệt quan trọng đối với tôi. –

+2

Dường như việc thêm hỗ trợ cho lambdas về các cấu trúc hiện có trong ngữ pháp là khá tầm thường, vì bạn chỉ cần xác định danh sách đối số.Điều này có thể sẽ cần LL (*), tuy nhiên, vì bạn có thể phân tích cú pháp một cái gì đó như '(a **' và không biết nếu điều này sẽ kết thúc là một biểu thức như '(a ** b)' (tức là nhân 'a' bởi kết quả của một tham số của 'b'), hoặc một biểu thức lambda' (a ** b) => ', cho đến khi bạn nhấn' => '. Vì không có giới hạn về số lượng của indirection (con trỏ đến con trỏ đến .. .), có vẻ như nó là LL (*) với tôi.Nhưng vì ANTLR3 hỗ trợ lựa chọn LL (*), nó không phải là vấn đề. –

+0

@ Pavel: Không chỉ vậy. Nó không hỗ trợ Generics. có lẽ sẽ viết trình phân tích cú pháp hoặc ngữ pháp của riêng tôi từ đầu nếu tôi không thể tìm thấy một ngữ pháp C# 3.0 hợp lý. –

12

Hãy xem C# Language Specification. Trong chương B. Ngữ pháp bạn sẽ tìm thấy ngữ pháp.

+0

Vâng, tất nhiên, thông số này có chứa ngữ pháp. –

+8

Nó không * chỉ * nằm rải rác trong suốt, chúng tôi có một phụ lục ở cuối với toàn bộ điều ở một nơi. Bạn có lẽ phải rằng nó woul d thực hiện một số sửa đổi để làm cho nó hoạt động cho trình tạo trình phân tích cú pháp. –

+1

Eric: Ồ, không chú ý đến phần đó. Cảm ơn bạn đã chỉ ra. –

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