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 ngôn ngữ mini có nhãn và rẽ nhánh

    Một chương trình gồm nnn dòng lệnh, được đánh số thực thi từ 000 đến n−1n-1n−1 theo thứ tự xuất hiện. Mỗi dòng có thể có một nhãn đứng trước dạng NHAN: (nhãn gồm chữ và số, không chứa khoảng trắng), theo sau là lệnh; hoặc không có nhãn. Các lệnh gồm:

    • SET x k: gán biến nguyên xxx bằng hằng số kkk.
    • ADD x y z: gán x=y+zx = y + zx=y+z (giá trị của các biến y,zy, zy,z).
    • SUB x y z: gán x=y−zx = y - zx=y−z.
    • JMP L: nhảy tới dòng có nhãn LLL.
    • JZ x L: nếu biến xxx bằng 000 thì nhảy tới nhãn LLL, ngược lại thực thi tiếp dòng kế tiếp.
    • PRINT x: in giá trị hiện tại của biến xxx trên một dòng.
    • HALT: dừng chương trình ngay lập tức.

    Biến chưa được gán có giá trị mặc định là 000. Chương trình bắt đầu chạy từ dòng đầu tiên; nếu chạy hết nnn dòng mà chưa gặp HALT thì dừng. Đề đảm bảo chương trình luôn dừng sau không quá 10610^6106 bước thực thi.

    Ví dụ: chương trình đếm ngược in ra 3, 2, 1 rồi dừng:

    SET n 3
    loop: JZ n end
    PRINT n
    SET one 1
    SUB n n one
    JMP loop
    end: HALT
    
    • Đị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 là các dòng lệnh của chương trình (có thể có tiền tố nhãn NHAN: ngăn cách với lệnh bởi một khoảng trắng).

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

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

    Ví dụ:

    Đầu vào:

    7
    SET n 3
    loop: JZ n end
    PRINT n
    SET one 1
    SUB n n one
    JMP loop
    end: HALT
    

    Đầu ra:

    3
    2
    1
    

    Đầu vào:

    0
    

    Đầu ra:

    
    

    Đang tải editor...