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 biểu thức điều kiện và so sánh

    Mở rộng bộ suy diễn kiểu với toán tử so sánh, toán tử luận lý, và biểu thức điều kiện ba ngôi kiểu C: cond ? e1 : e2. Văn phạm biểu thức theo thứ tự ưu tiên từ thấp đến cao:

    1. Ba ngôi E ? E1 : E2 (kết hợp phải; đề bài đảm bảo tối đa một dấu ? ở cấp ngoài cùng khi không có ngoặc bao quanh, để tránh nhập nhằng).
    2. ||, && (cùng độ ưu tiên, kết hợp trái) — cả hai toán hạng phải là bool.
    3. So sánh bằng ==, != — hai toán hạng phải cùng "lớp": cả hai là kiểu số (int/float, so sánh chéo được), hoặc cả hai string, hoặc cả hai bool; kết quả luôn là bool.
    4. So sánh thứ tự <, <=, >, >= — hai toán hạng phải đều là kiểu số; kết quả bool.
    5. + - — như bài toán suy diễn kiểu cơ bản: + nối chuỗi nếu cả hai string, hoặc cộng số (float nếu có bên float); - chỉ nhận số.
    6. * / — cả hai toán hạng phải là số.
    7. Phần tử cơ bản: hằng số nguyên/thực, true/false, chuỗi "...", tên biến, hoặc (E).

    Với cond ? e1 : e2: cond phải có kiểu bool. Kiểu của e1 và e2 được hợp nhất (unify): nếu giống hệt nhau → đó là kiểu kết quả; nếu cả hai là kiểu số (có thể khác nhau) → kết quả float nếu có ít nhất một bên float, ngược lại int; các cặp kiểu khác không hợp nhất được → lỗi.

    Bất kỳ vi phạm luật kiểu nào ở toán tử con nào cũng khiến toàn biểu thức có kết quả ERROR (lỗi lan truyền lên toán tử cha, bất kể toán tử cha có "hợp lệ" nếu bỏ qua lỗi con hay không).

    Ví dụ

    Input:
    2
    a int
    b float
    a > 0 ? a : b
    
    Output:
    float
    
    • Định dạng đầu vào:
      • Dòng 1: nnn (0≤n≤500 \le n \le 500≤n≤50).
      • nnn dòng: <tên biến> <kiểu> (kiểu ∈{int,float,bool,string}\in \{\text{int}, \text{float}, \text{bool}, \text{string}\}∈{int,float,bool,string}).
      • Dòng cuối: biểu thức (có thể chứa ?, :, ||, &&, ==, !=, <, <=, >, >=, + - * /, dấu ngoặc (), hằng số, chuỗi "...", true/false, biến, khoảng trắng).
    • Định dạng đầu ra:

      Một dòng: kiểu kết quả của biểu thức (int, float, bool, hoặc string), hoặc ERROR nếu có lỗi kiểu ở bất kỳ đâu trong biểu thức.

    Ví dụ:

    Đầu vào:

    2
    a int
    b float
    a > 0 ? a : b
    

    Đầu ra:

    float
    

    Đầu vào:

    0
    1 == 1.5
    

    Đầu ra:

    bool
    

    Đang tải editor...