Một cách sinh mã trung gian phổ biến là mã ba địa chỉ (three-address code — TAC): mỗi lệnh có dạng tK = X OP Y, trong đó tK là một biến tạm mới, còn X, Y có thể là hằng số, biến gốc hoặc một biến tạm đã sinh trước đó.
Cho một biểu thức hậu tố gồm toán hạng (biến hoặc hằng số) và các toán tử +,−,×,÷ (+ - * /), hãy mô phỏng việc duyệt ngăn xếp để sinh mã TAC: khi gặp toán hạng, đẩy nó (nguyên dạng chuỗi) vào ngăn xếp; khi gặp toán tử OP, lấy ra hai giá trị trên đỉnh theo thứ tự POP là Y rồi X (tức X được đẩy vào trước Y), tạo một biến tạm mới tK (đánh số K=1,2,3,… theo đúng thứ tự các lệnh được sinh ra), in ra lệnh tK = X OP Y, rồi đẩy tK (dưới dạng tên biến tạm) trở lại ngăn xếp.
Ví dụ: với hậu tố a b + c *, mã sinh ra là:
t1 = a + b
t2 = t1 * c
Một dòng chứa biểu thức hậu tố, các token cách nhau bởi đúng một khoảng trắng. Toán hạng là một biến (chuỗi chữ cái/chữ số, không phải toán tử) hoặc một hằng số nguyên; toán tử là một trong + - * /. Biểu thức luôn hợp lệ.
In ra các lệnh mã ba địa chỉ, mỗi lệnh một dòng theo đúng thứ tự sinh ra, dạng chính xác tK = X OP Y (có khoảng trắng quanh dấu = và toán tử). Nếu biểu thức không có toán tử nào (chỉ một toán hạng), không in gì cả (không có dòng nào).
Ví dụ:
Đầu vào:
a b + c *
Đầu ra:
t1 = a + b
t2 = t1 * c
Đầu vào:
a b +
Đầu ra:
t1 = a + b
Đang tải editor...