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:
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).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 L là kiểu của tên, R là kiểu của vế phải):
OK).float và R=int: hợp lệ (OK) — ép kiểu mở rộng ngầm định.int và R=float: lỗi Narrowing Error.Type Mismatch.Dòng đầu là số nguyên n (1≤n≤500) — số biến khai báo.
Dòng tiếp theo gồm n token dạng tên:kiểu.
Dòng tiếp theo là số nguyên m (0≤m≤500) — số lệnh gán.
m dòng tiếp theo (hoặc 3m token nếu m=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.
In ra m 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...