Tôi nghĩ rằng câu hỏi chứa một giả định rằng chỉ có đường biên chính xác là tốt nhất.
Trong cuộc sống thực, việc sống với những ngữ pháp mơ hồ là điều khá phổ biến, miễn là chúng không (có thể nói) quá mơ hồ.
Ví dụ: nếu bạn nhìn xung quanh các ngữ pháp được biên dịch bằng yacc (hoặc tương tự, chẳng hạn như bison hoặc byacc), bạn sẽ thấy rằng có khá nhiều cảnh báo về "xung đột N / dịch chuyển" khi bạn biên dịch chúng. Khi yacc gặp phải sự thay đổi / giảm xung đột, điều đó báo hiệu sự mơ hồ trong ngữ pháp.
Tuy nhiên, một sự thay đổi / giảm xung đột thường là một vấn đề khá nhỏ. Trình tạo trình phân tích cú pháp sẽ giải quyết xung đột theo hướng "thay đổi" thay vì giảm. Ngữ pháp là hoàn toàn tốt nếu đó là những gì bạn muốn (và nó dường như hoạt động hoàn toàn tốt trong thực tế).
Xung đột thay đổi / giảm thường phát sinh trong một trường hợp theo thứ tự chung này (sử dụng mũ cho các thiết bị không đầu cuối và chữ thường cho thiết bị đầu cuối):
A -> B | c
B -> a | c
Khi chúng ta gặp phải một c
, có một sự mơ hồ: chúng ta nên phân tích c
trực tiếp như một A
, hay chúng ta nên phân tích nó như một B
, mà đến lượt nó là một A
? Trong trường hợp như thế này, yacc và như vậy sẽ chọn tuyến đường đơn giản / ngắn hơn và phân tích cú pháp c
trực tiếp dưới dạng A
, thay vì đi tuyến đường c
-> B
-> A
. Điều này có thể sai, nhưng nếu vậy, điều đó có thể có nghĩa là bạn có một lỗi thực sự đơn giản trong ngữ pháp của bạn và bạn không nên cho phép c
tùy chọn như một khả năng cho A
tất cả.
Bây giờ, ngược lại, chúng ta có thể có một cái gì đó giống như thế này:
A -> B | C
B -> a | c
C -> b | c
Bây giờ khi chúng ta gặp phải một c
mâu thuẫn giữa việc nên coi c
là a B
hay a C
. Có rất ít cơ hội rằng một chiến lược giải quyết xung đột tự động sẽ chọn những gì chúng ta thực sự muốn. Cả hai điều này đều không phải là "sự thay đổi" - cả hai đều là "sự giảm bớt", vì vậy đây là "sự giảm / giảm xung đột" (mà những người quen với yacc và thường nhận ra đó là một vấn đề lớn hơn nhiều so với sự thay đổi / giảm xung đột).
Vì vậy, mặc dù tôi không chắc là tôi đã đi quá xa để nói rằng bất kỳ ai thực sự hoan nghênh sự mơ hồ trong ngữ pháp của họ, trong ít nhất một số trường hợp, nó đủ nhỏ để không ai thực sự quan tâm nhiều về nó. Trong bản tóm tắt, họ có thể thích ý tưởng loại bỏ tất cả sự mơ hồ - nhưng không đủ để luôn thực sự làm điều đó. Ví dụ, một ngữ pháp nhỏ, đơn giản chứa một sự mơ hồ nhỏ có thể thích hợp hơn với một ngữ pháp lớn hơn, phức tạp hơn để loại bỏ sự mơ hồ (đặc biệt là khi bạn đi vào cõi thực tế của việc tạo ra một trình phân tích cú pháp từ ngữ pháp và thấy rằng không rõ ràng ngữ pháp tạo ra một trình phân tích cú pháp sẽ không chạy trên máy mục tiêu của bạn).