Với mỗi kí hiệu chưa kết thúc A của văn phạm phi ngữ cảnh G có kí hiệu bắt đầu S, tập FOLLOW(A) gồm mọi kí hiệu kết thúc b sao cho tồn tại một dẫn xuất S⇒∗αAbβ; ngoài ra nếu S⇒∗αA (tức A có thể là kí hiệu cuối cùng của một câu dẫn xuất từ S) thì kí hiệu kết thúc chuỗi \$$ cũng thuộc \text{FOLLOW}(A)$.
Cho văn phạm G (kí hiệu bắt đầu là vế trái của luật sinh đầu tiên), hãy tính FOLLOW(A) cho mọi kí hiệu chưa kết thúc A, dùng thuật toán điểm bất động chuẩn dựa trên tập FIRST đã tính trước.
Ví dụ: với văn phạm
E -> T X
X -> + T X
X -> eps
T -> id
ta có \text{FOLLOW}(E) = \{\},\text{FOLLOW}(X) = {$},\text{FOLLOW}(T) = {+, $}$.
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 dòng (mỗi kí hiệu chưa kết thúc một dòng), theo ĐÚNG thứ tự xuất hiện lần đầu ở vế trái trong input.
Mỗi dòng có dạng A: s1 s2 ... sm với s1<s2<… là các kí hiệu kết thúc thuộc FOLLOW(A) SẮP XẾP TĂNG DẦN theo thứ tự từ điển, cách nhau đúng một khoảng trắng. Nếu \ \in \text{FOLLOW}(A),inthe^mtoken‘ở CUỐI dòng (sau mọi kí hiệu kết thúc khác). Nếu $\text{FOLLOW}(A) = \emptyset$ (kí hiệu $A$ không xuất hiện ở vế phải luật sinh nào và cũng không phải kí hiệu bắt đầu), in dòngA:` không có khoảng trắng thừa phía sau.
Ví dụ:
Đầu vào:
1
S -> a
Đầu ra:
S: $
Đầu vào:
4
E -> T X
X -> + T X
X -> eps
T -> id
Đầu ra:
E: $
X: $
T: + $
Đang tải editor...