JavaScript is required

Cho văn phạm gồm các luật sinh: S → A; A → BC hoặc A-> DBC; B → bBʼ hoặc B-> epsilon; B’→ bB’ hoặc B’- > epsilon; C → c hoặc C-> epsilon; D → a hoặc D-> d, FIRST(A) =?

A.

A. { a, epsilon }

B.

B. { a, b, epsilon }

C.

C. { a, b, c, epsilon }

D.

D. { a, b, c, d, epsilon }

Trả lời:

Đáp án đúng: D


Để tìm FIRST(A), ta cần xem xét các luật sinh của A:

A → BC

A → DBC

FIRST(A) sẽ bao gồm FIRST(BC) và FIRST(DBC).

FIRST(BC) = FIRST(B). Vì B → bB' | epsilon, nên FIRST(B) = {b, epsilon}.

FIRST(DBC) = FIRST(D). Vì D → a | d, nên FIRST(D) = {a, d}.

Vậy, FIRST(A) = FIRST(BC) ∪ FIRST(DBC) = {b, epsilon} ∪ {a, d} = {a, b, d, epsilon}.

Tuy nhiên, do C → c | epsilon nên nếu B và D đều dẫn đến epsilon thì C sẽ được xét. Vì có B → epsilon và C → c | epsilon nên c có thể thuộc FIRST(A). Nhưng vì không có trường hợp B và D cùng dẫn đến epsilon trong các luật sinh, ta cần xem xét các trường hợp cụ thể hơn.

Nếu A → BC, và B → epsilon, thì FIRST(C) được thêm vào FIRST(A). Vì C → c | epsilon, FIRST(C) = {c, epsilon}. Vậy {c} có thể thuộc FIRST(A).

Nếu A → DBC, và D → a | d, thì FIRST(D) = {a, d}.

Như vậy, FIRST(A) = {a, b, c, d, epsilon}.

Câu hỏi liên quan