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] Thuộc tính kế thừa trong khai báo kiểu

    Xét lược đồ dịch cổ điển cho câu lệnh khai báo nhiều biến cùng kiểu, trong đó kiểu được truyền như một thuộc tính kế thừa (inherited attribute) từ nút kiểu xuống danh sách định danh:

    D→T L{L.in=T.type}D \to T\, L \quad \{L.\text{in} = T.\text{type}\}D→TL{L.in=T.type} L→id,L1{addtype(id,L.in);  L1.in=L.in}L \to \text{id}, L_1 \quad \{\text{addtype}(\text{id}, L.\text{in}); \; L_1.\text{in} = L.\text{in}\}L→id,L1​{addtype(id,L.in);L1​.in=L.in} L→id{addtype(id,L.in)}L \to \text{id} \quad \{\text{addtype}(\text{id}, L.\text{in})\}L→id{addtype(id,L.in)}

    nghĩa là mọi định danh trong cùng một câu lệnh khai báo <kiểu> id_1, id_2, ..., id_k; đều nhận cùng một kiểu T.typeT.\text{type}T.type, thuộc tính này được truyền (kế thừa) tuần tự qua từng phần tử của danh sách. Cho nnn câu lệnh khai báo như vậy được xử lý tuần tự từ trên xuống; nếu một định danh xuất hiện lại ở một câu lệnh khai báo sau, hành động addtype sẽ ghi đè kiểu cũ bằng kiểu mới (đây là hành vi mở rộng so với ví dụ gốc trong giáo trình, nơi không có tái khai báo).

    Yêu cầu: sau khi xử lý hết nnn câu lệnh, in ra kiểu cuối cùng (theo lần khai báo gần nhất) của mỗi định danh đã từng xuất hiện, sắp xếp theo thứ tự bảng chữ cái tăng dần của tên định danh.

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

      Dòng đầu chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000). nnn dòng tiếp theo, mỗi dòng có dạng <type> <id_1> <id_2> ... <id_k> (k≥1k \ge 1k≥1), trong đó type là một xâu không chứa khoảng trắng.

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

      Mỗi dòng in <id> <type> (kiểu cuối cùng của định danh đó), theo thứ tự bảng chữ cái tăng dần của id. Nếu không có định danh nào, in ra không dòng nào (chuỗi rỗng).

    Ví dụ:

    Đầu vào:

    1
    int x
    

    Đầu ra:

    x int
    

    Đầu vào:

    3
    int a b c
    float b d
    bool a
    

    Đầu ra:

    a bool
    b float
    c int
    d float
    

    Đang tải editor...