Mở rộng bài toán suy diễn kiểu: biến có thể mang kiểu int, float, bool, hoặc string. Biểu thức gồm các toán tử hai ngôi + - * /, dấu ngoặc, biến, hằng số nguyên/thực, hằng true/false, và hằng chuỗi trong cặp nháy kép "..." (không chứa nháy kép lồng nhau).
Luật kiểm tra kiểu áp dụng đệ quy từ trong ra ngoài cho từng toán tử:
+: nếu cả hai toán hạng là kiểu số (int/float) → kết quả là float nếu có ít nhất một bên float, ngược lại int. Nếu cả hai đều là string → kết quả string (nối chuỗi). Mọi kết hợp khác (trộn string với số/bool, hoặc có toán hạng bool) → lỗi kiểu.- * /: cả hai toán hạng phải là kiểu số; kết quả là float nếu có ít nhất một bên float, ngược lại int. Nếu có toán hạng không phải kiểu số → lỗi kiểu.Cho khai báo biến và một biểu thức, in ra kiểu kết quả cuối cùng, hoặc ERROR nếu biểu thức có lỗi kiểu ở bất kỳ đâu.
Ví dụ
Input:
2
a int
b string
a + 1
Output:
int
<tên biến> <kiểu> (kiểu ∈{int,float,bool,string})."...", hằng số, true/false, biến, + - * /, dấu ngoặc (), khoảng trắng).Một dòng: kiểu kết quả (int, float, string, hoặc bool nếu biểu thức chỉ gồm giá trị bool không qua toán tử số học/chuỗi nào), hoặc ERROR nếu có lỗi kiểu.
Ví dụ:
Đầu vào:
2
a int
b string
a + b
Đầu ra:
ERROR
Đầu vào:
2
a int
b string
a + 1
Đầu ra:
int
Đang tải editor...