यह सटीक उदाहरण मसौदा C99 मानक ( C11 में एक ही विवरण ) खंड 6.4 लेक्सिकल एलिमेंट्स पैराग्राफ 4 में शामिल किया गया है जो कहता है:
यदि इनपुट स्ट्रीम को किसी दिए गए वर्ण तक प्रीप्रोसेसिंग टोकन में पार्स किया गया है, तो अगला प्रीप्रोसेसिंग टोकन वर्णों का सबसे लंबा अनुक्रम है जो प्रीप्रोसेसिंग टोकन का गठन कर सकता है। [...]
जिसे मैक्सिमल मंक नियम के रूप में भी जाना जाता है, जो कि अस्पष्ट विश्लेषण से बचने के लिए शाब्दिक विश्लेषण में उपयोग किया जाता है और एक वैध टोकन बनाने के लिए अधिक से अधिक तत्वों को ले कर काम करता है।
पैराग्राफ के दो उदाहरण भी हैं, दूसरा प्रश्न के लिए एक सटीक मिलान है और निम्नानुसार है:
उदाहरण 2 कार्यक्रम का टुकड़ा x +++++ y को x ++ ++ + y के रूप में पार्स किया गया है, जो वेतन वृद्धि x + +++ y के लिए एक बाधा पैदा करता है, भले ही पार्स x +++ ++ y एक सही अभिव्यक्ति दे।
जो हमें बताता है कि:
a+++++b
के रूप में पार्स किया जाएगा:
a ++ ++ + b
जो पहले पद वृद्धि के परिणाम के बाद से पोस्ट वेतन वृद्धि पर बाधाओं का उल्लंघन करता है और पोस्ट वेतन वृद्धि के लिए एक अंतराल की आवश्यकता होती है। यह खंड 6.5.2.4
पोस्टफ़िक्स इन्क्रीमेंट और डिक्रीमेंट ऑपरेटरों में शामिल है जो कहते हैं ( जोर मेरा ):
पोस्टफिक्स इन्क्रीमेंट या डिक्रीमेंट ऑपरेटर के ऑपरेटर के पास योग्य या अयोग्य वास्तविक या पॉइंटर प्रकार होगा और एक परिवर्तनीय अंतराल होगा।
तथा
पोस्टफ़िक्स ++ ऑपरेटर का परिणाम ऑपरेंड का मूल्य है।
पुस्तक C ++ गोत्च्स भी इस मामले को Gotcha #17
Maximal Munch Problems में शामिल करती है, C ++ में भी यही समस्या है और यह इसके उदाहरण भी देता है। यह बताता है कि वर्णों के निम्नलिखित सेट से निपटने पर:
->*
शाब्दिक विश्लेषक तीन चीजों में से एक कर सकता है:
- तीन टोकन के रूप में यह इलाज:
-
, >
और*
- इसे दो टोकन मानें:
->
और*
- इसे एक टोकन मानें:
->*
अधिक से अधिक मंच नियम यह इन अस्पष्टता से बचने के लिए अनुमति देता है। लेखक बताते हैं कि यह ( C ++ संदर्भ में ):
कई और समस्याओं का कारण बनता है, लेकिन दो सामान्य स्थितियों में, यह एक झुंझलाहट है।
पहला उदाहरण वे टेम्पलेट होंगे जिनके टेम्प्लेट तर्क भी टेम्प्लेट हैं ( जो C ++ 11 में हल किया गया था ), उदाहरण के लिए:
list<vector<string>> lovos; // error!
^^
जो शिफ्ट ऑपरेटर के रूप में समापन कोण कोष्ठक की व्याख्या करता है , और इसलिए स्थान की आवश्यकता होती है:
list< vector<string> > lovos;
^
दूसरे मामले में संकेत के लिए डिफ़ॉल्ट तर्क शामिल हैं, उदाहरण के लिए:
void process( const char *= 0 ); // error!
^^
*=
असाइनमेंट ऑपरेटर के रूप में व्याख्या की जाएगी , इस मामले में समाधान घोषणा में मापदंडों का नाम है।