Trước tiên, nếu bạn chưa có, bạn nên đọc bài báo của McPeak về GLR http://www.cs.berkeley.edu/~smcpeak/papers/elkhound_cc04.ps. Đây là một tài liệu học thuật, nhưng nó cung cấp các chi tiết tốt về GSS, GLR và các kỹ thuật được sử dụng để thực hiện chúng. Nó cũng giải thích một số vấn đề về lông với việc thực hiện một trình phân tích cú pháp GLR.
Bạn có ba phần để triển khai ngăn xếp có cấu trúc biểu đồ.
I. Cấu trúc dữ liệu biểu đồ chính nó
II. Ngăn xếp
III. GLR sử dụng GSS
Bạn nói đúng, google không giúp được gì nhiều. Và trừ khi bạn thích đọc các sách thuật toán, chúng cũng sẽ không giúp được gì nhiều.
I. Cấu trúc dữ liệu biểu đồ
Câu trả lời của Rob về "trình bày trực tiếp" sẽ dễ triển khai nhất. Nó giống như một danh sách liên kết, ngoại trừ mỗi nút có danh sách các nút tiếp theo thay vì chỉ một nút.
Cấu trúc dữ liệu này là đồ thị được chỉ dẫn, nhưng như là trạng thái McPeak, GSS có thể có chu kỳ cho ngữ pháp epsilon.
II. Ngăn xếp
Ngăn xếp có cấu trúc biểu đồ chỉ là một danh sách các ngăn xếp thông thường. Đối với một ngữ pháp rõ ràng, bạn chỉ cần một ngăn xếp. Bạn cần nhiều ngăn xếp hơn khi có xung đột phân tích cú pháp để bạn có thể thực hiện cả hai hành động phân tích cú pháp cùng một lúc và duy trì trạng thái khác nhau mà cả hai hành động đều tạo. Sử dụng biểu đồ cho phép bạn tận dụng lợi thế của thực tế là các ngăn xếp chia sẻ các yếu tố này.
Có thể giúp hiểu cách triển khai một ngăn xếp đơn lẻ với danh sách được liên kết trước. Người đứng đầu danh sách được liên kết là đầu của ngăn xếp. Đẩy một phần tử vào ngăn xếp chỉ là tạo một cái đầu mới và chỉ nó vào đầu cũ. Popping một yếu tố ra khỏi ngăn xếp chỉ là di chuyển con trỏ đến đầu-> tiếp theo.
Trong GSS, nguyên tắc là như nhau. Đẩy một phần tử chỉ là tạo một nút đầu mới và trỏ nó đến đầu cũ. Nếu bạn có hai thao tác dịch chuyển, bạn sẽ đẩy hai phần tử lên đầu cũ và sau đó có hai nút đầu. Về mặt khái niệm, đây chỉ là hai ngăn xếp khác nhau xảy ra khi chia sẻ mọi phần tử ngoại trừ các yếu tố hàng đầu. Popping một phần tử chỉ di chuyển con trỏ đầu xuống ngăn xếp bằng cách làm theo từng nút tiếp theo.
III. GLR sử dụng GSS
Đây là nơi mà giấy của McPeak là một tài liệu hữu ích.
Thuật toán GLR tận dụng lợi thế của GSS bằng cách hợp nhất các đầu ngăn xếp có cùng phần tử trạng thái. Điều này có nghĩa là một phần tử trạng thái có thể có nhiều hơn một đứa trẻ. Khi giảm, thuật toán GLR sẽ phải khám phá tất cả các đường dẫn có thể có từ đầu ngăn xếp.
Bạn có thể tối ưu hóa GLR bằng cách duy trì độ sâu xác định của mỗi nút. Đây chỉ là khoảng cách từ sự phân chia trong ngăn xếp. Bằng cách này, bạn không phải luôn luôn tìm kiếm một ngăn xếp ngăn xếp.
Đây là một nhiệm vụ khó khăn! Vậy thì chúc may mắn!
Ở đây, sáu năm sau, dường như vẫn còn rất ít được tìm thấy trong cấu trúc dữ liệu GSS. Wikipedia có một "ví dụ" rất ngắn gọn, nhưng nó cũng không liệt kê các hoạt động, và tôi bị nhầm lẫn bởi nó, bởi vì nó dường như có tất cả các ngăn xếp "song song" ở cùng độ sâu. Ai đó có thể thêm thông tin về điều này? – LHP