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ừ biểu thức trung tố có ưu tiên toán tử

    Cho một biểu thức số học viết dưới dạng trung tố, gồm toán hạng là biến đơn (một token chữ/số, ví dụ a, x1) hoặc hằng số nguyên không âm, các toán tử hai ngôi +,−,∗,/+, -, *, /+,−,∗,/ và dấu ngoặc đơn (, ), tuân theo quy tắc ưu tiên toán tử chuẩn: ∗,/*, /∗,/ có độ ưu tiên cao hơn +,−+, -+,−; các toán tử cùng độ ưu tiên được tính từ trái sang phải (kết hợp trái); biểu thức trong ngoặc được tính trước.

    Hãy sinh mã ba địa chỉ (TAC) tương ứng của biểu thức, bằng cách trước tiên chuyển biểu thức trung tố sang hậu tố theo đúng thứ tự ưu tiên/kết hợp nói trên (thuật toán shunting-yard), sau đó sinh TAC từ dạng hậu tố: mỗi khi một toán tử được áp dụng, tạo một biến tạm mới tit_iti​ (đánh số tăng dần từ t1t_1t1​, theo đúng thứ tự các toán tử được rút gọn khi chuyển hậu tố).

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

      Một dòng duy nhất chứa biểu thức trung tố, các token (biến, số, toán tử, dấu ngoặc) cách nhau bởi đúng một khoảng trắng.

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

      In ra các câu lệnh TAC theo đúng định dạng tI = A OP B (mỗi câu lệnh một dòng, đúng thứ tự sinh ra), sau đó in dòng cuối result = X với X là biến tạm/token chứa kết quả cuối cùng. Nếu biểu thức chỉ có một toán hạng (không toán tử, có thể có ngoặc thừa quanh nó theo cú pháp đề, thực tế test sẽ không có ngoặc thừa quanh 1 token đơn), chỉ in result = X.

      Ví dụ input a + b * c (vì * ưu tiên cao hơn +):

      t1 = b * c
      t2 = a + t1
      result = t2
      

      Ví dụ input ( a + b ) * c:

      t1 = a + b
      t2 = t1 * c
      result = t2
      

    Ví dụ:

    Đầu vào:

    ( a + b ) * c

    Đầu ra:

    t1 = a + b
    t2 = t1 * c
    result = t2
    

    Đầu vào:

    a + b * c

    Đầu ra:

    t1 = b * c
    t2 = a + t1
    result = t2
    

    Đang tải editor...