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 hàm với đối số lồng ngoặc

    Macro dạng hàm (function-like macro) trong C, ví dụ #define MAX(a,b) ((a)>(b)?(a):(b)), được khai triển bằng cách thay mỗi tham số hình thức bằng văn bản đối số thực tế tương ứng tại lời gọi.

    Cho một macro dạng hàm gồm: tên MACRO, danh sách tham số hình thức (có thể rỗng), và phần thân là dãy token cách nhau bởi khoảng trắng. Cho một dòng chứa đúng một lời gọi MACRO(...) (tên macro và dấu ( liền nhau, không có khoảng trắng), có thể có tiền tố/hậu tố bất kỳ trước/sau lời gọi trên cùng dòng đó. Các đối số trong lời gọi cách nhau bởi dấu phẩy , ở mức ngoặc 0 — nghĩa là dấu phẩy nằm trong một cặp ngoặc con ( ) lồng bên trong đối số (ví dụ đối số là một lời gọi hàm khác như f(1,2)) không được tính là dấu phân tách đối số.

    Khai triển: quét từng token trong thân macro, token nào trùng khớp chính xác toàn bộ với tên một tham số hình thức thì thay bằng văn bản đối số tương ứng (đã được cắt bỏ khoảng trắng thừa ở đầu/cuối); các token khác giữ nguyên. (Bài này không yêu cầu xử lý toán tử #/##, và không khai triển đệ quy macro khác.) Sau đó thay thế toàn bộ đoạn MACRO(...) trong dòng gốc bằng kết quả (các token của thân, sau khi thay tham số, được nối lại bởi đúng một khoảng trắng), giữ nguyên phần tiền tố/hậu tố.

    Ví dụ: macro MAX(a,b) với thân a > b ? a : b, dòng gọi result = MAX(x, y); → kết quả result = x > y ? x : y;.

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

      Dòng 1: tên macro MACRO (chỉ gồm chữ cái/chữ số/gạch dưới).

      Dòng 2: danh sách tham số hình thức cách nhau bởi dấu phẩy , (không có khoảng trắng thừa quanh dấu phẩy), có thể là dòng rỗng nếu macro không có tham số.

      Dòng 3: thân macro — các token cách nhau bởi đúng một khoảng trắng (có thể là dòng rỗng nếu thân macro không có token nào).

      Dòng 4: dòng chứa lời gọi macro (đúng một lần xuất hiện MACRO(...)), số lượng đối số truyền vào luôn khớp với số tham số hình thức.

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

      In ra đúng một dòng — dòng gốc sau khi thay thế lời gọi macro bằng kết quả khai triển.

    Ví dụ:

    Đầu vào:

    SQ
    x
    x * x
    total = SQ(3 + 4);
    

    Đầu ra:

    total = 3 + 4 * 3 + 4;
    

    Đầu vào:

    MAX
    a,b
    a > b ? a : b
    result = MAX(x, y);
    

    Đầu ra:

    result = x > y ? x : y;
    

    Đang tải editor...