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 xếp chồng (Stack Machine)

    Trong giai đoạn sinh mã và thông dịch, nhiều trình biên dịch chuyển biểu thức nguồn về dạng lệnh cho một máy xếp chồng (stack machine) rồi thông dịch trực tiếp thay vì sinh mã máy.

    Cho một chương trình gồm nnn lệnh, mỗi lệnh thuộc một trong các dạng sau:

    • PUSH x: đẩy số nguyên xxx (−109≤x≤109-10^9 \le x \le 10^9−109≤x≤109) vào đỉnh ngăn xếp.
    • ADD, SUB, MUL: lấy ra hai phần tử trên cùng — gọi bbb là phần tử ở đỉnh, aaa là phần tử ngay dưới đỉnh (đã lấy ra khỏi ngăn xếp) — rồi đẩy lại kết quả tương ứng a+ba+ba+b, a−ba-ba−b hoặc a⋅ba \cdot ba⋅b.
    • DUP: nhân đôi phần tử ở đỉnh (đẩy thêm một bản sao của nó).
    • POP: bỏ phần tử ở đỉnh.

    Để tránh tràn số, mọi giá trị trong ngăn xếp và mọi kết quả trung gian đều được lấy theo modulo M=109+7M = 10^9 + 7M=109+7 và luôn được biểu diễn ở dạng không âm trong [0,M)[0, M)[0,M) (kể cả khi vừa PUSH một số âm, phải quy về modulo ngay).

    Nếu tại một lệnh nào đó, ngăn xếp không đủ phần tử để thực hiện (ví dụ POP khi ngăn xếp rỗng, hoặc ADD/SUB/MUL khi ngăn xếp có ít hơn 2 phần tử, hoặc DUP khi ngăn xếp rỗng), chương trình được coi là không hợp lệ: dừng thực hiện ngay lập tức tại đó (bỏ qua toàn bộ các lệnh còn lại).

    Ví dụ: với chương trình

    PUSH 3
    PUSH 4
    ADD
    PUSH 2
    MUL
    

    ta có (3+4)×2=14(3+4)\times 2 = 14(3+4)×2=14, ngăn xếp cuối cùng chỉ còn một phần tử là 141414.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) — số lệnh.
      • nnn dòng tiếp theo, mỗi dòng một lệnh theo đúng cú pháp đã mô tả (PUSH x, ADD, SUB, MUL, DUP, POP), các thành phần cách nhau đúng một khoảng trắng.
    • Định dạng đầu ra:
      • Nếu chương trình gặp lỗi thiếu phần tử (thiếu hụt ngăn xếp) ở lệnh nào đó: in ra đúng một dòng ERROR.
      • Ngược lại: in ra đúng một dòng chứa các phần tử còn lại trong ngăn xếp theo thứ tự từ đáy lên đỉnh, cách nhau bởi một khoảng trắng (nếu ngăn xếp rỗng, in ra một dòng trống).

    Ví dụ:

    Đầu vào:

    1
    POP
    

    Đầu ra:

    ERROR
    

    Đầu vào:

    5
    PUSH 3
    PUSH 4
    ADD
    PUSH 2
    MUL
    

    Đầu ra:

    14
    

    Đang tải editor...