एक लोक-प्रमेय है जो कहता है कि सी को पार्स करना मुश्किल है, और सी ++ अनिवार्य रूप से असंभव है।
यह सच नहीं है।
यह सच है कि पार्सिंग मशीनरी को हैक किए बिना प्रतीक तालिका डेटा में एलएएलआर (1) पार्सर का उपयोग करके सी और सी ++ को पार्स करना बहुत कठिन है। जीसीसी वास्तव में उन्हें YACC और इस तरह के अतिरिक्त हैकरी का उपयोग करके पार्स करता था, और हाँ यह बदसूरत था। अब जीसीसी हस्तलिखित पार्सर का उपयोग करता है, लेकिन फिर भी प्रतीक तालिका हैकरी के साथ। क्लैंग लोगों ने कभी भी स्वचालित पार्सर जनरेटर का उपयोग करने की कोशिश नहीं की; AFAIK द क्लैंग पार्सर हमेशा हैंड-कोडेड रिकर्सिव डीसेंट रहा है।
यह सच है, यह है कि C और C ++ अपेक्षाकृत स्वचालित रूप से उत्पन्न पार्सर, उदाहरण के लिए, GLR पार्सर के साथ पार्स करना आसान है , और आपको किसी भी हैक की आवश्यकता नहीं है। एल्सा सी ++ पार्सर इस का एक उदाहरण है। हमारा सी ++ फ्रंट एंड एक और है (जैसा कि हमारे सभी "कंपाइलर" फ्रंट एंड हैं, जीएलआर बहुत बढ़िया पार्सिंग तकनीक है)।
हमारा C ++ फ्रंट एंड GCC's जितना तेज़ नहीं है, और एल्सा की तुलना में निश्चित रूप से धीमा है; हमने इसे ध्यान से ट्यूनिंग करने में बहुत कम ऊर्जा लगाई है क्योंकि हमारे पास अन्य अधिक दबाव वाले मुद्दे हैं (फिर भी इसका उपयोग C ++ की लाखों लाइनों पर किया गया है)। एल्सा की संभावना जीसीसी की तुलना में धीमी है क्योंकि यह अधिक सामान्य है। इन दिनों प्रोसेसर की गति को देखते हुए, ये अंतर बहुत अधिक व्यवहार में नहीं आ सकते हैं।
लेकिन "वास्तविक संकलक" जो आज व्यापक रूप से वितरित हैं, उनकी जड़ें 10 या 20 साल पहले या उससे अधिक के संकलक में हैं। अक्षमताओं ने तब बहुत अधिक मायने रखा, और किसी ने जीएलआर पार्सर्स के बारे में नहीं सुना था, इसलिए लोगों ने वही किया जो वे जानते थे कि कैसे करना है। क्लैंग निश्चित रूप से हाल ही में अधिक है, लेकिन फिर लोक प्रमेय लंबे समय तक अपनी "दृढ़ता" बनाए रखते हैं।
आप इसे अब और नहीं करना है। कंपाइल मेंटेनेंस में सुधार के साथ आप जीएलआर और अन्य ऐसे पार्सर्स का उपयोग बहुत ही कम कर सकते हैं।
क्या है सच है, कि एक व्याकरण है कि आपके अनुकूल पड़ोस संकलक के व्यवहार से मेल खाता हो रही मुश्किल है। वस्तुतः सभी C ++ कंपाइलर मूल मानक के (अधिकांश) को लागू करते हैं, उनके पास बहुत सारे डार्क कॉर्नर एक्सटेंशन होते हैं, उदाहरण के लिए, MS कंपाइलर्स में DLL विनिर्देश आदि, यदि आपके पास एक मजबूत पार्सिंग इंजन है, तो आप अपना समय प्राप्त करने की कोशिश कर सकते हैं। अपने व्याकरण जनरेटर की सीमाओं से मेल खाने के लिए अपने व्याकरण को मोड़ने की कोशिश करने के बजाय वास्तविकता से मेल करने के लिए अंतिम व्याकरण।
EDIT नवंबर 2012: इस उत्तर को लिखने के बाद से, हमने पूर्ण सी ++ 11 को संभालने के लिए हमारे सी ++ फ्रंट एंड में सुधार किया है, जिसमें एएनएसआई, जीएनयू, और एमएस वेरिएंट बोलियां शामिल हैं। जबकि अतिरिक्त सामान बहुत था, हमें अपने पार्सिंग इंजन को बदलना नहीं है; हमने सिर्फ व्याकरण के नियमों को संशोधित किया है। हम था अर्थगत विश्लेषण बदलना होगा; C ++ 11 शब्दार्थ रूप से बहुत जटिल है, और यह कार्य पार्सर को चलाने के लिए प्रयास को पूरा करता है।
EDIT फरवरी 2015: ... अब पूर्ण C ++ 14 को संभालता है। ( एक साधारण बिट कोड के GLR पार्स के लिए c ++ कोड से मानव पठनीय एएसटी प्राप्त करें , और C ++ का कुख्यात "सबसे डरावने पार्स")।
EDIT अप्रैल 2017: अब हैंडल (ड्राफ्ट) C ++ 17।