Nhanh chóng tìm thấy chuỗi rỗng tạo ra các số không trong CFG


8

Đối với một bối cảnh cụ ngôn ngữ miễn phí G, chúng ta gọi là không thuộc đầu cuối nullable nếu A i * ε , tức là chúng ta có thể lấy được các chuỗi rỗng từ A i sau khi áp dụng một số hữu hạn các tác phẩm.MộtTôi MộtTôi*εAi

Có một thuật toán đơn giản để xác định các phần tử ngữ pháp nào là không thể tìm thấy ở đây :

Chúng tôi bắt đầu bằng cách xem xét tất cả các nonterminals là không thể rỗng. Chúng tôi đánh dấu tất cả như nullable nếu có một sản xuất A iε . Chúng tôi sau đó lặp qua tất cả các tác phẩm khác Một iB 1 B 2 ... B k trừ tác phẩm với một thiết bị đầu cuối trong họ, và đánh dấu A i như nullable nếu tất cả B i là nullable. Chúng tôi tiếp tục thực hiện vòng lặp này cho đến khi chúng tôi hoàn thành một vòng lặp mà không đánh dấu bất kỳ số phút nào là không thể.AiAiϵAiB1B2BkAiBi

Vấn đề của tôi với thuật toán này là nó có thời gian chạy : trường hợp xấu nhất là ví dụ A 1A 2 , A 2A 3 , A 3A 4 , ..., A n - 1Một n , A nε .O(n2)A1A2A2A3A3A4An1AnAnϵ

Có một thuật toán cho vấn đề này với thời gian chạy tốt hơn không?O(n2)


2
Nó không phải là cơ bản để thực hiện thuật toán đó trong thời gian tuyến tính? Đây có thể là một vấn đề bài tập về nhà?
Warren Schudy

Bạn có quan tâm đến một lớp ngữ pháp nhất định hoặc bạn muốn giải quyết các ngữ pháp tùy ý?
Raphael

1
Tôi quan tâm đến việc giải quyết các ngữ pháp tùy ý: Tôi đang triển khai một trình phân tích cú pháp Earley, điều này rất hữu ích để biết liệu một nonterminal có thể rút ra chuỗi rỗng hay không. Phản ứng ban đầu của tôi là điều này có thể giải quyết được trong thời gian tuyến tính, nhưng các ngữ pháp như ,MộtB vấn đề phức tạp. BMột
Alex ten Brink

Bạn có một lý do để giữ các quy tắc như vậy trong bất kỳ tình huống thực tế?
Raphael

1
Tôi đang triển khai trình phân tích cú pháp Earley theo cách được mô tả ở đây: webhome.cs.uvic.ca/~nigelh/Publications/ ,. Theo cách tiếp cận được thực hiện trong bài báo đó, tại một thời điểm nào đó, người ta cần tìm ra các số không có giá trị cho ngữ pháp: một khi chúng được biết, rất dễ dàng để điều chỉnh thuật toán Earley để xử lý các sản phẩm epsilon.
Alex ten Brink

Câu trả lời:


8

Không thể thực hiện thuật toán đó trong thời gian tuyến tính như sau? (Cảnh báo tôi không đọc bằng chứng quá cẩn thận, vì vậy rất có thể có lỗi.)

Trong phần tiếp theo bất cứ khi nào tôi nói "sản xuất" tôi có nghĩa là chỉ bao gồm những người không bao gồm thiết bị đầu cuối. Xây dựng một danh sách, đối với mỗi phi thiết bị đầu cuối, trong những sản phẩm xuất hiện trong. Đối với mỗi sản xuất để c i đếm có bao nhiêu khác biệt phi cảng ở phía bên tay phải đang đánh dấu không nullable. Đặt Q biểu thị một hàng đợi các thiết bị đầu cuối không được đánh dấu là null nhưng chưa được xử lý. Khởi tạo tất cả c i với số lượng thiết bị đầu cuối riêng biệt ở phía bên phải của sản xuất i . Khởi tạo tất cả các thiết bị đầu cuối để không nullable. Với mọi Z không đầu cuối được tạo bởi sản xuất i với c i =iciQciiZi thêm Z vào Q và đánh dấu Z là nullable.ci=0ZQZ

Trong khi không trống, hãy xóa một thiết bị đầu cuối X tùy ý khỏi Q và xử lý nó như sau. Với mỗi j sản xuất mà X đang ở, giảm c j . Nếu một c j trở thành 0, hãy kiểm tra xem liệu đầu cuối Y không tương ứng đã được đánh dấu là nullable chưa. Nếu không, đánh dấu Y nullable và thêmQXQjXcjcjYY để Q .YQ


Trừ khi tôi thiếu một cái gì đó tôi nghĩ rằng thuật toán của bạn sẽ hoạt động. Tôi chỉ thấy rất kỳ lạ là nếu tôi tìm kiếm trên internet một thuật toán cho vấn đề này, tôi nhận được hơn nửa tá lượt truy cập trên trang đầu tiên mô tả một số biến thể của thuật toán mà tôi đã mô tả trong bài đăng đầu tiên của mình - tại sao lại đưa ra thuật toán n bình phương nếu một thuật toán tuyến tính đơn giản tồn tại?
Alex ten Brink

Một lý do có khả năng đưa ra thuật toán bậc hai là nó thậm chí còn đơn giản hơn. Nếu bạn chỉ muốn cung cấp cho mọi người một sự hiểu biết về tính vô hiệu thì việc ẩn các chi tiết triển khai có ý nghĩa.
Warren Schudy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.