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 có nhãn và lệnh nhảy

    Mở rộng máy ảo ngăn xếp với điều khiển luồng: chương trình là một dãy dòng lệnh, mỗi dòng thuộc một trong các dạng sau (26 biến toàn cục a..z khởi tạo 000, ngăn xếp số nguyên ban đầu rỗng):

    • LABEL name: đánh dấu vị trí trong chương trình bằng tên name (không làm gì khi thực thi, chỉ là điểm neo cho lệnh nhảy).
    • PUSH n, LOAD x, STORE x, ADD, SUB, MUL, DIV, PRINT: ngữ nghĩa như máy ảo ngăn xếp cơ bản (với ADD/SUB/MUL/DIV: gọi bbb là phần tử pop trước - đỉnh, aaa là phần tử pop sau, kết quả là a op ba\ \text{op}\ ba op b; chia lấy phần nguyên làm tròn về 0).
    • JMP name: nhảy không điều kiện tới ngay sau dòng LABEL name.
    • JZ name: pop phần tử đỉnh ngăn xếp; nếu bằng 000 thì nhảy tới ngay sau dòng LABEL name, ngược lại thực thi tiếp dòng kế tiếp như bình thường.
    • HALT: dừng chương trình ngay lập tức.

    Chương trình bắt đầu thực thi từ dòng đầu tiên. Hãy mô phỏng và in ra tất cả các giá trị được PRINT, theo đúng thứ tự thực thi, cho tới khi gặp HALT (hoặc hết chương trình).

    Ví dụ: chương trình dưới đây tính tổng 1+2+⋯+51+2+\cdots+51+2+⋯+5 bằng vòng lặp và in ra 15:

    PUSH 5
    STORE n
    PUSH 0
    STORE sum
    LABEL loop
    LOAD n
    JZ done
    LOAD sum
    LOAD n
    ADD
    STORE sum
    LOAD n
    PUSH 1
    SUB
    STORE n
    JMP loop
    LABEL done
    LOAD sum
    PRINT
    HALT
    
    • Định dạng đầu vào:

      Dòng 1: số nguyên mmm (1≤m≤20001 \le m \le 20001≤m≤2000) - số dòng lệnh. mmm dòng tiếp theo, mỗi dòng là một lệnh theo đúng các định dạng đã mô tả ở trên. Dữ liệu đảm bảo: mỗi tên nhãn được định nghĩa đúng một lần bằng LABEL name; mọi JMP/JZ tham chiếu tới nhãn đã tồn tại; ngăn xếp không bao giờ thiếu phần tử khi cần lấy ra; không có phép chia cho 0; và chương trình luôn kết thúc (gặp HALT hoặc hết chương trình) sau tối đa 2×1062 \times 10^62×106 bước thực thi.

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

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

    Ví dụ:

    Đầu vào:

    20
    PUSH 5
    STORE n
    PUSH 0
    STORE sum
    LABEL loop
    LOAD n
    JZ done
    LOAD sum
    LOAD n
    ADD
    STORE sum
    LOAD n
    PUSH 1
    SUB
    STORE n
    JMP loop
    LABEL done
    LOAD sum
    PRINT
    HALT
    

    Đầu ra:

    15
    

    Đầu vào:

    20
    PUSH 0
    STORE n
    PUSH 0
    STORE sum
    LABEL loop
    LOAD n
    JZ done
    LOAD sum
    LOAD n
    ADD
    STORE sum
    LOAD n
    PUSH 1
    SUB
    STORE n
    JMP loop
    LABEL done
    LOAD sum
    PRINT
    HALT
    

    Đầu ra:

    0
    

    Đang tải editor...