Một phần việc của phân tích ngữ nghĩa là phân giải nạp chồng (overload resolution): chọn đúng một trong nhiều chữ ký hàm (signature) khai báo trùng tên nhưng khác kiểu tham số, dựa trên kiểu của các đối số thực tế tại lời gọi.
Xét 4 kiểu dữ liệu {char,int,float,bool}. Có đúng một dây chuyền ép kiểu ngầm định (widening) tuyến tính: char→int→float, mỗi bước ép kiểu tốn 1 đơn vị chi phí; không có quan hệ ép kiểu nào liên quan đến bool (chỉ khớp bool với chính nó, chi phí 0). Không được phép ép kiểu ngược (thu hẹp, ví dụ float không thể dùng cho tham số int).
Một chữ ký khớp với một lời gọi nếu số lượng tham số bằng số đối số, và tại mọi vị trí, kiểu đối số bằng kiểu tham số (chi phí 0) hoặc ép kiểu ngầm định được tới kiểu tham số theo dây chuyền trên (chi phí bằng số bước ép kiểu cần thiết). Chi phí của chữ ký với lời gọi là tổng chi phí tại mọi vị trí tham số.
Với mỗi lời gọi, chọn chữ ký khớp có chi phí nhỏ nhất; nếu có từ 2 chữ ký trở lên cùng đạt chi phí nhỏ nhất, lời gọi bị coi là mơ hồ (ambiguous); nếu không chữ ký nào khớp, lời gọi không thể phân giải.
Dòng đầu: n (1≤n≤200) — số chữ ký hàm được khai báo (theo thứ tự, có thể trùng nhau). n dòng tiếp theo, mỗi dòng dạng <k> <t_1> ... <t_k> với k≥0 là số tham số và ti∈{char, int, float, bool} (nếu k=0, dòng chỉ có số 0).
Dòng tiếp theo: m (1≤m≤500) — số lời gọi. m dòng tiếp theo, mỗi dòng cùng định dạng <k> <t_1> ... <t_k> mô tả kiểu các đối số thực tế tại lời gọi đó.
Với mỗi lời gọi, in một dòng: chỉ số (1-based, theo thứ tự khai báo) của chữ ký được chọn nếu duy nhất, hoặc AMBIGUOUS nếu mơ hồ, hoặc NO MATCH nếu không chữ ký nào khớp.
Ví dụ:
Đầu vào:
3
1 int
1 float
2 int int
2
1 char
2 int float
Đầu ra:
1
NO MATCH
Đầu vào:
2
1 int
1 int
1
1 int
Đầu ra:
AMBIGUOUS
Đang tải editor...