Đây là bài kết hợp hai giai đoạn của trình biên dịch: phân tích cú pháp biểu thức trung tố và sinh mã cho máy ảo ngăn xếp.
Cho một biểu thức trung tố gồm toán hạng là biến (một chữ cái) hoặc hằng số nguyên không âm, các toán tử +,−,×,÷ (+ - * /, không có ^, không có dấu trừ một ngôi) và có thể có dấu ngoặc đơn. Độ ưu tiên: *, / cao hơn +, -; tất cả đều kết hợp trái.
Hãy sinh mã theo hai bước: (1) chuyển biểu thức sang hậu tố bằng thuật toán Shunting-yard; (2) duyệt hậu tố và sinh lệnh cho máy ảo: PUSH k khi gặp hằng số k, LOAD x khi gặp biến x, và ADD/SUB/MUL/DIV khi gặp toán tử tương ứng +/-/*//.
Ví dụ: với ( a + b ) * 2, hậu tố là a b + 2 *, mã sinh ra là:
LOAD a
LOAD b
ADD
PUSH 2
MUL
Một dòng chứa biểu thức trung tố, các token cách nhau bởi đúng một khoảng trắng. Biểu thức luôn cân bằng ngoặc và hợp lệ.
In ra danh sách lệnh của máy ảo ngăn xếp, mỗi lệnh một dòng, theo đúng thứ tự sinh ra.
Ví dụ:
Đầu vào:
a + b * c
Đầu ra:
LOAD a
LOAD b
LOAD c
MUL
ADD
Đầu vào:
( a + b ) * 2
Đầu ra:
LOAD a
LOAD b
ADD
PUSH 2
MUL
Đang tải editor...