Văn phạm với các luật sinh: E → EAE; E-> (E); E-> +E; E-> id; A->- Có thể sinh ra chuỗi nhập nào?
A.
A. (id + id)
B.
B. +id+id+
C.
C. id*id- (id + id)
D.
D. +(id + id)
Trả lời:
Đáp án đúng: D
Phân tích các lựa chọn:
- A. (id + id): Không thể sinh ra vì 'A' chỉ có thể là '-'.
- B. +id+id+: Không thể sinh ra vì văn phạm chỉ cho phép '+E' chứ không cho phép '+id+'.
- C. id*id- (id + id): Không thể sinh ra vì văn phạm không có phép nhân '*'.
- D. +(id + id): Có thể sinh ra theo các bước sau:
E -> +E
E -> +(E)
E -> +(EAE)
E -> +(idAE)
E -> +(id-E)
E -> +(id-(E))
E -> +(id-(id))
Vì vậy, đáp án đúng là D.
Văn phạm mơ hồ (Ambiguous Grammar) là văn phạm mà trong đó có thể xây dựng nhiều hơn một cây phân tích cú pháp (parse tree) cho cùng một chuỗi nhập. Điều này gây khó khăn cho việc phân tích và biên dịch ngôn ngữ, vì không thể xác định duy nhất cấu trúc của câu lệnh.
Các lựa chọn khác:
- Văn phạm phi ngữ cảnh (Context-Free Grammar) là một loại văn phạm hình thức, không liên quan trực tiếp đến việc tạo ra nhiều cây phân tích cú pháp.
- Văn phạm LL(1) và LR(1) là các loại văn phạm cụ thể được thiết kế để có thể phân tích cú pháp một cách hiệu quả bằng các thuật toán LL(1) và LR(1) tương ứng. Các văn phạm này phải không mơ hồ.
Hàm Goto(I, X) được sử dụng trong xây dựng bảng phân tích cú pháp (parsing table) cho các bộ phân tích cú pháp (parser) như SLR(1), LALR(1), và LR(1). Trong đó, I là một tập hợp các mục LR(0) hoặc LR(1), và X là một ký hiệu văn phạm (grammar symbol), có thể là ký hiệu kết thúc (terminal) hoặc ký hiệu không kết thúc (non-terminal).
Hàm Goto(I, X) trả về bao đóng (closure) của tập hợp các mục [A → xX.y] sao cho [A → x.Xy] thuộc I. Điều này có nghĩa là, nó tìm kiếm tất cả các mục trong I mà có dạng [A → x.Xy], sau đó "đẩy" dấu chấm qua ký hiệu X để trở thành [A → xX.y], và cuối cùng tính bao đóng của tập hợp các mục mới này.
Như vậy, đáp án đúng là A. Các mục A → xX.y sao cho A → x.Xy thuộc I
Phân tích cú pháp từ trên xuống là quá trình xây dựng cây phân tích cú pháp bắt đầu từ nút gốc (ký hiệu bắt đầu) và sinh ra các nút con dần xuống lá (các token của chuỗi nhập). Kỹ thuật phân tích cú pháp đệ quy lùi (recursive descent parsing with backtracking) là một dạng tổng quát của phân tích từ trên xuống. Không có khái niệm "phân tích cú pháp đệ quy tiến". Do đó, phát biểu sai là D.
Định nghĩa FIRST(x) là tập hợp các ký hiệu kết thúc (terminal symbols) có thể xuất hiện đầu tiên trong các chuỗi dẫn xuất từ x. Do đó, đáp án A là chính xác nhất. Đáp án D đúng khi X là ký hiệu kết thúc. Các đáp án còn lại không chính xác theo định nghĩa FIRST(x).
Đáp án đúng là A.
Bộ phân tích cú pháp gạt-thu gọn (Shift-Reduce) hoạt động bằng cách xây dựng cây phân tích cú pháp từ dưới lên, bắt đầu từ các nút lá (terminal) và tiến dần đến nút gốc (non-terminal). Tại mỗi bước thu gọn (reduce), nó tìm một chuỗi con trong ngăn xếp (stack) khớp với vế phải của một luật sinh. Chuỗi con này sau đó được thay thế bằng ký hiệu ở vế trái của luật sinh đó.
Điều quan trọng là, nếu việc chọn chuỗi con để thu gọn được thực hiện đúng ở mỗi bước, bộ phân tích cú pháp sẽ xây dựng một dẫn xuất phải đảo ngược (reverse rightmost derivation). Điều này có nghĩa là nó tái tạo lại các bước dẫn xuất theo thứ tự ngược lại so với cách dẫn xuất phải thông thường hoạt động.
Các lựa chọn B, C và D sai vì chúng thay thế chuỗi con khớp với vế phải của một luật sinh bằng vế phải của luật sinh đó, điều này ngược lại với nguyên tắc hoạt động của bộ phân tích cú pháp gạt-thu gọn.