Cho một biểu thức số học viết dưới dạng trung tố, gồm toán hạng là biến đơn (một token chữ/số, ví dụ a, x1) hoặc hằng số nguyên không âm, các toán tử hai ngôi +,−,∗,/ và dấu ngoặc đơn (, ), tuân theo quy tắc ưu tiên toán tử chuẩn: ∗,/ có độ ưu tiên cao hơn +,−; các toán tử cùng độ ưu tiên được tính từ trái sang phải (kết hợp trái); biểu thức trong ngoặc được tính trước.
Hãy sinh mã ba địa chỉ (TAC) tương ứng của biểu thức, bằng cách trước tiên chuyển biểu thức trung tố sang hậu tố theo đúng thứ tự ưu tiên/kết hợp nói trên (thuật toán shunting-yard), sau đó sinh TAC từ dạng hậu tố: mỗi khi một toán tử được áp dụng, tạo một biến tạm mới ti (đánh số tăng dần từ t1, theo đúng thứ tự các toán tử được rút gọn khi chuyển hậu tố).
Một dòng duy nhất chứa biểu thức trung tố, các token (biến, số, toán tử, dấu ngoặc) cách nhau bởi đúng một khoảng trắng.
In ra các câu lệnh TAC theo đúng định dạng tI = A OP B (mỗi câu lệnh một dòng, đúng thứ tự sinh ra), sau đó in dòng cuối result = X với X là biến tạm/token chứa kết quả cuối cùng. Nếu biểu thức chỉ có một toán hạng (không toán tử, có thể có ngoặc thừa quanh nó theo cú pháp đề, thực tế test sẽ không có ngoặc thừa quanh 1 token đơn), chỉ in result = X.
Ví dụ input a + b * c (vì * ưu tiên cao hơn +):
t1 = b * c
t2 = a + t1
result = t2
Ví dụ input ( a + b ) * c:
t1 = a + b
t2 = t1 * c
result = t2
Ví dụ:
Đầu vào:
( a + b ) * c
Đầu ra:
t1 = a + b
t2 = t1 * c
result = t2
Đầu vào:
a + b * c
Đầu ra:
t1 = b * c
t2 = a + t1
result = t2
Đang tải editor...