Xin chào tất cả mọi người Tôi hiện đang triển khai một ngôn ngữ lập trình đơn giản cho trải nghiệm học tập nhưng tôi cần một số lời khuyên. Hiện tại tôi đang thiết kế phiên dịch của tôi và tôi đã gặp vấn đề.Thực hiện một máy ảo dựa trên ngăn xếp cho một tập hợp con của C
Ngôn ngữ của tôi là tập hợp con của C và tôi gặp sự cố liên quan đến việc triển khai trình thông dịch chồng. Trong ngôn ngữ sau đây sẽ biên dịch:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
Bây giờ đây là được rồi nhưng khi "1 + 2" được tính kết quả được đẩy lên một chồng và sau đó trở về chức năng nhưng vẫn có một số trên stack, và không nên có. Làm thế nào tôi có thể giải quyết vấn đề này?
Tôi đã nghĩ về việc lưu "trạng thái" của ngăn xếp trước khi gọi hàm và khôi phục "trạng thái" sau khi gọi hàm. Ví dụ, lưu số lượng các phần tử trên stack, sau đó thực thi mã hàm, trả về và sau đó bật từ stack cho đến khi chúng ta có cùng số phần tử như trước (hoặc có thể +1 nếu hàm trả về một cái gì đó).
Bất kỳ ý tưởng nào? Cảm ơn mọi lời khuyên!
trong biểu diễn AST của tôi, tôi có một nút gọi là "ASTStmtExpr" chỉ cho điều này! Tôi nghĩ rằng tôi bắt đầu hiểu, loại ... Đây là những gì tôi không chắc chắn về: Do những hạn chế của những bình luận trả lời tôi có để dán một snipplet: \t trống Compiler :: lần (const ASTStmtExpr & expr_stmt, std :: shared_ptr func) \t \t { \t \t \t expr_stmt.expr() -> chấp nhận (* này, func); \t \t} Bạn đang nói rằng tôi nên thêm một OP_POP sau này, và cho những thứ như bài tập tôi sẽ đẩy một giả "Nil" đối tượng để nó sau đó sẽ được xuất hiện? –
Xin lỗi tôi không biết các ý kiến không được định dạng –
Đối với các bài tập không, bạn không đẩy giá trị giả, vì bạn sẽ có kết quả của bài tập trên ngăn xếp đã có. Một nhiệm vụ chỉ là một biểu thức sử dụng toán tử '=', không khác với '+' hoặc '-' trừ' = 'có một tác dụng phụ của việc gán cho một biến. Nếu không nó hoạt động giống như tất cả các nhà khai thác khác. –