Trong bảng phân tích LL(1), mỗi luật sinh A→α được gắn với một tập lookahead — gọi là tập SELECT (hay PREDICT) — xác định khi nào bộ phân tích sẽ CHỌN luật sinh đó:
SELECT(A→α)=FIRST(α) ∪ (FOLLOW(A) neˆˊu α⇒∗ε)
(ở đây FIRST(α) chỉ gồm terminal, không chứa ε). Quy ước văn phạm và ký hiệu e/ε như các bài trước.
Cho văn phạm, các luật sinh được đánh số 1,2,…,n theo đúng thứ tự xuất hiện trong input. Cho một chỉ số k, hãy tính SELECT của luật sinh thứ k.
Ví dụ, với văn phạm biểu thức số học kinh điển, luật sinh thứ 3 là X -> e. Vì đây là luật sinh rỗng nên SELECT(X \to \varepsilon) = FOLLOW(X) = \{), \}.Ke^ˊtquảinra:‘),`.
A -> X1 X2 ... Xk (hoặc A -> e), theo đúng thứ tự sẽ được đá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ó.
In ra một dòng: các terminal thuộc SELECT(A→α) (với A→α là luật sinh thứ k), sắp xếp theo thứ tự bảng chữ cái (ASCII) tăng dần, cách nhau bởi dấu phẩy (không khoảng trắng); nếu \ \in SELECT(A \to \alpha)thıˋđặt‘` ở cuối danh sách. Nếu tập này rỗng, in ra một dòng trống.
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
1
Đầu ra:
(,id
Đầ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
3
Đầu ra:
),$
Đang tải editor...