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] Kiểm tra kiểu biểu thức số học với ép kiểu ngầm định

    Trong một bộ kiểm tra kiểu (type checker) đơn giản của trình biên dịch, mỗi biểu thức nhị phân A op B được đánh giá kiểu dựa trên kiểu của hai toán hạng và luật ép kiểu ngầm định (implicit coercion).

    Phân loại hằng số (literal):

    • Chuỗi chữ số, có thể có dấu - ở đầu, không chứa dấu chấm → kiểu int.
    • Chuỗi số có đúng một dấu chấm thập phân, ví dụ 2.5, -3.14 → kiểu float.
    • true hoặc false → kiểu bool.
    • Chuỗi ký tự đặt trong cặp dấu ngoặc kép, ví dụ "abc" (không chứa khoảng trắng bên trong) → kiểu string.

    Luật kiểm tra kiểu cho toán tử op ∈{+,−,∗,/}\in \{+,-,*,/\}∈{+,−,∗,/}:

    1. Nếu cả hai toán hạng đều là int: phép +, -, * cho kết quả int; riêng phép / luôn cho kết quả float (phép chia thực).
    2. Nếu ít nhất một trong hai toán hạng là float và toán hạng còn lại thuộc {\{{int, float}\}}: kết quả là float với mọi phép toán trên (ép kiểu ngầm int → float).
    3. Nếu cả hai toán hạng đều là string: chỉ phép + hợp lệ (nối chuỗi), kết quả là string; các phép -, *, / là lỗi.
    4. Mọi trường hợp còn lại (có bool tham gia, hoặc string kết hợp với kiểu khác string) đều là lỗi kiểu.

    Với mỗi biểu thức, hãy xác định kiểu của kết quả, hoặc báo lỗi nếu biểu thức không hợp lệ về kiểu.

    Ví dụ: với biểu thức 5 / 2, cả hai toán hạng là int nhưng phép / luôn trả float, nên kết quả là float.

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

      Dòng đầu tiên là số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số lượng biểu thức. nnn dòng tiếp theo, mỗi dòng chứa một biểu thức dạng A op B, trong đó A, B là hằng số (token không chứa khoảng trắng bên trong, kể cả chuỗi) và op là một trong bốn ký tự + - * /, các thành phần cách nhau bởi đúng một khoảng trắng.

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

      In ra nnn dòng, dòng thứ iii là kết quả kiểm tra kiểu của biểu thức thứ iii: một trong bốn chuỗi int, float, string, hoặc Type Error nếu biểu thức vi phạm luật kiểm tra kiểu. Nếu n=0n = 0n=0 thì không in gì.

    Ví dụ:

    Đầu vào:

    6
    5 + 3
    5 / 2
    2.5 + 1
    "ab" + "cd"
    "ab" - "cd"
    true + 1
    

    Đầu ra:

    int
    float
    float
    string
    Type Error
    Type Error
    

    Đầu vào:

    1
    5 + 3
    

    Đầu ra:

    int
    

    Đang tải editor...