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] Chèn toán tử nối tường minh trong regex

    Bước tiền xử lý kinh điển trước khi dựng cây cú pháp cho một "động cơ regex" là chèn tường minh toán tử nối (concatenation), vì trong regex viết thông thường phép nối hai biểu thức con không có ký hiệu riêng (ví dụ ab nghĩa là a nối b), gây khó khăn khi áp dụng thuật toán chuyển postfix kiểu Shunting-Yard.

    Xét regex chỉ gồm các ký tự a–z (literal), |, *, +, ?, (, ). Với mỗi cặp ký tự liền kề (c1,c2)(c_1, c_2)(c1​,c2​) trong chuỗi (theo đúng thứ tự xuất hiện), ta chèn một dấu chấm . (toán tử nối tường minh) vào giữa c1c_1c1​ và c2c_2c2​ khi và chỉ khi đồng thời:

    • c1c_1c1​ có thể kết thúc một biểu thức con, tức c1∈{c_1 \in \{c1​∈{chữ cái, ), *, +, ?}\}}; và
    • c2c_2c2​ có thể bắt đầu một biểu thức con, tức c2∈{c_2 \in \{c2​∈{chữ cái, `(}\}}.

    Hãy in ra regex sau khi đã chèn đầy đủ các dấu . theo quy tắc trên (không thay đổi gì khác).

    Ví dụ: (a|b)*c → sau khi chèn: (a|b)*.c (chèn . giữa )*... chính xác là giữa * và c vì * kết thúc biểu thức con (a|b)*, còn c bắt đầu một biểu thức con mới).

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

      Một dòng duy nhất chứa chuỗi regex rrr (độ dài từ 111 đến 200200200), chỉ gồm các ký tự trong tập {a..z, |, *, +, ?, (, )}, đảm bảo cú pháp regex hợp lệ (ngoặc cân bằng).

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

      In ra một dòng duy nhất là chuỗi regex sau khi đã chèn tường minh toán tử nối . theo đúng quy tắc nêu trên.

    Ví dụ:

    Đầu vào:

    ab|c*

    Đầu ra:

    a.b|c*
    

    Đầu vào:

    a

    Đầu ra:

    a
    

    Đang tải editor...