JavaScript is required

Cho văn phạm với các luật sinh: S->AS, S->b, A->SA, A->a Kí hiệu I0 là tập mục đầu tiên của văn phạm, phép toán Goto(I0,A) =?

A.

{S’->S, A->.a}

B.

{A->S.A, S->.b}

C.

{S->A.S, S->.b}

D.

{ S->.b , A->.a}

Trả lời:

Đáp án đúng: C


Để tìm Goto(I0, A), ta cần xác định I0 trước. I0 là closure của {S' -> .S}, với S' là ký hiệu bắt đầu mở rộng. Từ S, ta có các luật sinh S -> AS và S -> b. Do đó, I0 = {S' -> .S, S -> .AS, S -> .b}. Bây giờ, ta tính Goto(I0, A). Ta tìm các mục trong I0 có dạng X -> .AY, sau đó dịch dấu chấm qua A và tính closure của tập hợp các mục mới này. Trong I0, ta có S -> .AS. Dịch dấu chấm qua A, ta được S -> A.S. Sau đó, ta tính closure của {S -> A.S}. Từ S, ta có các luật sinh S -> AS và S -> b. Do đó, closure({S -> A.S}) = {S -> A.S, S -> .AS, S -> .b}. So sánh với các đáp án, ta thấy đáp án C phù hợp nhất: {S -> A.S, S -> .b}. Đáp án B sai vì nó có A -> S.A, nhưng luật sinh này không xuất phát từ việc dịch dấu chấm qua A từ bất kỳ mục nào trong I0. Đáp án A và D không liên quan đến việc tính Goto(I0, A).

Câu hỏi liên quan