Cho đoạn mã TAC tuyến tính (không rẽ nhánh) gồm n dòng, mỗi dòng dạng x = a hoặc x = a op b (a, b là tên biến hoặc hằng số nguyên, op ∈{+,−,∗,/}), và tập các biến "sống ở đầu ra" (live-out) ngay sau khi thực hiện xong dòng lệnh cuối cùng (các biến này còn được sử dụng ở phần mã phía sau, không được cho biết trong đề).
Với straight-line code, định nghĩa dataflow lùi (backward) kinh điển: gọi def(i) là biến được gán ở dòng i (vế trái), use(i) là tập các biến (không tính hằng số) xuất hiện ở vế phải dòng i. Đặt OUT(n)=live_out (cho trước). Với i chạy từ n xuống 1: IN(i)=(OUT(i)∖{def(i)})∪use(i) và với i>1: OUT(i−1)=IN(i).
IN(i) chính là tập các biến còn sống ngay trước khi thực hiện dòng i. Hãy in ra tập IN(i) cho mọi i từ 1 đến n.
Ví dụ: với đoạn mã a=1; b=2; c=a+b; d=c*2 và live-out ={d}, kết quả là IN(1)=∅, IN(2)={a}, IN(3)={a,b}, IN(4)={c}.
Dòng 1: số nguyên n. n dòng tiếp theo: các lệnh TAC. Dòng tiếp theo: số nguyên m (số biến live-out). Nếu m>0: một dòng chứa m tên biến cách nhau bởi khoảng trắng. Nếu m=0, dòng này có thể để trống hoặc không xuất hiện.
In n dòng, dòng thứ i có dạng i: <danh sach bien trong IN(i), sap xep tang dan theo bang chu cai, cach nhau boi dau phay khong co khoang trang>; nếu IN(i) rỗng thì in i: EMPTY.
Ví dụ:
Đầu vào:
4
a = 1
b = 2
c = a + b
d = c * 2
1
d
Đầu ra:
1: EMPTY
2: a
3: a,b
4: c
Đầu vào:
3
x = a + b
y = x + a
z = y - b
1
z
Đầu ra:
1: a,b
2: a,b,x
3: b,y
Đang tải editor...