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→TL{L.in=T.type} L→id,L1{addtype(id,L.in);L1.in=L.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.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 n 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 n 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.
Dòng đầu chứa số nguyên n (0≤n≤1000). n dòng tiếp theo, mỗi dòng có dạng <type> <id_1> <id_2> ... <id_k> (k≥1), trong đó type là một xâu không chứa khoảng trắng.
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...