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 Đối tượng Một Lượt

    Trong giai đoạn tiền xử lý (preprocessing) của một trình biên dịch, chỉ thị #define TÊN GIÁ_TRỊ định nghĩa một macro đối tượng (object-like macro): mọi lần xuất hiện của token TÊN trong mã nguồn sau đó sẽ được thay thế bởi token GIÁ_TRỊ.

    Cho nnn định nghĩa macro và mmm dòng mã nguồn (đã được tách sẵn thành các token cách nhau bởi đúng một khoảng trắng), hãy thực hiện phép thay thế một lượt duy nhất (không thay thế đệ quy trên chính giá trị vừa thay): với mỗi token trong mã nguồn, nếu token đó trùng khớp hoàn toàn (so sánh chuỗi, phân biệt hoa thường) với tên một macro đã định nghĩa, thay nó bằng giá trị của macro; ngược lại giữ nguyên token.

    Nếu một tên macro được định nghĩa lại (#define xuất hiện nhiều lần với cùng tên), định nghĩa xuất hiện sau sẽ ghi đè định nghĩa trước.

    Ví dụ: Với macro MAX 100 và dòng code if x > MAX then y = MAX, kết quả là if x > 100 then y = 100.

    • Định dạng đầu vào:
      • Dòng 1: hai số nguyên nnn và mmm (0≤n,m≤10000 \le n, m \le 10000≤n,m≤1000) — số định nghĩa macro và số dòng mã nguồn.
      • nnn dòng tiếp theo: mỗi dòng gồm hai token cách nhau bởi đúng một khoảng trắng: TÊN GIÁ_TRỊ (TÊN, GIÁ_TRỊ là chuỗi không rỗng, không chứa khoảng trắng).
      • mmm dòng tiếp theo: mỗi dòng là một dòng mã nguồn gồm các token cách nhau bởi đúng một khoảng trắng (dòng có thể rỗng, nghĩa là 0 token).
    • Định dạng đầu ra:

      In ra mmm dòng, dòng thứ iii là dòng mã nguồn thứ iii sau khi thay thế macro (một lượt), các token cách nhau bởi đúng một khoảng trắng. Dòng rỗng in ra một dòng trống.

    Ví dụ:

    Đầu vào:

    3 2
    MAX 100
    MIN 0
    PI 3
    if x > MAX then y = MIN
    z = PI * PI

    Đầu ra:

    if x > 100 then y = 0
    z = 3 * 3
    

    Đầu vào:

    2 1
    A 1
    A 2
    val = A

    Đầu ra:

    val = 2
    

    Đang tải editor...