Một văn phạm phi ngữ cảnh được gọi là LL(1) nếu với mọi non-terminal A có từ hai luật sinh trở lên A→α1∣α2∣…, các tập SELECT tương ứng đôi một rời nhau:
SELECT(A→αi)∩SELECT(A→αj)=∅∀i=j
(định nghĩa SELECT như bài "Tính tập SELECT của một luật sinh"). Nếu tồn tại một cặp luật sinh vi phạm điều kiện trên, bộ phân tích dự đoán (predictive parser) không thể quyết định chọn luật sinh nào chỉ dựa vào 1 ký hiệu lookahead — đó là một XUNG ĐỘT.
Các luật sinh được đánh số 1,2,…,n theo thứ tự trong input. Hãy kiểm tra văn phạm có phải LL(1) hay không; nếu KHÔNG, hãy tìm cặp chỉ số (i,j) với i<j thỏa: cùng thuộc về một non-terminal, SELECT(i)∩SELECT(j)=∅, và i nhỏ nhất có thể (nếu có nhiều j ứng với i đó, chọn j nhỏ nhất).
Ví dụ, văn phạm:
S -> A a
A -> a
A -> e
có FOLLOW(A)={a} (từ S -> A a), nên SELECT(A→a)={a} và SELECT(A→ε)=FOLLOW(A)={a} — hai luật sinh (chỉ số 2 và 3) cùng chọn khi lookahead là a. Kết quả in ra: CONFLICT 2 3.
A -> X1 X2 ... Xk (hoặc A -> e), theo đúng thứ tự đánh số 1..n.Đảm bảo mọi non-terminal xuất hiện ở vế phải đều có ít nhất một luật sinh định nghĩa nó.
Nếu văn phạm là LL(1) (không có xung đột nào), in ra đúng:
LL(1)
Ngược lại, in ra:
CONFLICT i j
với i,j (i<j) là cặp chỉ số luật sinh xung đột được chọn theo quy tắc: i nhỏ nhất có thể trong số mọi cặp xung đột, sau đó j nhỏ nhất trong số các cặp có cùng i đó.
Ví dụ:
Đầu vào:
S
4
S -> a A
S -> a B
A -> p
B -> q
Đầu ra:
CONFLICT 1 2
Đầ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
Đầu ra:
LL(1)
Đang tải editor...