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:
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).||, && (cùng độ ưu tiên, kết hợp trái) — cả hai toán hạng phải là bool.==, != — 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.<, <=, >, >= — hai toán hạng phải đều là kiểu số; kết quả bool.+ - — 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ố.* / — cả hai toán hạng phải là số.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
<tên biến> <kiểu> (kiểu ∈{int,float,bool,string}).?, :, ||, &&, ==, !=, <, <=, >, >=, + - * /, dấu ngoặc (), hằng số, chuỗi "...", true/false, biến, khoảng trắng).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...