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ỉ theo SDD với ép kiểu ngầm định

    SDD sinh mã ba địa chỉ (three-address code) cho biểu thức số học gắn hai thuộc tính tổng hợp cho mỗi biểu thức con EEE: E.place (tên biến/hằng/biến tạm lưu giá trị) và E.type (kiểu suy diễn được). Với luật E→E1  op  E2E \to E_1\; op\; E_2E→E1​opE2​: một biến tạm mới ttt được cấp phát, một bộ tứ (quadruple) t = E1.place op E2.place được sinh ra (theo đúng thứ tự toán hạng trái–phải), và:

    • Nếu op∈{+,−,∗}op \in \{+,-,*\}op∈{+,−,∗}: E.type=intE.\text{type} = \text{int}E.type=int nếu cả hai toán hạng đều int, ngược lại E.type=floatE.\text{type} = \text{float}E.type=float (ép kiểu ngầm định khi trộn int và float).
    • Nếu op=/op = /op=/: E.type=floatE.\text{type} = \text{float}E.type=float luôn luôn (phép chia luôn trả về float).

    Cho một bảng ký hiệu gồm các biến (tên, kiểu ∈{\in \{∈{int, float}\}}) và một biểu thức dạng hậu tố (postfix, các token cách nhau bởi khoảng trắng) chỉ gồm toán hạng (tên biến trong bảng ký hiệu, hoặc hằng số — hằng chứa dấu . có kiểu float, ngược lại int) và các toán tử + - * /, hãy mô phỏng SDD nói trên: các biến tạm được đặt tên t1, t2, t3, ... theo thứ tự sinh ra (bắt đầu từ 1). Biểu thức đầu vào luôn hợp lệ về cú pháp (đủ toán hạng cho mọi toán tử, kết quả cuối cùng là một giá trị duy nhất).

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

      Dòng đầu: mmm (0≤m≤2000 \le m \le 2000≤m≤200) — số biến. mmm dòng tiếp theo: <name> <type>. Dòng cuối: biểu thức hậu tố (có thể là một token đơn), các token cách nhau bởi khoảng trắng.

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

      In lần lượt từng bộ tứ đã sinh, mỗi bộ tứ một dòng dạng t<k> = <left> <op> <right> theo đúng thứ tự sinh ra; dòng cuối cùng in RESULT <place> : <type> với <place> và <type> là thuộc tính của biểu thức toàn cục (nếu biểu thức chỉ có một token, không có bộ tứ nào được sinh, chỉ có dòng RESULT).

    Ví dụ:

    Đầu vào:

    0
    3 4 +
    

    Đầu ra:

    t1 = 3 + 4
    RESULT t1 : int
    

    Đầu vào:

    2
    x int
    y float
    x y + x *
    

    Đầu ra:

    t1 = x + y
    t2 = t1 * x
    RESULT t2 : float
    

    Đang tải editor...