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 ảo ngăn xếp (stack-based VM)

    Nhiều ngôn ngữ (Python, Java) biên dịch mã nguồn thành bytecode rồi thông dịch bằng một máy ảo dựa trên ngăn xếp (stack-based virtual machine). Hãy viết một trình thông dịch cho một máy ảo đơn giản gồm các lệnh sau (mỗi lệnh trên một dòng):

    • PUSH x: đẩy số nguyên xxx vào đỉnh ngăn xếp.
    • ADD, SUB, MUL, DIV: lấy ra hai phần tử trên đỉnh (gọi lần lượt là bbb rồi aaa, theo thứ tự lấy ra), tính a+ba+ba+b, a−ba-ba−b, a×ba \times ba×b hoặc a÷ba \div ba÷b (chia lấy phần nguyên làm tròn về 0) rồi đẩy kết quả trở lại.
    • DUP: nhân đôi phần tử trên đỉnh (đẩy thêm một bản sao).
    • POP: xoá phần tử trên đỉnh.
    • PRINT: in ra giá trị phần tử trên đỉnh (không xoá khỏi ngăn xếp).
    • HALT: dừng chương trình ngay lập tức (các lệnh phía sau, nếu có, không được thực thi).

    Nếu tại một lệnh nào đó ngăn xếp không đủ phần tử cần thiết, hoặc DIV chia cho 0, chương trình dừng ngay và in thêm dòng ERROR (sau các dòng PRINT đã thực hiện thành công trước đó).

    Ví dụ: chương trình PUSH 3, PUSH 4, ADD, PRINT, HALT in ra 7.

    • Định dạng đầu vào:
      • Dòng đầu tiên chứa số nguyên mmm (0≤m≤10000 \le m \le 10000≤m≤1000) — số lượng lệnh.
      • mmm dòng tiếp theo, mỗi dòng là một lệnh theo đúng cú pháp mô tả ở trên (lệnh PUSH có thêm một số nguyên cách bởi khoảng trắng).
    • Định dạng đầu ra:

      In ra, mỗi dòng một giá trị, kết quả của các lệnh PRINT được thực thi theo đúng thứ tự. Nếu chương trình gặp lỗi (ngăn xếp thiếu phần tử hoặc chia cho 0), in thêm dòng ERROR ở cuối rồi dừng. Nếu chương trình rỗng hoặc không có lệnh PRINT nào được thực thi trước khi kết thúc/lỗi, không in gì (hoặc chỉ in dòng ERROR nếu có lỗi ngay từ đầu).

    Ví dụ:

    Đầu vào:

    7
    PUSH 20
    PUSH 4
    DIV
    PUSH 3
    MUL
    PRINT
    HALT

    Đầu ra:

    15
    

    Đầu vào:

    5
    PUSH 3
    PUSH 4
    ADD
    PRINT
    HALT

    Đầu ra:

    7
    

    Đang tải editor...