Cho một văn phạm phi ngữ cảnh (CFG) với ký hiệu bắt đầu S, đượ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:
A-Z).(, ), +, *, 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.e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε (ví dụ A -> e).$ khi cần dùng tới FOLLOW.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] để quyết định luật sinh áp dụng. Trong bài này, thay vì luôn bắt đầu từ S, 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ỳ X của văn phạm (không nhất thiết là S): khởi tạo ngăn xếp gồm $ và X (với X ở đỉnh), sau đó chạy thuật toán phân tích dự đoán như thường lệ trên chuỗi terminal w cho trước để xác định X⇒∗w hay không.
Cho q truy vấn, mỗi truy vấn gồm một ký hiệu chưa kết thúc X và một chuỗi terminal w (có thể rỗng). Với mỗi truy vấn, hãy xác định X có dẫn xuất được chính xác chuỗi w hay không bằng thuật toán phân tích LL(1) dựa trên bảng.
Với văn phạm biểu thức số học kinh điển, truy vấn xuất phát từ Y với chuỗi rỗng cho kết quả OK (vì Y⇒ε), còn truy vấn xuất phát từ X 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 T và X, không thể dừng lại ngay).
A -> X1 X2 ... Xk hoặc A -> e.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≤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=0 thì không có token nào theo sau, tức kiểm tra X⇒∗ε).Đả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:
A-Z).(, ), +, *, 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.e ở vế phải nghĩa là luật sinh sinh ra chuỗi rỗng ε (ví dụ A -> e).$ khi cần dùng tới FOLLOW.In ra đúng q 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⇒∗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...