Bu kesin örnek, taslak C99 standardında ( C11'de aynı ayrıntılar ) bölüm 6.4 Sözcüksel öğeler paragraf 4'te şu şekilde anlatılmaktadır:
Girdi akışı, belirli bir karaktere kadar ön işlem belirteçlerine ayrıştırılmışsa, bir sonraki ön işlem simgesi, bir ön işleme belirteci oluşturabilecek en uzun karakter dizisidir. [...]
Sözlük analizinde belirsizliklerden kaçınmak için kullanılan maksimum munch kuralı olarak da bilinen ve geçerli bir simge oluşturmak için olabildiğince çok öğe alarak çalışır.
paragrafta ayrıca iki örnek vardır, ikincisi sizin sorunuz için tam olarak eşleşir ve aşağıdaki gibidir:
ÖRNEK 2 x +++++ y program parçası, x ++ ++ + y olarak ayrıştırılır ve bu, x ++ + ++ y ayrıştırması doğru bir ifade verebilse bile, artırma işleçlerindeki bir kısıtlamayı ihlal eder.
bize şunu söyler:
a+++++b
şu şekilde ayrıştırılacak:
a ++ ++ + b
Bu, ilk art artışının sonucu bir değer olduğundan ve artım bir l değeri gerektirdiğinden, artım sonrası kısıtlamaları ihlal eder. Bu, ( vurgu benim ) yazan 6.5.2.4
Postfix artırma ve azaltma operatörleri bölümünde ele alınmıştır :
Sonek artırma veya azaltma operatörünün işleneni, nitelenmiş veya nitelenmemiş gerçek veya imleç tipine sahip olacak ve değiştirilebilir bir ldeğer olacaktır.
ve
Postfix ++ operatörünün sonucu, işlenenin değeridir.
C ++ Gotchas kitabı da Gotcha #17
Maximal Munch Problems'de bu durumu ele alır, C ++ ' da da aynı problemdir ve ayrıca bazı örnekler verir. Aşağıdaki karakter kümesiyle uğraşırken şunu açıklıyor:
->*
sözcük analizcisi şu üç şeyden birini yapabilir:
- Üç belirteçleri olarak tedavi:
-
, >
ve*
- Bunu iki simge olarak ele alın:
->
ve*
- Tek bir simge olarak ele alın:
->*
Maksimal Munch kuralı bu belirsizliklerden kaçınmak için izin verir. Yazar buna işaret ediyor ( C ++ bağlamında ):
neden olduğundan çok daha fazla sorunu çözer, ancak iki yaygın durumda bu bir rahatsızlıktır.
İlk örnek, şablon argümanları aynı zamanda şablon olan ( C ++ 11'de çözülen) şablonlardır , örneğin:
list<vector<string>> lovos;
^^
Kapanış açısı parantezlerini kaydırma operatörü olarak yorumlayan ve bu nedenle belirsizliği gidermek için bir boşluk gerekli:
list< vector<string> > lovos;
^
İkinci durum, işaretçiler için varsayılan argümanları içerir, örneğin:
void process( const char *= 0 );
^^
*=
atama operatörü olarak yorumlanacaktır , bu durumda çözüm, bildirimdeki parametreleri adlandırmaktır.