Để xây dựng bảng phân tích cú pháp LL(1), với mỗi luật sinh A→α ta cần tính tập lựa chọn: SELECT(A→α)=(FIRST(α)∖{ε})∪{FOLLOW(A)∅neˆˊu ε∈FIRST(α)ngược lại Đây chính là hàng — cột trong bảng phân tích M[A,a] ứng với sản xuất đó: với mọi a∈SELECT(A→α), ô M[A,a] sẽ chứa luật sinh A→α (nếu văn phạm là LL(1) thì mỗi ô có tối đa một luật sinh).
Cho văn phạm G gồm n luật sinh được đánh số 1,2,…,n theo đúng thứ tự xuất hiện trong input, hãy in ra SELECT của TỪNG luật sinh (không quan tâm văn phạm có phải LL(1) hay không — nếu có xung đột giữa hai luật sinh, chúng vẫn có SELECT riêng, cứ in ra bình thường).
Ví dụ: với văn phạm
E -> T X
X -> + T X
X -> eps
T -> id
(luật sinh 1: E→TX, 2: X→+TX, 3: X→ε, 4: T→id), ta có SELECT(1)={id}, SELECT(2)={+}, \text{SELECT}(3) = \text{FOLLOW}(X) = \{\},\text{SELECT}(4) = {id}$.
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 n dòng, dòng thứ i (1≤i≤n, theo đúng thứ tự luật sinh trong input) có dạng i: s1 s2 ... sm trong đó s1<s2<… là các phần tử của SELECT của luật sinh thứ i, sắp xếp tăng dần theo thứ tự từ điển thông thường, cách nhau đúng một khoảng trắng — RIÊNG kí hiệu $ (nếu có) luôn được in ở CUỐI dòng bất kể thứ tự từ điển. Nếu tập SELECT rỗng, in dòng i: không có khoảng trắng thừa phía sau.
Ví dụ:
Đầ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:
1: ( id
2: +
3: ) $
4: ( id
5: *
6: ) + $
7: (
8: id
Đầu vào:
4
E -> T X
X -> + T X
X -> eps
T -> id
Đầu ra:
1: id
2: +
3: $
4: id
Đang tải editor...