Với mỗi luật sinh A→α, định nghĩa tập LỰA CHỌN SELECT(A→α) như sau: SELECT(A→α)=(FIRST(α)∖{ε})∪{FOLLOW(A)∅neˆˊu ε∈FIRST(α)ngược lại Văn phạm G (không có kí hiệu chưa kết thúc vô ích, không đệ quy trái gián tiếp gây vòng lặp vô hạn khi tính FIRST/FOLLOW) được gọi là LL(1) nếu và chỉ nếu: với mọi kí hiệu chưa kết thúc A có từ hai luật sinh A→αi trở lên, các tập SELECT(A→αi) ĐÔI MỘT RỜI NHAU (không có kí hiệu kết thúc nào thuộc về từ hai tập SELECT của cùng A trở lên).
Cho văn phạm G, hãy xác định G có phải là văn phạm LL(1) hay không.
Ví dụ kinh điển KHÔNG phải LL(1) (mơ hồ dangling-else):
S -> if E then S S1
S1 -> else S
S1 -> eps
E -> id
vì SELECT(S1→else S)={else} và \text{SELECT}(S1 \to \varepsilon) = \text{FOLLOW}(S1) = \{else, \}$ giao nhau tại else.
A -> X1 X2 ... Xk (giữa A và ->, giữa -> và X1, giữa các Xi luôn có khoảng trắng); A là kí hiệu ở vế trái, X1,…,Xk là các kí hiệu ở vế phải. Nếu vế phải là chuỗi rỗng ε, dòng có dạng A -> eps (đúng một kí hiệu eps).eps) là kí hiệu KẾT THÚC (terminal). Kí hiệu bắt đầu (start symbol) của văn phạm là vế trái của luật sinh ở dòng đầu tiên (dòng thứ hai của input). Có thể có nhiều luật sinh cùng vế trái, nằm ở các dòng khác nhau, không nhất thiết liền kề.$.In ra đúng một dòng: YES nếu văn phạm G là LL(1), hoặc NO nếu không phải (viết hoa toàn bộ, không có dấu câu hay khoảng trắng thừa).
Ví dụ:
Đầu vào:
4
E -> T X
X -> + T X
X -> eps
T -> id
Đầu ra:
YES
Đầu vào:
8
E -> T X
X -> + T X
X -> eps
T -> F Y
Y -> * F Y
Y -> eps
F -> ( E )
F -> id
Đầu ra:
YES
Đang tải editor...