Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Phân giải nạp chồng hàm theo chi phí ép kiểu ngầm định

    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}\{\text{char}, \text{int}, \text{float}, \text{bool}\}{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\text{char} \to \text{int} \to \text{float}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.

    • Định dạng đầu vào:

      Dòng đầu: nnn (1≤n≤2001 \le n \le 2001≤n≤200) — số chữ ký hàm được khai báo (theo thứ tự, có thể trùng nhau). nnn dòng tiếp theo, mỗi dòng dạng <k> <t_1> ... <t_k> với k≥0k \ge 0k≥0 là số tham số và ti∈{t_i \in \{ti​∈{char, int, float, bool}\}} (nếu k=0k=0k=0, dòng chỉ có số 0). Dòng tiếp theo: mmm (1≤m≤5001 \le m \le 5001≤m≤500) — số lời gọi. mmm 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 đó.

    • Định dạng đầu ra:

      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...