Cho n 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 n câu lệnh: các biến tạm ti được đánh số liên tục xuyên suốt cả n câu lệnh (không đặt lại bộ đếm về t1 ở đầ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 E (hoặc chính token đó nếu E 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).
Dòng 1: số nguyên n.
n 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.
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ố ti 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...