Cho văn phạm ang cường gồm các luật sinh E’->E; E-> E+T ; E-> T; T- >T*F; T-> F; F- > € ; F-> id. Nếu I là tập bao đóng của văn phạm và I = { E’->E.; E-> E .+T} Goto (I, +) =?
Trả lời:
Đáp án đúng: C
Câu hỏi này liên quan đến việc xây dựng bảng phân tích cú pháp (parsing table) cho một văn phạm bằng cách sử dụng kỹ thuật phân tích LR (hoặc cụ thể hơn là SLR, CLR, LALR). Cụ thể, nó kiểm tra kiến thức về hàm `GOTO` trong thuật toán xây dựng tập các mục LR(0) và cách tính bao đóng (closure) của một tập các mục LR(0).
Chúng ta có tập các mục `I = { E' -> E.; E -> E. + T }`. Hàm `GOTO(I, +)` có nghĩa là chúng ta xét tất cả các mục trong `I` mà dấu chấm nằm trước ký hiệu '+', sau đó dịch chuyển dấu chấm qua ký hiệu '+' và tính bao đóng của tập các mục mới này.
Trong `I`, chỉ có mục `E -> E. + T` thỏa mãn điều kiện trên. Khi dịch chuyển dấu chấm qua '+', ta được `E -> E + .T`.
Bây giờ, chúng ta cần tính bao đóng của `{E -> E + .T}`. Bao đóng bao gồm việc thêm tất cả các luật sinh có `T` ở vế trái (bên trái mũi tên) và dấu chấm ở đầu vế phải. Các luật sinh đó là `T -> .T * F`, `T -> .F`.
Tiếp theo, chúng ta cần tính bao đóng của các luật sinh mới thêm vào. Ta thấy `F` ở vế trái của `T -> .F`, vì vậy ta thêm các luật sinh có `F` ở vế trái và dấu chấm ở đầu vế phải: `F -> .€` và `F -> .id`.
Vậy, `GOTO(I, +)` sẽ là tập hợp các mục sau: `{ E -> E + .T; T -> .T * F; T -> .F; F -> .€; F -> .id }`.
So sánh với các đáp án, ta thấy đáp án C phù hợp nhất.