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] Khai triển macro đệ quy có chống vòng lặp (luật tô xanh)

    Chuẩn C quy định cơ chế quét lại (rescanning): sau khi một macro được thay bằng thân của nó, dãy token mới sinh ra tiếp tục được quét để tìm macro cần khai triển thêm. Vì thân của một macro có thể chứa (trực tiếp hoặc gián tiếp) chính tên của nó, để thuật toán luôn dừng, chuẩn C áp dụng luật "tô xanh" (blue paint / self-referential macro protection):

    Mỗi token trong quá trình khai triển được gắn một tập nhãn — tập tên các macro đã được dùng để sinh ra token đó trên đường từ token gốc. Tại một bước, một token là tên macro XXX chỉ được khai triển nếu XXX không có mặt trong tập nhãn của chính token đó. Khi khai triển token này (thay bằng thân của XXX), mọi token mới sinh ra được kế thừa tập nhãn của token cũ cộng thêm XXX.

    Cho mmm macro đối tượng (object-like, không tham số), mỗi macro có tên và thân là một dãy token. Cho một dãy token ban đầu (tập nhãn rỗng cho mỗi token gốc). Hãy khai triển lặp đi lặp lại theo đúng luật trên (mỗi bước, quét từ trái sang phải, khai triển token đầu tiên thoả điều kiện có thể khai triển, rồi quét lại từ đầu) cho đến khi không còn token nào khai triển được nữa.

    Ví dụ: với A có thân a SELF b... — nói cách khác, nếu thân của SELF là a SELF b thì khai triển SELF một lần cho ra a SELF b, và token SELF mới này đã mang nhãn {SELF} nên không được khai triển tiếp — kết quả cuối cùng là a SELF b.

    In ra dãy token cuối cùng, cách nhau bởi đúng một dấu cách (in dòng trống nếu kết quả không còn token nào).

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

      Dòng đầu tiên chứa số nguyên mmm (0≤m≤60 \le m \le 60≤m≤6) — số macro.

      mmm dòng tiếp theo, mỗi dòng có dạng TEN token1 token2 ... tokenk (TEN là tên macro, duy nhất giữa các macro, phần còn lại là thân, các token cách nhau bởi đúng một khoảng trắng; nếu dòng chỉ có TEN thì thân rỗng — macro khai triển ra không còn gì). Mỗi thân có tối đa 6 token, độ dài mỗi token không quá 10 ký tự.

      Dòng cuối cùng là dãy token ban đầu, cách nhau bởi khoảng trắng (có thể là dòng rỗng, nghĩa là dãy ban đầu không có token nào), tối đa 6 token.

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

      In ra đúng một dòng chứa dãy token kết quả sau khi khai triển hoàn toàn, cách nhau bởi đúng một dấu cách (dòng trống nếu không còn token nào).

    Ví dụ:

    Đầu vào:

    1
    A 1 2 3
    start A end
    

    Đầu ra:

    start 1 2 3 end
    

    Đầu vào:

    0
    hello world
    

    Đầu ra:

    hello world
    

    Đang tải editor...