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 lệnh gán: ép kiểu mở rộng và lỗi thu hẹp kiểu

    Khi kiểm tra kiểu cho các lệnh gán, trình biên dịch cần phân biệt hai loại lỗi khác nhau:

    • Ép kiểu thu hẹp (narrowing): gán một giá trị float cho biến int — mất thông tin, bị coi là lỗi (khác với chiều ngược lại int → float là ép kiểu mở rộng, được phép ngầm định).
    • Không tương thích kiểu (type mismatch): gán giữa hai kiểu hoàn toàn không liên quan (ví dụ string cho int, hoặc bất kỳ kiểu nào cho/từ bool khác bool).

    Cho bảng khai báo biến (tên và kiểu, kiểu thuộc {\{{int, float, bool, string}\}}) và một danh sách lệnh gán dạng tên = vế_phải, trong đó vế phải là một token duy nhất: hoặc tên một biến đã khai báo khác, hoặc một hằng số (phân loại như bài kiểm tra kiểu biểu thức số học).

    Luật kiểm tra cho lệnh gán tên = vế_phải (gọi LLL là kiểu của tên, RRR là kiểu của vế phải):

    1. Nếu L=RL = RL=R: hợp lệ (OK).
    2. Nếu L=L=L=float và R=R=R=int: hợp lệ (OK) — ép kiểu mở rộng ngầm định.
    3. Nếu L=L=L=int và R=R=R=float: lỗi Narrowing Error.
    4. Mọi trường hợp khác: lỗi Type Mismatch.
    • Định dạng đầu vào:

      Dòng đầu là số nguyên nnn (1≤n≤5001 \le n \le 5001≤n≤500) — số biến khai báo. Dòng tiếp theo gồm nnn token dạng tên:kiểu. Dòng tiếp theo là số nguyên mmm (0≤m≤5000 \le m \le 5000≤m≤500) — số lệnh gán. mmm dòng tiếp theo (hoặc 3m3m3m token nếu m=0m=0m=0 thì không có dòng nào), mỗi lệnh gồm 3 token: tên, dấu =, và vế_phải.

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

      In ra mmm dòng, mỗi dòng là kết quả kiểm tra lệnh gán tương ứng: OK, Narrowing Error, hoặc Type Mismatch. Sau đó in thêm một dòng cuối cùng theo đúng định dạng So lenh OK: X, trong đó X là tổng số lệnh gán hợp lệ (OK).

    Ví dụ:

    Đầu vào:

    2
    x:int y:float
    1
    y = x
    

    Đầu ra:

    OK
    So lenh OK: 1
    

    Đầu vào:

    1
    x:int
    1
    x = 2.5
    

    Đầu ra:

    Narrowing Error
    So lenh OK: 0
    

    Đang tải editor...