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] Sinh mã ba địa chỉ cho dãy câu lệnh gán

    Cho nnn câu lệnh gán liên tiếp theo thứ tự thực hiện, mỗi câu lệnh có dạng:

    var = E
    

    trong đó var là tên một biến (có thể được gán nhiều lần ở các câu lệnh khác nhau), và E là một biểu thức trung tố (toán hạng là biến/hằng số nguyên không âm, toán tử +,−,∗,/+,-,*,/+,−,∗,/, có thể có dấu ngoặc, tuân theo quy tắc ưu tiên/kết hợp trái chuẩn như bài toán sinh TAC từ biểu thức trung tố). Ở vế phải, một biến có thể là biến đã được gán giá trị ở một câu lệnh trước đó trong cùng chương trình (chỉ sinh mã, không thực thi số).

    Hãy sinh mã ba địa chỉ (TAC) cho toàn bộ chương trình gồm nnn câu lệnh: các biến tạm tit_iti​ được đánh số liên tục xuyên suốt cả nnn câu lệnh (không đặt lại bộ đếm về t1t_1t1​ ở đầu mỗi câu lệnh mới), câu lệnh TAC cuối cùng ứng với mỗi câu lệnh gán là var = X với X là biến tạm cuối cùng chứa kết quả của EEE (hoặc chính token đó nếu EEE chỉ gồm một toán hạng duy nhất, khi đó không sinh thêm biến tạm nào cho câu lệnh này).

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

      Dòng 1: số nguyên nnn. nnn dòng tiếp theo: mỗi dòng có dạng var = E, trong đó var, dấu =, và các token của biểu thức E đều cách nhau đúng 1 khoảng trắng.

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

      In ra toàn bộ các câu lệnh TAC được sinh, nối tiếp nhau theo đúng thứ tự các câu lệnh gán trong chương trình (không có dòng trống xen giữa), chỉ số tit_iti​ tính liên tục xuyên suốt toàn chương trình.

      Ví dụ input:

      2
      x = a + b * c
      y = x - d
      

      Output:

      t1 = b * c
      t2 = a + t1
      x = t2
      t3 = x - d
      y = t3
      

    Ví dụ:

    Đầu vào:

    2
    x = a + b * c
    y = x - d

    Đầu ra:

    t1 = b * c
    t2 = a + t1
    x = t2
    t3 = x - d
    y = t3
    

    Đầu vào:

    1
    x = a + b

    Đầu ra:

    t1 = a + b
    x = t1
    

    Đang tải editor...