JavaScript is required

Cho văn phạm tăng cường gồm các luật sinh E’->E; E-> E+T ; E-> T; T- >T*F; T-> F; F- > (E) ; F-> id. Tập mục I0 là tập mục thứ nhất của văn phạm, Goto (I0, T) =?

A.

E ->.E + T; E ->.T; T ->.T * F; T ->.F; F ->. (E) ; F ->.id

B.

E’-> E .; E->E .+T

C.

E'->.E; E ->.E + T; E ->.T; T ->.T * F; T ->.F; F ->.id

D.

E->T.; T->T.*F

Trả lời:

Đáp án đúng: D


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 phương pháp phân tích LR (hoặc cụ thể hơn là SLR, CLR, LALR). Cụ thể, nó yêu cầu xác định tập mục (item set) sau khi thực hiện phép Goto từ tập mục ban đầu (I0) theo một ký hiệu văn phạm, ở đây là 'T'. Để giải quyết, ta cần: 1. **Xác định I0:** I0 là closure của {E' -> .E}. Closure(I0) sẽ bao gồm tất cả các luật sinh có E ở bên phải dấu '->', tức là: E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F F -> .(E) F -> .id 2. **Tính Goto(I0, T):** Phép Goto(I0, T) sẽ dịch dấu chấm '.' qua ký hiệu 'T' trong tất cả các mục có 'T' ngay sau dấu chấm, sau đó tính closure của tập các mục mới này. Từ I0, ta có hai mục có 'T' sau dấu chấm là: E -> .T và T -> .T * F. Do đó: - Từ E -> .T, ta có E -> T. - Từ T -> .T * F, ta có T -> T. * F Closure({E -> T., T -> T. * F}) sẽ là chính nó (vì không có luật sinh nào có E hoặc T ở bên phải dấu -> bắt đầu bằng ký tự không kết thúc). 3. **Đối chiếu kết quả:** So sánh kết quả tính toán với các phương án đáp án. Phân tích các đáp án: * **A:** Sai. Chứa nhiều mục không liên quan đến việc Goto(I0, T). * **B:** Sai. E' -> E . không phải là kết quả của Goto(I0,T). * **C:** Sai. Tương tự A, chứa nhiều mục không liên quan. * **D:** Đúng. Đáp án này chứa chính xác các mục thu được sau phép Goto(I0, T) và closure của nó: E -> T. và T -> T. * F Vậy, đáp án đúng là D.

Câu hỏi liên quan