Contoh persis ini tercakup dalam draf standar C99 ( detail yang sama di C11 ) bagian 6.4 Elemen leksikal paragraf 4 yang berbunyi:
Jika aliran masukan telah diurai menjadi token praproses hingga karakter tertentu, token praproses berikutnya adalah urutan karakter terpanjang yang dapat membentuk token praproses. [...]
yang juga dikenal sebagai aturan munch maksimal yang digunakan dalam analisis leksikal untuk menghindari ambiguitas dan bekerja dengan mengambil sebanyak mungkin elemen untuk membentuk token yang valid.
Paragraf ini juga memiliki dua contoh, yang kedua adalah pencocokan tepat untuk pertanyaan Anda dan adalah sebagai berikut:
CONTOH 2 Fragmen program x +++++ y diurai sebagai x ++ ++ + y, yang melanggar batasan pada operator increment, meskipun parse x ++ + ++ y mungkin menghasilkan ekspresi yang benar.
yang memberitahu kita bahwa:
a+++++b
akan diuraikan sebagai:
a ++ ++ + b
yang melanggar batasan kenaikan posting karena hasil kenaikan posting pertama adalah nilai r dan kenaikan posting membutuhkan nilai l. Ini tercakup dalam bagian 6.5.2.4
operator kenaikan dan penurunan Postfix yang mengatakan ( penekanan milik saya ):
Operand operator kenaikan atau penurunan postfix harus memiliki tipe penunjuk atau penunjuk yang memenuhi syarat atau tidak memenuhi syarat dan harus menjadi nilai l yang dapat dimodifikasi.
dan
Hasil dari operator postfix ++ adalah nilai operannya.
Buku C ++ Gotchas juga membahas kasus ini di Gotcha #17
Maximal Munch Problems , masalah yang sama di C ++ juga dan juga memberikan beberapa contoh. Ini menjelaskan bahwa ketika berhadapan dengan kumpulan karakter berikut:
->*
penganalisis leksikal dapat melakukan salah satu dari tiga hal berikut:
- Memperlakukannya sebagai tiga token:
-
, >
dan*
- Perlakukan itu sebagai dua token:
->
dan*
- Perlakukan itu sebagai satu token:
->*
Aturan makan maksimal memungkinkannya menghindari ambiguitas ini. Penulis menunjukkan bahwa itu ( dalam konteks C ++ ):
memecahkan lebih banyak masalah daripada yang ditimbulkannya, tetapi dalam dua situasi umum, ini mengganggu.
Contoh pertama adalah templat yang argumen templatnya juga templat ( yang diselesaikan dalam C ++ 11 ), misalnya:
list<vector<string>> lovos;
^^
Yang mengartikan tanda kurung sudut penutup sebagai operator shift , dan oleh karena itu diperlukan ruang untuk menghilangkan ambiguitas:
list< vector<string> > lovos;
^
Kasus kedua melibatkan argumen default untuk pointer, misalnya:
void process( const char *= 0 );
^^
akan diartikan sebagai *=
operator penugasan, solusi dalam hal ini adalah memberi nama parameter dalam deklarasi.