Mã ba địa chỉ (Three-Address Code – TAC) là một dạng biểu diễn trung gian (IR) phổ biến trong trình biên dịch, trong đó mỗi lệnh có tối đa một toán tử ở vế phải.
Cho một chương trình gồm n lệnh TAC theo đúng thứ tự thực thi, mỗi lệnh có một trong ba dạng:
x = yx = -y (phủ định số học, không có khoảng trắng giữa - và y)x = y OP z với OP∈{+,−,∗,/} (các toán hạng và toán tử cách nhau đúng một khoảng trắng)Toán hạng y, z có thể là tên biến/biến tạm hoặc một hằng số nguyên không âm. Phép chia / là phép chia lấy phần nguyên làm tròn về 0 (ví dụ −7/2=−3, không phải −4).
Ban đầu một số biến được gán giá trị nguyên khởi tạo cho trước. Hãy mô phỏng việc thực thi tuần tự n lệnh TAC rồi in ra giá trị cuối cùng của một biến được chỉ định.
Ví dụ: Với 3 lệnh t1 = a + b, t2 = t1 * c, a = t2 - 1, giá trị khởi tạo a=2,b=3,c=4, biến cần in là a: t1=5, t2=20, a=19.
Dòng 1: số nguyên n (0≤n≤200) — số lệnh TAC.
n dòng tiếp theo: mỗi dòng một lệnh TAC đúng một trong ba dạng nêu trên.
Dòng tiếp theo: số nguyên m (1≤m≤50) — số biến được khởi tạo.
m dòng tiếp theo: mỗi dòng gồm tên_biến giá_trị (giá trị là số nguyên, có thể âm), cách nhau một khoảng trắng.
Dòng cuối: tên biến cần truy vấn giá trị cuối cùng (biến này chắc chắn được khởi tạo hoặc được gán trong chương trình).
In ra đúng một số nguyên — giá trị cuối cùng của biến được truy vấn, trên một dòng.
Ví dụ:
Đầu vào:
0
1
x 7
x
Đầu ra:
7
Đầu vào:
3
t1 = a + b
t2 = t1 * c
a = t2 - 1
3
a 2
b 3
c 4
a
Đầu ra:
19
Đang tải editor...