Khi sinh mã máy cho một biểu thức số học từ cây cú pháp AST, trình biên dịch cần xác định số thanh ghi tối thiểu cần dùng để tính giá trị biểu thức, với giả thiết có thể tự do chọn thứ tự tính nhánh trái/phải trước (miễn là tính xong một nhánh, kết quả được giữ trong một thanh ghi cho tới khi dùng), và không cho phép lưu tạm ra bộ nhớ (không spill). Đây chính là thuật toán gán nhãn Sethi–Ullman kinh điển.
Nhãn (label) của một nút được định nghĩa đệ quy như sau:
Nhãn của nút gốc chính là số thanh ghi tối thiểu cần thiết để tính toàn bộ biểu thức.
Ví dụ: + a + b c — cây con + b c có nhãn 2 (vì 1=1⇒1+1); nút gốc có con trái nhãn 1 (lá a), con phải nhãn 2, hai nhãn khác nhau nên nhãn gốc =max(1,2)=2.
Một dòng duy nhất chứa biểu thức tiền tố, các token cách nhau bởi một khoảng trắng. Toán tử nhị phân thuộc {+,−,∗,/}. Toán hạng là một chữ cái thường (biến) hoặc một số nguyên không âm (hằng số) — cả hai loại đều cần đúng 1 thanh ghi khi là lá. Đề bài đảm bảo biểu thức hợp lệ.
In ra một số nguyên duy nhất: nhãn Sethi–Ullman của nút gốc, tức số thanh ghi tối thiểu cần thiết để tính toàn bộ biểu thức.
Ví dụ:
Đầu vào:
+ a b
Đầu ra:
2
Đầu vào:
a
Đầu ra:
1
Đang tải editor...