पार्सिंग C ++ कठिन हो रही है। Parsing जावा बस के रूप में मुश्किल हो रहा है।
इस SO उत्तर पर चर्चा करें कि पार्स करने के लिए C (और C ++) "कठिन" क्यों है । संक्षिप्त सारांश यह है कि C और C ++ व्याकरण स्वाभाविक रूप से अस्पष्ट हैं; वे आपको कई पर्स देंगे और अस्पष्टता को हल करने के लिए आपको संदर्भ का उपयोग करना चाहिए । लोग तब आपको यह मानने की गलती करते हैं कि आपको अस्पष्टता को हल करना है जैसे कि आप पार्स करते हैं; ऐसा नहीं, नीचे देखें। यदि आप पार्स के रूप में अस्पष्टताओं को हल करने पर जोर देते हैं, तो आपका पार्सर अधिक जटिल हो जाता है और निर्माण के लिए बहुत कठिन होता है; लेकिन यह जटिलता एक स्व-सूजन वाला घाव है।
IIRC, जावा 1.4 का "स्पष्ट" LALR (1) व्याकरण अस्पष्ट नहीं था, इसलिए इसे पार्स करना "आसान" था। मुझे यकीन नहीं है कि आधुनिक जावा को कम से कम लंबी दूरी की स्थानीय अस्पष्टताएं नहीं मिली हैं; हमेशा यह तय करने की समस्या है कि क्या "... >>" दो टेम्पलेट बंद करता है या "सही शिफ्ट ऑपरेटर" है। मुझे संदेह है कि आधुनिक जावा अब एलएएलआर (1) के साथ पार्स नहीं करता है ।
लेकिन व्यक्ति दोनों भाषाओं के लिए मजबूत पार्सर (या कमजोर पार्सर और सी और सी ++ फ्रंट एंड के रूप में ज्यादातर अब करते हैं) के उपयोग से पार्सिंग समस्या को पा सकता है। C और C ++ में प्रीप्रोसेसर होने की अतिरिक्त जटिलता है; वे देखने में अभ्यास से अधिक जटिल हैं। एक दावा है कि C और C ++ पार्सर इतने कठिन हैं कि उन्हें हाथ से लिखना होगा। यह सच नहीं है; आप GLR पार्सर जनरेटर के साथ ठीक जावा और C ++ पार्सर का निर्माण कर सकते हैं।
लेकिन पार्सिंग वास्तव में समस्या नहीं है।
एक बार जब आप पार्स करते हैं, तो आप एएसटी / पार्स ट्री के साथ कुछ करना चाहेंगे। व्यवहार में, आपको यह जानना होगा कि हर पहचानकर्ता के लिए, उसकी परिभाषा क्या है और उसका उपयोग कहां किया जाता है ("नाम और प्रकार रिज़ॉल्यूशन", धीरे-धीरे, प्रतीक तालिकाओं का निर्माण)। यह पार्सर सही होने की तुलना में बहुत अधिक काम करता है, विरासत, इंटरफेस, ओवरलोडिंग और टेम्प्लेट द्वारा जटिल, और इस तथ्य से भ्रमित होता है कि यह सब के लिए शब्दार्थ दसियों से सैकड़ों पृष्ठों तक अनौपचारिक प्राकृतिक भाषा में लिखा गया है। भाषा मानक का। सी ++ यहां बहुत खराब है। जावा 7 और 8 इस दृष्टिकोण से बहुत भयानक हो रहे हैं। (और प्रतीक सारणी आप सभी की जरूरत नहीं हैं, "लाइफ आफ्टर पार्सिंग" पर एक लंबे निबंध के लिए मेरा बायो देखें)।
अधिकांश लोग शुद्ध पार्सिंग भाग के साथ संघर्ष करते हैं (अक्सर कभी खत्म नहीं होते हैं; तो कई के लिए खुद ही एसओ की जांच करें, असली लैंगगेज के लिए काम करने वाले पार्सर बनाने के बारे में कई सवाल), इसलिए वे पार्स करने के बाद कभी जीवन नहीं देखते हैं। और फिर हमें इस बारे में लोक प्रमेय मिलते हैं कि पार्स के लिए क्या मुश्किल है और उस चरण के बाद क्या होता है इसके बारे में कोई संकेत नहीं है।
फिक्सिंग C ++ सिंटैक्स आपको कहीं नहीं मिलेगा।
C ++ सिंटैक्स को बदलने के बारे में: आप पाएंगे कि किसी भी C ++ व्याकरण में स्थानीय और वास्तविक अस्पष्टताओं की विविधता का ध्यान रखने के लिए आपको बहुत सारे स्थानों को पैच करना होगा। यदि आप जोर देते हैं, तो निम्नलिखित सूची एक अच्छी शुरुआत हो सकती है । मेरा मानना है कि ऐसा करने का कोई मतलब नहीं है अगर आप सी ++ मानक समिति नहीं हैं; यदि आपने ऐसा किया है, और एक संकलक का उपयोग कर बनाया है, तो कोई भी समझदार इसका उपयोग नहीं करेगा। पार्सर्स बनाने वाले लोगों की सुविधा के लिए मौजूदा C ++ एप्लिकेशन में बहुत अधिक निवेश किया गया है; इसके अलावा, उनका दर्द खत्म हो गया है और मौजूदा पार्सर ठीक काम करते हैं।
आप अपने खुद के पार्सर लिखना चाह सकते हैं। हॉ, वह ठीक है; बस बाकी समुदाय से यह उम्मीद न करें कि आप जिस भाषा का उपयोग करना चाहते हैं उसे बदलने के लिए वे आपको इसे आसान बनाने दें। वे सभी चाहते हैं कि यह उनके लिए आसान हो, और वह भाषा का उपयोग दस्तावेज और कार्यान्वित के रूप में करे।