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 mục 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 kiểm tra kiến thức về việc xây dựng tập các mục (items) trong phân tích cú pháp LR (Left-to-right Rightmost derivation). Cụ thể, nó yêu cầu xác định kết quả của hàm `Goto(I, +)` khi `I` là một tập mục và `+` là một ký hiệu đầu vào.
* **Phân tích:** Hàm `Goto(I, X)` tính tập các mục mới bằng cách dịch chuyển dấu chấm (`.`) qua ký hiệu `X` trong tất cả các mục của tập `I` mà có `X` đứng sau dấu chấm. Sau đó, nó thực hiện phép bao đóng (closure) trên tập các mục mới này để thêm vào tất cả các mục có thể được suy dẫn từ các biến chưa được xử lý (các biến đứng sau dấu chấm).
Trong trường hợp này, `I = { E' -> E.; E -> E. + T }` và `X = +`. Khi ta thực hiện `Goto(I, +)`, ta chỉ quan tâm đến các mục trong `I` mà có `+` đứng sau dấu chấm, đó là `E -> E. + T`. Dịch chuyển dấu chấm qua `+`, ta được `E -> E + .T`.
Tiếp theo, ta cần thực hiện phép bao đóng trên `T`. Điều này có nghĩa là ta cần thêm vào tất cả các luật sinh có `T` ở vế trái: `T -> .T * F` và `T -> .F`. Cuối cùng, ta cần thực hiện phép bao đóng trên `F`, thêm vào `F -> .€` và `F -> .id`
Kết hợp lại, `Goto(I, +) = { E -> E + .T; T -> .T * F; T -> .F; F -> .€; F -> .id }`
* **Đánh giá các phương án:**
* **A:** Sai. Tập mục này không phải là kết quả của `Goto(I, +)`.
* **B:** Sai. Tập mục này không phải là kết quả của `Goto(I, +)`.
* **C:** Đúng. Tập mục này chính xác là kết quả của `Goto(I, +)` như đã phân tích ở trên.
* **D:** Sai. Tập mục này không phải là kết quả của `Goto(I, +)`.
Vậy đáp án đúng là C.