Cho văn phạm với các luật sinh sau: E->TE; E’->+T E’; E’->epsilon; T->FT'; T'- >*FT’; T’->epsilon; F->(E); F->id; FOLLOW (F)=?
Đáp án đúng: B
Để tìm FOLLOW(F), ta cần xem xét các luật sinh có F ở vế phải:
- T -> FT'
- T' -> *FT'
- F -> (E)
- F -> id
Từ luật 1: T -> FT', FOLLOW(F) chứa FIRST(T'). FIRST(T') = {*, epsilon}. Vậy FOLLOW(F) chứa {*}. Nếu T' -> epsilon, thì FOLLOW(F) chứa FOLLOW(T').
Từ luật T'- >*FT’, FOLLOW(F) chứa FIRST(T'). FIRST(T') = {*, epsilon}. Vậy FOLLOW(F) chứa {*}. Nếu T' -> epsilon, thì FOLLOW(F) chứa FOLLOW(T').
Xét FOLLOW(T'):
Từ luật E -> TE', FOLLOW(T) chứa FIRST(E'). FIRST(E') = {+, epsilon}. Vậy FOLLOW(T) chứa {+}. Nếu E' -> epsilon, thì FOLLOW(T) chứa FOLLOW(E').
Từ luật E' -> +TE', FOLLOW(E') chứa FOLLOW(E). FOLLOW(E) = {)}. Vậy FOLLOW(E') chứa {)}.
Vậy FOLLOW(T) chứa {+, )}.
Từ T -> FT', FOLLOW(T') chứa FOLLOW(T). Vậy FOLLOW(T') chứa {+, )}. Do đó FOLLOW(F) cũng chứa {+, )}.
Kết hợp lại, FOLLOW(F) = {*, +, )}. Thêm ký tự kết thúc chuỗi (dollar) thì không đúng vì F không nằm ở cuối chuỗi bắt đầu (start symbol).
Vậy đáp án đúng là {*, +, )}.