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] Suy diễn biến kiểu T cho lời gọi hàm generic

    Xét các hàm generic đơn giản chỉ có một biến kiểu hình thức TTT. Khuôn tham số của hàm là một dãy kkk token, mỗi token thuộc một trong ba loại:

    • Kiểu cụ thể cố định: int, float, bool, string.
    • Token T: đại diện biến kiểu, đối số tại vị trí này có thể là bất kỳ kiểu cơ sở nào trong {\{{int,float,bool,string}\}}, và ràng buộc TTT bằng đúng kiểu đó.
    • Token T[]: đối số tại vị trí này bắt buộc có dạng mảng của một kiểu cơ sở XXX (viết X[], ví dụ int[]), và ràng buộc T=XT = XT=X.

    Cho một lời gọi với ppp kiểu đối số thực tế (đối số có thể là kiểu cơ sở hoặc kiểu mảng dạng X[]). Việc suy diễn không dùng bất kỳ luật ép kiểu nào — mọi vị trí phải khớp tuyệt đối theo mô tả trên. Tất cả các ràng buộc T=XT = XT=X xuất hiện (nếu có) phải cho ra cùng một XXX, nếu không sẽ mâu thuẫn.

    Kết quả:

    • Nếu p≠kp \ne kp=k, hoặc có vị trí không khớp, hoặc các ràng buộc TTT mâu thuẫn nhau: in ERROR.
    • Nếu khớp toàn bộ nhưng TTT không xuất hiện ở vị trí nào (không có ràng buộc): in OK.
    • Nếu khớp toàn bộ và TTT được suy ra duy nhất: in kiểu đó (int, float, bool hoặc string).
    • Định dạng đầu vào:

      Dòng đầu là kkk — số token khuôn tham số. Dòng thứ hai gồm kkk token cách nhau bởi khoảng trắng (mỗi token ∈{\in\{∈{int,float,bool,string,T,T[]}\}}). Dòng tiếp theo là qqq — số lời gọi. qqq dòng tiếp theo, mỗi dòng dạng <p> <a1> ... <ap> với mỗi ai∈{a_i \in \{ai​∈{int,float,bool,string,int[],float[],bool[],string[]}\}}.

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

      In ra qqq dòng, mỗi dòng là ERROR, OK, hoặc kiểu suy ra của TTT.

    Ví dụ:

    Đầu vào:

    2
    T T
    1
    2 int int
    

    Đầu ra:

    int
    

    Đầu vào:

    2
    T T
    1
    2 int float
    

    Đầu ra:

    ERROR
    

    Đang tải editor...