Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Thông dịch máy ngăn xếp có biến

    Xây dựng một trình thông dịch cho một máy ngăn xếp (stack machine) đơn giản có biến nguyên. Chương trình gồm nnn dòng lệnh, mỗi dòng thuộc một trong các dạng:

    • PUSH k: đẩy số nguyên kkk vào đỉnh ngăn xếp.
    • LOAD x: đẩy giá trị hiện tại của biến xxx vào đỉnh ngăn xếp (nếu biến xxx chưa từng được gán, giá trị mặc định là 000).
    • STORE x: lấy giá trị ở đỉnh ngăn xếp ra (pop) và gán cho biến xxx.
    • ADD, SUB, MUL, DIV: lấy hai giá trị trên đỉnh ngăn xếp ra (pop bbb trước, rồi pop aaa), tính a op ba \ \text{op}\ ba op b (riêng DIV là phép chia lấy phần nguyên kiểu Python, làm tròn xuống — toán tử //; đề đảm bảo b≠0b \neq 0b=0), rồi đẩy kết quả trở lại ngăn xếp.
    • PRINT: in ra giá trị đang ở đỉnh ngăn xếp (không pop).

    Tên biến là chuỗi chữ cái thường không chứa khoảng trắng. Đề đảm bảo không có test nào khiến ngăn xếp bị pop khi đang rỗng.

    Ví dụ: chương trình PUSH 3 / PUSH 4 / ADD / STORE x / LOAD x / PRINT in ra 7.

    • Định dạng đầu vào:

      Dòng đầu chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000). nnn dòng tiếp theo, mỗi dòng một lệnh đúng theo định dạng trên (các thành phần cách nhau bởi một khoảng trắng).

    • Định dạng đầu ra:

      Mỗi lệnh PRINT được thực thi tạo ra một dòng in giá trị nguyên tương ứng, theo đúng thứ tự thực hiện. Nếu chương trình không có lệnh PRINT nào, không in gì cả.

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    
    

    Đầu vào:

    6
    PUSH 3
    PUSH 4
    ADD
    STORE x
    LOAD x
    PRINT
    

    Đầu ra:

    7
    

    Đang tải editor...