Saya pikir pertanyaannya berisi asumsi bahwa hanya batas yang paling baik.
Dalam kehidupan nyata itu cukup umum untuk hidup dengan tata bahasa yang ambigu, selama mereka tidak (sehingga untuk berbicara) terlalu ambigu.
Misalnya, jika Anda melihat-lihat tata bahasa yang dikompilasi dengan yacc (atau serupa, seperti bison atau byacc) Anda akan menemukan bahwa beberapa menghasilkan peringatan tentang "N shift / reduksi konflik" ketika Anda menyusunnya. Ketika Anda menemukan pergeseran / mengurangi konflik, itu menandakan ambiguitas dalam tata bahasa.
Pergeseran / pengurangan konflik, bagaimanapun, biasanya merupakan masalah yang cukup kecil. Generator parser akan menyelesaikan konflik demi "shift" daripada mengurangi. Tata bahasanya baik-baik saja jika itu yang Anda inginkan (dan tampaknya berhasil dengan baik dalam praktiknya).
Pergeseran / pengurangan konflik biasanya muncul dalam kasus pada pesanan umum ini (menggunakan tutup untuk non-terminal dan huruf kecil untuk terminal):
A -> B | c
B -> a | c
Ketika kita menjumpai a c
, ada ambiguitas: haruskah kita menguraikan c
secara langsung sebagai A
, atau haruskah kita menguraikannya sebagai B
, yang pada gilirannya adalah A
? Dalam kasus seperti ini, yacc dan semacamnya akan memilih rute yang lebih sederhana / lebih pendek, dan mem-parsing c
langsung sebagai rute, A
daripada memilih rute c
-> B
-> A
. Ini bisa salah, tetapi jika demikian, itu mungkin berarti Anda memiliki kesalahan tata bahasa yang sangat sederhana, dan Anda seharusnya tidak membiarkan c
opsi itu sama sekali memungkinkan A
.
Sebaliknya, kita dapat memiliki sesuatu yang lebih seperti ini:
A -> B | C
B -> a | c
C -> b | c
Sekarang ketika kita menghadapi a c
kita memiliki konflik antara apakah memperlakukan c
sebagai a B
atau a C
. Ada sedikit kemungkinan bahwa strategi resolusi konflik otomatis akan memilih apa yang benar-benar kita inginkan. Tak satu pun dari ini adalah "shift" - keduanya adalah "reduksi", jadi ini adalah "mengurangi / mengurangi konflik" (yang mereka terbiasa dengan yacc dan umumnya dikenal sebagai masalah yang jauh lebih besar daripada pergeseran / pengurangan konflik).
Jadi, meskipun saya tidak yakin saya akan mengatakan bahwa ada orang yang benar-benar menyambut ambiguitas dalam tata bahasa mereka, setidaknya dalam beberapa kasus itu cukup kecil sehingga tidak ada yang benar-benar peduli banyak tentang hal itu. Secara abstrak mereka mungkin menyukai gagasan untuk menghapus semua ambiguitas - tetapi tidak cukup untuk selalu benar-benar melakukannya. Misalnya, tata bahasa kecil dan sederhana yang berisi ambiguitas kecil dapat lebih disukai daripada tata bahasa yang lebih besar dan lebih kompleks yang menghilangkan ambiguitas (terutama ketika Anda masuk ke ranah praktis untuk benar-benar menghasilkan parser dari tata bahasa, dan menemukan bahwa tidak ambigu grammar menghasilkan parser yang tidak akan berjalan di mesin target Anda).