JavaScript is required

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)=?

A.

{ (, id }

B.

{*, +, ), dollar }.

C.

{ *,+,id, epsilon }

D.

{ id, dollar }

Trả lời:

Đáp án đúng: B


Để tìm FOLLOW(F), ta cần xem xét các luật sinh có F ở vế phải:

  1. T -> FT'
  2. T' -> *FT'
  3. F -> (E)
  4. 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à {*, +, )}.

Câu hỏi liên quan