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] Suy diễn kiểu cho biểu thức số học, so sánh và luận lý

    Mở rộng bài toán kiểm tra kiểu: hệ thống kiểu bây giờ gồm ba kiểu int, float, bool, với các nhóm toán tử áp dụng trên biểu thức hậu tố:

    • Số học {+,−,∗,/}\{+,-,*,/\}{+,−,∗,/} (hai ngôi): cả hai toán hạng phải có kiểu số (int\text{int}int hoặc float\text{float}float); kết quả là float nếu có ít nhất một toán hạng float, ngược lại là int.
    • So sánh {<,>,<=,>=,==,!=}\{<,>,<=,>=,==,!=\}{<,>,<=,>=,==,!=} (hai ngôi): cả hai toán hạng phải có kiểu số; kết quả luôn có kiểu bool.
    • Luận lý {&&,∣∣}\{\&\&, ||\}{&&,∣∣} (hai ngôi): cả hai toán hạng phải có kiểu bool; kết quả kiểu bool.
    • Phủ định ! (một ngôi): toán hạng phải có kiểu bool; kết quả kiểu bool.

    Toán hạng có thể là: tên biến đã khai báo (kiểu int, float hoặc bool), hằng số nguyên/thực (như bài ép kiểu số học), hoặc hằng bool true/false.

    Nếu tại bất kỳ bước áp dụng toán tử nào mà kiểu toán hạng không thoả điều kiện ở trên, đây là lỗi không tương thích kiểu.

    Ví dụ

    Input:

    3
    a:int b:float c:bool
    a b < c &&
    

    Output:

    bool
    

    Giải thích: a < b so sánh hai số, cho kiểu bool; sau đó bool && c (c cũng kiểu bool) hợp lệ, kết quả bool.

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

      Dòng 1: số nguyên kkk (0≤k≤1000 \le k \le 1000≤k≤100) — số biến khai báo. Dòng 2: nếu k>0k>0k>0, kkk cặp name:type cách nhau khoảng trắng (type ∈\in∈ {int, float, bool}); nếu k=0k=0k=0 dòng rỗng. Dòng 3: biểu thức hậu tố, token cách nhau khoảng trắng, có thể chứa các toán tử số học, so sánh, luận lý, phủ định, hằng số, hằng true/false, tên biến. Dữ liệu vào đảm bảo cấu trúc hậu tố hợp lệ về mặt số lượng toán hạng.

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

      Nếu gặp biến chưa khai báo, in ERROR: bien <name> chua khai bao và dừng (không xét token sau). Nếu gặp toán tử áp dụng lên toán hạng sai kiểu, in ERROR: khong tuong thich kieu và dừng ngay tại đó (không xét token sau). Nếu không có lỗi, in ra đúng một dòng là kiểu cuối cùng của biểu thức: int, float hoặc bool.

    Ví dụ:

    Đầu vào:

    3
    a:int b:float c:bool
    a b < c &&
    

    Đầu ra:

    bool
    

    Đầu vào:

    1
    x:bool
    x !
    

    Đầu ra:

    bool
    

    Đang tải editor...