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ô phỏng thực thi mã ba địa chỉ có nhãn và rẽ nhánh

    Cho một chương trình mã ba địa chỉ gồm nnn câu lệnh, mỗi câu lệnh (token cách nhau đúng 1 khoảng trắng) thuộc một trong các dạng sau:

    • label L: định nghĩa nhãn LLL tại vị trí này (không thực hiện gì, chỉ đánh dấu vị trí để nhảy tới).
    • x = y: gán biến xxx bằng giá trị yyy (yyy là biến hoặc hằng số nguyên).
    • x = y OP z: phép toán hai ngôi, OP∈{+,−,∗,/}OP \in \{+, -, *, /\}OP∈{+,−,∗,/}, phép / là chia lấy phần nguyên làm tròn về 0 (ví dụ 7/2=37/2 = 37/2=3, (−7)/2=−3(-7)/2 = -3(−7)/2=−3); y,zy, zy,z là biến hoặc hằng số nguyên.
    • if x REL y goto L: REL∈{<,<=,>,>=,==,!=}REL \in \{<, <=, >, >=, ==, !=\}REL∈{<,<=,>,>=,==,!=}; nếu so sánh x REL yx\ REL\ yx REL y đúng thì nhảy tới nhãn LLL (tiếp tục thực thi từ đúng vị trí câu lệnh label L), ngược lại thực hiện câu lệnh kế tiếp; x,yx, yx,y là biến hoặc hằng số nguyên.
    • goto L: nhảy không điều kiện tới nhãn LLL.
    • print x: in ra giá trị hiện tại của xxx (biến hoặc hằng số nguyên).

    Biến chưa từng được gán có giá trị mặc định 000. Chương trình bắt đầu thực thi từ câu lệnh thứ nhất; sau khi thực hiện câu lệnh cuối cùng (không phải là một lệnh nhảy dẫn ra ngoài) thì kết thúc. Dữ liệu đầu vào luôn đảm bảo chương trình kết thúc sau một số bước hữu hạn (không lặp vô hạn).

    Hãy mô phỏng việc thực thi chương trình và in ra, theo đúng thứ tự thực hiện, giá trị được in bởi từng câu lệnh print.

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

      Dòng 1: số nguyên nnn (số câu lệnh của chương trình). nnn dòng tiếp theo: các câu lệnh theo đúng cú pháp mô tả ở trên.

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

      Với mỗi câu lệnh print được thực thi (theo đúng thứ tự xảy ra khi mô phỏng, có thể lặp lại nhiều lần do vòng lặp), in ra giá trị tương ứng, mỗi giá trị trên một dòng.

      Ví dụ input (đếm ngược từ 3 về 0):

      8
      i = 3
      label loop
      if i <= 0 goto end
      print i
      i = i - 1
      goto loop
      label end
      print 0
      

      Output:

      3
      2
      1
      0
      

    Ví dụ:

    Đầu vào:

    3
    a = 5
    b = 7
    print a + b

    Đầu ra:

    5
    

    Đầu vào:

    8
    i = 3
    label loop
    if i <= 0 goto end
    print i
    i = i - 1
    goto loop
    label end
    print 0

    Đầu ra:

    3
    2
    1
    0
    

    Đang tải editor...