Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Số thanh ghi tối thiểu để tính cây cú pháp (Sethi–Ullman)

    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:

    • Nếu nút là lá (biến hoặc hằng số): label=1label = 1label=1 (cần nạp giá trị vào 111 thanh ghi).
    • Nếu nút là toán tử nhị phân với con trái có nhãn lll, con phải có nhãn rrr:
      • nếu l≠rl \neq rl=r: label=max⁡(l,r)label = \max(l, r)label=max(l,r);
      • nếu l=rl = rl=r: label=l+1label = l + 1label=l+1.

    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 222 (vì 1=1⇒1+11=1 \Rightarrow 1+11=1⇒1+1); nút gốc có con trái nhãn 111 (lá a), con phải nhãn 222, hai nhãn khác nhau nên nhãn gốc =max⁡(1,2)=2=\max(1,2)=2=max(1,2)=2.

    • Định dạng đầu vào:

      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 111 thanh ghi khi là lá. Đề bài đảm bảo biểu thức hợp lệ.

    • Định dạng đầu ra:

      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...