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 Dạng Hàm Một Lượt

    Macro dạng hàm (function-like macro) trong C có dạng #define TÊN(P1,P2,...,Pk) THÂN, trong đó THÂN là một dãy token; khi gặp lời gọi TÊN(a1,a2,...,ak) trong mã nguồn, trình tiền xử lý thay lời gọi bằng THÂN sau khi thay mỗi tham số hình thức PiP_iPi​ xuất hiện trong THÂN bằng đối số thực aia_iai​ tương ứng (thay tất cả các lần xuất hiện của PiP_iPi​ trong THÂN, nguyên vẹn cả token, không thay chuỗi con).

    Cho nnn định nghĩa macro dạng hàm và mmm dòng mã nguồn, với quy ước: trong dòng mã nguồn, mọi token có dạng TÊN(a1,a2,...,ak) (không chứa khoảng trắng bên trong, các đối số cách nhau bởi dấu phẩy, mỗi đối số là một token đơn không chứa dấu phẩy hoặc ngoặc) mà TÊN trùng với tên một macro đã định nghĩa và số đối số đúng bằng số tham số hình thức, được xem là một lời gọi macro và được thay thế; các token khác giữ nguyên (kể cả khi trông giống lời gọi nhưng TÊN không phải macro hoặc số đối số không khớp). Việc thay thế chỉ thực hiện một lượt (không xử lý lời gọi macro lồng bên trong THÂN sau khi thay).

    Ví dụ: Với macro MAX(a,b) = ( a > b ? a : b ) và dòng code r = MAX(x,y), kết quả là r = ( x > y ? x : y ).

    • Định dạng đầu vào:
      • Dòng 1: hai số nguyên n,mn, mn,m (0≤n,m≤5000 \le n, m \le 5000≤n,m≤500).
      • nnn dòng tiếp theo: định nghĩa macro theo cú pháp TÊN(P1,P2,...,Pk)=THÂN, trong đó phần tham số hình thức không chứa khoảng trắng (TÊN(P1,P2,...,Pk), k≥0k \ge 0k≥0; nếu k=0k=0k=0 thì viết TÊN()), theo sau là dấu = rồi đến THÂN là các token cách nhau bởi đúng một khoảng trắng (THÂN có thể rỗng — không có token nào sau dấu =, khi đó sau = là hết dòng).
      • mmm dòng tiếp theo: mỗi dòng mã nguồn gồm các token cách nhau bởi đúng một khoảng trắng.
    • Định dạng đầu ra:

      In ra mmm dòng mã nguồn sau khi thay thế lời gọi macro (giữ nguyên các token không phải lời gọi macro hợp lệ), token trong THÂN đã thay thế cũng cách nhau bởi đúng một khoảng trắng.

    Ví dụ:

    Đầu vào:

    1 1
    FOO(a)=a + 1
    call = FOO(x,y)

    Đầu ra:

    call = FOO(x,y)
    

    Đầu vào:

    1 1
    MAX(a,b)=( a > b ? a : b )
    r = MAX(x,y)

    Đầu ra:

    r = ( x > y ? x : y )
    

    Đang tải editor...