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] Mô phỏng DFA và phát hiện kẹt

    Một động cơ regex dựa trên DFA xử lý chuỗi đầu vào từng ký tự một theo bảng chuyển trạng thái δ\deltaδ. Khác với mô hình DFA hoàn chỉnh lý thuyết (luôn có chuyển cho mọi ký hiệu, kể cả về một trạng thái bẫy), bảng chuyển ở đây có thể không đầy đủ: nếu tại một bước nào đó không tồn tại δ(p,c)\delta(p, c)δ(p,c), động cơ phải dừng lại ngay lập tức và báo vị trí gặp lỗi, thay vì ngầm định chuyển sang trạng thái lỗi.

    Cho một DFA (không nhất thiết hoàn chỉnh) với nnn trạng thái đánh số từ 000 đến n−1n-1n−1, trạng thái bắt đầu sss, ttt chuyển trạng thái tường minh δ(p,c)=q\delta(p, c) = qδ(p,c)=q, và fff trạng thái kết thúc. Cho một chuỗi www (có thể rỗng), hãy mô phỏng việc xử lý www theo DFA này, từng ký tự một, từ trái sang phải.

    Ví dụ: DFA có n=2n=2n=2 trạng thái, chuyển δ(0,a)=1\delta(0,a)=1δ(0,a)=1, δ(1,a)=0\delta(1,a)=0δ(1,a)=0, trạng thái kết thúc {0}\{0\}{0}, bắt đầu từ 000. Với w=w = w= aa: bước 1 (đọc ký tự a đầu) đưa về trạng thái 111; bước 2 (đọc ký tự a thứ hai) đưa về trạng thái 000. Đọc hết chuỗi, trạng thái cuối là 000 — thuộc tập kết thúc, nên kết quả là chấp nhận.

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

      Dòng 1: bốn số nguyên nnn, ttt, fff, sss — lần lượt là số trạng thái, số chuyển tường minh, số trạng thái kết thúc, và trạng thái bắt đầu.

      ttt dòng tiếp theo, mỗi dòng ba giá trị ppp, ccc, qqq (nghĩa là δ(p,c)=q\delta(p,c)=qδ(p,c)=q; ccc là một ký tự). Không có cặp (p,c)(p,c)(p,c) nào lặp lại.

      Dòng tiếp theo gồm fff số nguyên là các trạng thái kết thúc, cách nhau khoảng trắng (nếu f=0f=0f=0 đây là dòng rỗng).

      Dòng cuối cùng là chuỗi www cần xử lý (có thể là dòng rỗng nếu www là chuỗi rỗng).

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

      Nếu trong quá trình đọc www từ trái sang phải, khi đang ở trạng thái ppp và gặp ký tự thứ iii của www (đánh số từ 111) mà không tồn tại δ(p,wi)\delta(p, w_i)δ(p,wi​), in ra đúng một dòng theo định dạng STUCK p i rồi dừng ngay, không xử lý các ký tự còn lại.

      Nếu đọc hết www mà không bị kẹt ở bước nào, in ra ACCEPT nếu trạng thái đạt được sau cùng thuộc tập trạng thái kết thúc, ngược lại in ra REJECT.

      Với ví dụ ở trên, kết quả in ra là:

      ACCEPT
      

    Ví dụ:

    Đầu vào:

    2 2 1 0
    0 a 1
    1 a 0
    0
    aa
    

    Đầu ra:

    ACCEPT
    

    Đầu vào:

    2 1 1 0
    0 a 1
    0
    ab
    

    Đầu ra:

    STUCK 1 2
    

    Đang tải editor...