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] Máy ảo ngăn xếp với biến (LOAD/STORE) và PRINT

    Mở rộng máy ảo ngăn xếp bằng cách thêm bộ nhớ biến và lệnh xuất giá trị, để mô phỏng phần thực thi (runtime) của mã trung gian sinh ra từ các câu lệnh gán và in giá trị trong chương trình nguồn.

    Máy ảo hỗ trợ các lệnh sau, thao tác trên một ngăn xếp số nguyên ban đầu rỗng và một bảng biến ban đầu rỗng:

    • PUSH x: đẩy số nguyên xxx vào đỉnh ngăn xếp.
    • LOAD name: đẩy vào đỉnh ngăn xếp giá trị hiện tại của biến name; nếu biến này chưa từng được gán giá trị (chưa có lệnh STORE name nào trước đó), giá trị mặc định của nó là 000.
    • STORE name: lấy (pop) phần tử ở đỉnh ngăn xếp và gán giá trị đó cho biến name (không đẩy lại gì vào ngăn xếp).
    • ADD, SUB, MUL, DIV: lấy ra 2 phần tử trên đỉnh — bbb lấy trước (đỉnh), aaa lấy sau — tính a+ba+ba+b, a−ba-ba−b, a×ba \times ba×b, hoặc a  /  ba \;/\; ba/b (chia lấy phần nguyên kiểu Python, làm tròn xuống) rồi đẩy kết quả trở lại.
    • PRINT: lấy (pop) phần tử ở đỉnh ngăn xếp và xuất giá trị đó ra (đây là điểm khác biệt quan trọng: PRINT có pop, không phải chỉ xem đỉnh).

    Ví dụ: PUSH 5 / STORE x / LOAD x / LOAD x / ADD / PRINT in ra 10.

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

      Dòng đầu tiên chứa 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 là một trong các dạng lệnh: PUSH x, LOAD name, STORE name, ADD, SUB, MUL, DIV, PRINT. Tên biến name gồm 1 đến 10 chữ cái thường. Đề bảo đảm chương trình hợp lệ: không có phép chia cho 0, và không lệnh nào yêu cầu nhiều phần tử hơn số phần tử hiện có trong ngăn xếp.

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

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

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    
    

    Đầu vào:

    6
    PUSH 5
    STORE x
    LOAD x
    LOAD x
    ADD
    PRINT
    

    Đầu ra:

    10
    

    Đang tải editor...