Tôi có một ngôn ngữ với cú pháp rất giống C++. Các lexer và phân tích cú pháp được đặt ra và sản xuất đúng AST. Đối với phần lớn nhất phụ trợ cũng được thực hiện.Viết trình biên dịch: làm cách nào để lấy các mẫu đơn giản để hoạt động?
Hệ thống cơ bản mà trình biên dịch sử dụng để tạo kiểu rất đơn giản: tất cả các loại được coi là tích hợp và tất cả các phiên bản đều là toàn cầu. Vì vậy, chỉ có một bản đồ đơn giản khớp với tên kiểu cho một phương thức tạo ra một biến số Biến số về cơ bản là một loại chung chung như boost :: any. bản đồ khác với tên của biến như chủ chốt và các biến như giá trị đóng vai trò như phạm vi toàn cầu:
std::map< std::string, std::function< Variable() > typeList;
//register some types
typeList[ "X" ] = Variable::Create<X>;
typeList[ "Y" ] = CreateInstanceOfY;
....
Khi trình biên dịch được nút AST cho một khởi như X myVar;
nó về cơ bản không
std::map< std::string, Variable > globalScope;
globalScope[ "myVar" ] = typeList[ "X" ]();
Khi myVar được sử dụng sau này có thể được truy cập bằng cách gửi đơn giản như
X& x = myVar.GetReference<X>();
Bây giờ tôi muốn mở rộng một chút và sử dụng các mẫu đơn giản. Giả sử có một loại "mảng" được thực hiện bằng cách sử dụng một vectơ. Tôi có thể đăng ký mọi thứ như
typeList[ "array<X>" ] = Variable::Create< std::vector<X> >;
nhưng không thể quản lý được vì nó sẽ phải được lặp lại cho tất cả các kết hợp. Lý tưởng nhất là tôi cần chức năng cho phép để viết một cái gì đó như thế này:
typeList.CreateTemplateVariable("array", "X")
mà sau đó sẽ tạo ra một trường hợp biến mà trong nội bộ tổ chức một std :: vector < X>. Tôi đã cố gắng hết sức nhưng không thể tìm ra cách để làm điều này. Có lẽ tôi vừa mới bắt đầu sai cách với ánh xạ kiểu đơn giản và đó là lý do tôi không thể có được cái đầu xung quanh nó.
Vì vậy, câu hỏi rất đơn giản: có thể thực hiện việc này không? Và làm thế nào?
khi bạn tạo mã c + + từ AST, nó vẫn là trình biên dịch. – belgther
Một chút về thuật ngữ: Trình biên dịch dịch mã từ định dạng này sang định dạng khác.Một thông dịch viên thực hiện một số mã. –
@ JoachimPileborg cảm ơn vì đã chỉ ra điều đó .. Tôi thực sự không giỏi về thuật ngữ. – stijn