Trong giai đoạn kiểm tra kiểu (type checking) của trình biên dịch, ta cần xác định kiểu của biểu thức trước khi sinh mã. Cho một biểu thức số học viết ở dạng hậu tố (Reverse Polish Notation), gồm các token là hằng số nguyên (không chứa dấu chấm, có thể có dấu - ở đầu để biểu diễn số âm) hoặc hằng số thực (chứa đúng một dấu chấm .), và các toán tử hai ngôi +,−,∗,/.
Luật suy diễn kiểu:
int, và toán tử là +,−,∗ thì kết quả có kiểu int./ giữa hai toán hạng int luôn cho kết quả kiểu float (mô phỏng phép chia thực).float thì kết quả luôn là float (số nguyên được nâng kiểu ngầm định).Nếu biểu thức không hợp lệ về mặt cú pháp hậu tố (thiếu toán hạng khi gặp toán tử, hoặc sau khi xử lý hết token còn dư/thiếu toán hạng trên ngăn xếp) thì kết quả là ERROR.
Ví dụ: biểu thức 2.5 3 * cho kết quả float; biểu thức 10 2 / cho kết quả float (dù cả hai đều là int); biểu thức 3 4 + cho kết quả int.
Dòng đầu tiên chứa số nguyên n (0≤n≤1000) — số biểu thức cần kiểm tra kiểu. Mỗi dòng trong n dòng tiếp theo là một biểu thức hậu tố, các token cách nhau bởi đúng một khoảng trắng.
In ra n dòng, dòng thứ i là kiểu (int hoặc float) của biểu thức thứ i, hoặc ERROR nếu biểu thức không hợp lệ.
Ví dụ:
Đầu vào:
1
3 4 + 5 *
Đầu ra:
int
Đầu vào:
3
3 4 +
2.5 3 *
10 2 /
Đầu ra:
int
float
float
Đang tải editor...