Một ngữ pháp thường được định nghĩa là ngữ pháp Không ngữ cảnh - một định nghĩa chính xác được đưa ra trên trang Wikipedia, nhưng nó hoạt động giống như trong PLY, dựa trên Bison , lần lượt dựa trên yacc .
Ở đây nói rằng PLY sử dụng trình phân tích cú pháp LALR . Đây thực chất là một trình phân tích cú pháp LR , trong đó các bảng tra cứu được cô đọng, có thể đưa ra các xung đột phân tích cú pháp, làm giảm một số biểu cảm của ngữ pháp LR (nghĩa là một ngữ pháp không ngữ cảnh mà trình phân tích cú pháp LR có thể phân tích cú pháp). Nếu bạn muốn biết về những hạn chế của nhánh trình phân tích cú pháp cụ thể này và những hạn chế của các trình phân tích cú pháp khác, tổng quan về tất cả các loại kỹ thuật phân tích cú pháp (LL, LR và các loại khác) được đưa ra ở đây .
Để trả lời câu hỏi của bạn: tồn tại các thuật toán phân tích cú pháp có khả năng phân tích bất kỳ ngôn ngữ không ngữ cảnh nào, ngay cả khi ngôn ngữ không rõ ràng (nghĩa là có nhiều hơn một cách để diễn giải đầu vào):
Thuật toán đầu tiên như vậy là thuật toán CYK , không may có thời gian chạy là , trong đó n là độ dài của chuỗi đầu vào và | G | là kích thước của ngữ pháp và do đó không thực tế để phân tích ngôn ngữ.Ô ( n3| G | )n| G |
Thuật toán thứ hai là thuật toán Earley . Thuật toán này cũng có khả năng phân tích cú pháp ngữ pháp miễn phí. Mặc dù thuật toán cần thời gian để phân tích một ngôn ngữ mơ hồ, nhưng nó chỉ cần thời gian O ( n 2 ) để phân tích một ngôn ngữ không rõ ràng. Ngoài ra, nó rõ ràng hoạt động trong thời gian tuyến tính đối với hầu hết các ngữ pháp LR và hoạt động đặc biệt tốt đối với các ngữ pháp đệ quy trái.Ô ( n3)Ô ( n2)
Ở đây bạn có thể tìm thấy một bài báo thảo luận về việc triển khai thực tế (một sự thích ứng) của thuật toán Earley. Họ kết luận: "Với tính tổng quát của phân tích Earley so với phân tích cú pháp LALR (1) ((gần như là những gì PLY làm)), và xem xét rằng ngay cả PEP ((thực hiện thuật toán Earley của họ)) thời gian tồi tệ nhất sẽ không được chú ý bởi người dùng, đây là một kết quả tuyệt vời ".
Loại trình phân tích cú pháp cuối cùng là trình phân tích cú pháp GLR . Đây là phiên bản tổng quát của phân tích cú pháp LR, có khả năng phân tích cú pháp bất kỳ ngôn ngữ không ngữ cảnh nào.
Một triển khai GLR hoàn thiện là ASF + SDF . Bison cũng có thể tạo trình phân tích cú pháp GLR, mặc dù việc triển khai của nó hơi khác so với thuật toán GLR 'tiêu chuẩn'. Các Elkhound Thuật toán là một thuật toán lai GLR / LALR. Nó sử dụng LALR khi có thể và GLR khi cần, để vừa nhanh và có khả năng phân tích cú pháp bất kỳ ngữ pháp nào.
Ngoài ngữ pháp miễn phí ngữ cảnh còn có ngữ pháp nhạy cảm ngữ cảnh , nhưng nói chung chúng khó phân tích và không thêm nhiều tính biểu cảm: bạn có thể làm nhiều hơn với chúng, nhưng đối với hầu hết các ứng dụng, việc sử dụng thêm không liên quan, trừ khi bạn phân tích cú pháp một ngôn ngữ tự nhiên.
Là bước cuối cùng có ngữ pháp không hạn chế . Tại thời điểm này, ngữ pháp đã hoàn tất, vì vậy không có ràng buộc nào có thể đưa ra về việc mất bao lâu để phân tích một ngôn ngữ cụ thể, điều không mong muốn đối với hầu hết các ứng dụng phân tích cú pháp. Sức mạnh thêm là gần như không bao giờ cần thiết. Nếu bạn muốn sử dụng tất cả sức mạnh đó, có sẵn máy ngôn ngữ .
Cuối cùng, việc thực hiện trình tạo trình phân tích cú pháp của riêng bạn không phải là chuyện nhỏ, đặc biệt là làm cho nó trở nên nhanh chóng. Cá nhân tôi vừa hoàn thành việc tạo phiên bản flex của riêng mình (trình tạo lexer) và trong khi điều này có vẻ như là một bài tập trong các vấn đề thuật toán tương đối đơn giản, đặc biệt là khi tôi cố gắng hỗ trợ Unicode. Cân nhắc sử dụng một triển khai đã có sẵn thay vì viết của riêng bạn.