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 LL(1) xuất phát từ ký hiệu bất kỳ (nhiều truy vấn)

    Cho một văn phạm phi ngữ cảnh (CFG) với ký hiệu bắt đầu SSS, được đảm bảo là LL(1).

    Quy ước biểu diễn văn phạm phi ngữ cảnh (CFG) dùng chung cho đề này:

    • Mỗi ký hiệu chưa kết thúc (non-terminal) là một chữ cái in hoa (A-Z).
    • Mọi token khác (chữ thường, số, hoặc ký hiệu như (, ), +, *, id, num, ...) là ký hiệu kết thúc (terminal); terminal có thể dài nhiều ký tự nhưng không chứa khoảng trắng.
    • Token đặc biệt e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε\varepsilonε (ví dụ A -> e).
    • Ký hiệu kết thúc đầu vào (end-of-input) được ký hiệu là $ khi cần dùng tới FOLLOW.
    • Đảm bảo mọi ký hiệu chưa kết thúc xuất hiện ở vế phải của bất kỳ luật sinh nào cũng đều có ít nhất một luật sinh định nghĩa nó (văn phạm "đóng", không có non-terminal mồ côi).

    Bộ phân tích cú pháp LL(1) chuẩn dùng một ngăn xếp và bảng dự đoán M[A,a]M[A,a]M[A,a] để quyết định luật sinh áp dụng. Trong bài này, thay vì luôn bắt đầu từ SSS, ta muốn kiểm tra khả năng dẫn xuất bắt đầu từ một ký hiệu chưa kết thúc bất kỳ XXX của văn phạm (không nhất thiết là SSS): khởi tạo ngăn xếp gồm $ và XXX (với XXX ở đỉnh), sau đó chạy thuật toán phân tích dự đoán như thường lệ trên chuỗi terminal www cho trước để xác định X⇒∗wX \Rightarrow^{*} wX⇒∗w hay không.

    Cho qqq truy vấn, mỗi truy vấn gồm một ký hiệu chưa kết thúc XXX và một chuỗi terminal www (có thể rỗng). Với mỗi truy vấn, hãy xác định XXX có dẫn xuất được chính xác chuỗi www hay không bằng thuật toán phân tích LL(1) dựa trên bảng.

    Ví dụ

    Với văn phạm biểu thức số học kinh điển, truy vấn xuất phát từ YYY với chuỗi rỗng cho kết quả OK (vì Y⇒εY \Rightarrow \varepsilonY⇒ε), còn truy vấn xuất phát từ XXX với chuỗi chỉ gồm + cho kết quả LOI (vì sau dấu + bắt buộc phải có thêm TTT và XXX, không thể dừng lại ngay).

    • Định dạng đầu vào:
      • Dòng 1: ký hiệu bắt đầu SSS.
      • Dòng 2: số luật sinh nnn (1≤n≤301 \le n \le 301≤n≤30).
      • nnn dòng luật sinh dạng A -> X1 X2 ... Xk hoặc A -> e.
      • Dòng tiếp theo: số truy vấn qqq (1≤q≤151 \le q \le 151≤q≤15).
      • qqq dòng tiếp theo, mỗi dòng có dạng X k w1 w2 ... wk, trong đó X là một ký hiệu chưa kết thúc của văn phạm, k (0≤k≤200 \le k \le 200≤k≤20) là số ký hiệu kết thúc của chuỗi cần kiểm tra, và w1 ... wk là các ký hiệu kết thúc đó theo đúng thứ tự (nếu k=0k=0k=0 thì không có token nào theo sau, tức kiểm tra X⇒∗εX \Rightarrow^{*} \varepsilonX⇒∗ε).

      Đảm bảo văn phạm cho trong test luôn là LL(1).

      Quy ước biểu diễn văn phạm phi ngữ cảnh (CFG) dùng chung cho đề này:

      • Mỗi ký hiệu chưa kết thúc (non-terminal) là một chữ cái in hoa (A-Z).
      • Mọi token khác (chữ thường, số, hoặc ký hiệu như (, ), +, *, id, num, ...) là ký hiệu kết thúc (terminal); terminal có thể dài nhiều ký tự nhưng không chứa khoảng trắng.
      • Token đặc biệt e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε\varepsilonε (ví dụ A -> e).
      • Ký hiệu kết thúc đầu vào (end-of-input) được ký hiệu là $ khi cần dùng tới FOLLOW.
      • Đảm bảo mọi ký hiệu chưa kết thúc xuất hiện ở vế phải của bất kỳ luật sinh nào cũng đều có ít nhất một luật sinh định nghĩa nó (văn phạm "đóng", không có non-terminal mồ côi).
    • Định dạng đầu ra:

      In ra đúng qqq dòng, mỗi dòng ứng với một truy vấn theo đúng thứ tự đọc vào: in OK nếu X⇒∗wX \Rightarrow^{{*}} wX⇒∗w (bộ phân tích LL(1) chấp nhận), hoặc LOI nếu không (bộ phân tích báo lỗi ở bước nào đó).

    Ví dụ:

    Đầu vào:

    E
    8
    E -> T X
    X -> + T X
    X -> e
    T -> F Y
    Y -> * F Y
    Y -> e
    F -> ( E )
    F -> id
    6
    E 3 id * id
    T 3 id * id
    Y 0
    X 1 +
    F 1 id
    E 5 ( id + id )

    Đầu ra:

    OK
    OK
    OK
    LOI
    OK
    OK
    

    Đầu vào:

    S
    1
    S -> a
    2
    S 1 a
    S 0

    Đầu ra:

    OK
    LOI
    

    Đang tải editor...