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] Sinh mã ba địa chỉ từ cây cú pháp

    Cây cú pháp AST của một biểu thức được cho dưới dạng chuỗi ngoặc đầy đủ: mỗi phép toán được bao bởi đúng một cặp dấu ngoặc theo dạng (E1 op E2), trong đó E1, E2 lại là một toán hạng đơn hoặc một biểu thức ngoặc đầy đủ khác; nếu toàn bộ biểu thức chỉ là một toán hạng thì không có dấu ngoặc nào.

    Hãy sinh mã ba địa chỉ (Three-Address Code – TAC) tương ứng với cây AST đó: duyệt cây theo thứ tự hậu tố (con trái, con phải, rồi tới nút cha), mỗi khi tính một phép toán thì tạo một biến tạm mới t1, t2, t3, ... (đánh số tăng dần theo đúng thứ tự phát sinh lệnh) để lưu kết quả.

    Ví dụ: với AST ((a+b)*(c-d)), mã ba địa chỉ sinh ra là:

    t1 = a + b
    t2 = c - d
    t3 = t1 * t2
    result = t3
    
    • Định dạng đầu vào:

      Một dòng duy nhất, không chứa khoảng trắng, là chuỗi biểu thức ngoặc đầy đủ như mô tả trên. Toán tử là một trong {+,−,∗,/}\{+, -, *, /\}{+,−,∗,/}. Toán hạng luôn là đúng một ký tự: chữ cái thường (a-z) hoặc chữ số (0-9). Đề bài đảm bảo chuỗi đúng cú pháp.

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

      In ra các lệnh mã ba địa chỉ, mỗi lệnh một dòng, theo đúng thứ tự phát sinh, dạng tK = X op Y (không có khoảng trắng thừa). Dòng cuối cùng in result = <giá trị cuối> — là biến tạm cuối cùng nếu có phép toán, hoặc chính toán hạng đó nếu biểu thức chỉ có một toán hạng duy nhất (khi đó không có dòng tK = ... nào).

    Ví dụ:

    Đầu vào:

    a

    Đầu ra:

    result = a
    

    Đầu vào:

    (a+b)

    Đầu ra:

    t1 = a + b
    result = t1
    

    Đang tải editor...