Tập FOLLOW(A) của một ký hiệu chưa kết thúc A là tập các ký hiệu kết thúc a có thể xuất hiện ngay sau A trong một dạng câu nào đó xuất phát từ ký hiệu bắt đầu S, cộng thêm ký hiệu kết thúc xâu $ nếu A có thể là ký hiệu cuối cùng của một dạng câu (đặc biệt FOLLOW(S) luôn chứa $). Đây là thành phần bắt buộc khi xây dựng bảng phân tích SLR(1) (quyết định khi nào được rút gọn theo một luật sinh).
Quy ước ký hiệu văn phạm (áp dụng cho toàn bộ đề bài này): mỗi luật sinh được cho ở dạng A -> X1 X2 ... Xk (các ký hiệu cách nhau bởi dấu cách); nếu vế phải là rỗng thì ghi A -> eps. Một ký hiệu được coi là ký hiệu chưa kết thúc (non-terminal) nếu và chỉ nếu ký tự đầu tiên của nó là một chữ cái in hoa (A-Z); mọi ký hiệu còn lại (chữ thường, chữ số, dấu (, ), +, id, ... ) đều là ký hiệu kết thúc (terminal). Ký hiệu đặc biệt eps chỉ dùng để biểu diễn xâu rỗng ε và không phải là một terminal thật sự. Ký hiệu $ là ký hiệu kết thúc xâu vào (end-marker).
Cho văn phạm phi ngữ cảnh G với ký hiệu bắt đầu S, hãy tính FOLLOW(A) cho mọi ký hiệu chưa kết thúc A xuất hiện là vế trái của ít nhất một luật sinh, theo đúng thứ tự lần đầu tiên các ký hiệu này xuất hiện làm vế trái trong danh sách luật sinh của đề bài.
Ví dụ: văn phạm S -> A\nA -> a\nC -> c với ký hiệu bắt đầu S: \mathrm{FOLLOW}(S)=\{\},\mathrm{FOLLOW}(A)={$}(vıˋAđứngcuo^ˊiluật‘S−>A‘),coˋnCkho^ngxua^ˊthiệnởve^ˊphảiluậtsinhnaˋovaˋkho^ngphảikyˊhiệuba˘ˊtđa^ˋune^n\mathrm{FOLLOW}(C) = \varnothing$ (tập rỗng).
Dòng đầu tiên là số nguyên n (1≤n≤100) — số luật sinh.
n dòng tiếp theo, mỗi dòng một luật sinh dạng A -> X1 X2 ... Xk hoặc A -> eps.
Dòng cuối cùng là ký hiệu bắt đầu S (một ký hiệu chưa kết thúc, đảm bảo có xuất hiện làm vế trái).
In ra một dòng cho mỗi ký hiệu chưa kết thúc A (theo thứ tự xuất hiện lần đầu làm vế trái trong danh sách luật sinh), dạng A: t1,t2,..., trong đó t1,t2,… là các phần tử của FOLLOW(A) sắp xếp tăng dần theo từ điển, cách nhau bởi dấu phẩy , không có khoảng trắng thừa. Nếu FOLLOW(A)=∅, in A: (không có gì sau dấu hai chấm và khoảng trắng).
Ví dụ:
Đầu vào:
1
A -> a
A
Đầu ra:
A: $
Đầu vào:
8
E -> T E1
E1 -> + T E1
E1 -> eps
T -> F T1
T1 -> * F T1
T1 -> eps
F -> ( E )
F -> id
E
Đầu ra:
E: $,)
E1: $,)
T: $,),+
T1: $,),+
F: $,),*,+
Đang tải editor...