Cho phép nói rằng tôi đang xây dựng trình phân tích cú pháp cho ngôn ngữ dành riêng cho miền trong F #.Mẫu thiết kế F #
tôi đã xác định một sự kết hợp kỳ thị để đại diện cho biểu thức:
type Expression =
| Equality of Expression*Expression
| NonEquality of Expression*Expression
| Or of Expression*Expression
| And of Expression*Expression
| If of Expression*Expression
| IfElse of Expression*Expression*Expression
| Bool of bool
| Variable of string
| StringLiteral of string
Bây giờ, tôi đã xây dựng được một AST loại Expression
và muốn tạo mã cho nó. Tôi có một chức năng mà gõ suy luận và gõ kiểm tra trên một biểu thức.
Nó được định nghĩa như
let rec InferType expr =
match expr with
| Equality(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| Or(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| And(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
...
Và tôi có một chức năng để tạo ra mã mà sau một mô hình tương tự: Đi một biểu thức, viết báo cáo mẫu-phù hợp cho từng hạng mục trong đoàn.
Câu hỏi của tôi là: Đây có phải là cách thành ngữ để thực hiện điều đó trong F # không?
Dường như với tôi rằng nó sẽ sạch hơn nếu mỗi thành viên của liên minh xác định riêng InferType
và GenerateCode
tại địa phương với nó.
Nếu tôi đang sử dụng C#, tôi sẽ xác định một số lớp cơ sở trừu tượng được gọi là Expression
với các phương pháp ảo cho InferType
và GenerateCode
rồi ghi đè chúng trong từng phân lớp.
Có cách nào khác để thực hiện việc này không?
Cảm ơn - đây là câu trả lời tôi đang tìm kiếm . –