क्या जीसीसी और क्लैंग पार्सर वास्तव में हस्तलिखित हैं?


90

ऐसा लगता है कि जीसीसी और एलएलवीएम-क्लैंग हस्तलिखित पुनरावर्ती वंश पार्सर का उपयोग कर रहे हैं , और मशीन उत्पन्न नहीं , बाइसन-फ्लेक्स आधारित, नीचे अप पार्सिंग।

क्या कोई यहाँ पुष्टि कर सकता है कि यह मामला है? और यदि हां, तो मुख्यधारा के कंपाइलर फ्रेमवर्क हस्तलिखित पार्सर का उपयोग क्यों करते हैं?

अपडेट : यहां इस विषय पर दिलचस्प ब्लॉग


27
लगभग सभी मुख्य धारा संकलक हस्तलिखित पार्सर का उपयोग कर रहे हैं। इसमें क्या दिक्कत है?
तर्क

2
यदि आपको प्रदर्शन की आवश्यकता है तो आपको इसे (अर्ध-) मैन्युअल रूप से करना होगा।
जीन बुशुइव

15
और न केवल प्रदर्शन - बेहतर त्रुटि संदेश, ठीक होने की क्षमता, आदि
एसके-तर्क

MS VisualStudio के बारे में क्या? हालांकि खुले-खट्टे नहीं, एमएस से कोई यह सत्यापित कर सकता है कि वे भी एक हाथ से लिखे गए पुनरावर्ती वंश पार्सर का उपयोग कर रहे हैं?
OrenIshShalom 5

3
@ GeneBushuyev, GCC wiki से: "... हालांकि टाइमिंग ने 1.5% स्पीडअप दिखाया , मुख्य लाभ भविष्य के संवर्द्धन की सुविधा है ..." यह स्पीडअप मामूली लगता है ...
OrenIshShalle

जवाबों:


78

हाँ:

  • जीसीसी ने एक समय में एक याक (बाइसन) पार्सर का उपयोग किया था, लेकिन इसे 3.x श्रृंखला में कुछ बिंदु पर हाथ से लिखे गए पुनरावर्ती वंश पार्सर के साथ बदल दिया गया था: http://gcc.gnu.org/wiki/N__C_Parser के लिए देखें प्रासंगिक पैच सबमिशन के लिंक।

  • क्लैंग हाथ से लिखे हुए पुनरावर्ती वंशीय पार्सर का भी उपयोग करता है: http://clang.llvm.org/featre.html के अंत के पास अनुभाग "सी, ऑब्जेक्टिव सी, सी ++ और ऑब्जेक्टिव सी ++ के लिए एक एकल एकीकृत पार्सर" देखें ।


3
इसका मतलब यह है कि ओबजैक, सी और सी ++ में एलएल (के) ग्रामर है?
लिंडमैन

47
नहीं: यहां तक ​​कि सी, तीन में से सबसे सरल, एक अस्पष्ट व्याकरण है। उदाहरण के लिए, foo * bar;या तो गुणन अभिव्यक्ति के रूप में पार्स कर सकते हैं (अप्रयुक्त परिणाम के साथ), या barप्रकार सूचक-टू के साथ एक चर की घोषणा foo। कौन सा सही है यह इस बात पर निर्भर करता है कि उस समय के typedefलिए fooकोई गुंजाइश है या नहीं, जो ऐसा कुछ नहीं है जिसे किसी भी राशि के लुकहेड के साथ निर्धारित किया जा सकता है। लेकिन इसका मतलब यह है कि पुनरावर्ती वंश पार्सर को संभालने के लिए कुछ बदसूरत अतिरिक्त मशीनरी की आवश्यकता होती है।
मैथ्यू स्लिट

9
मैं अनुभवजन्य साक्ष्य से पुष्टि कर सकता हूं, कि C ++ 11, C, और ऑब्जेक्टिव C में संदर्भ मुक्त व्याकरण हैं जिन्हें GLR पार्सर संभाल सकता है।
इरा बैक्सटर

2
संदर्भ संवेदनशीलता के संबंध में, यह उत्तर न तो दावा करता है: इन भाषाओं को पार्स करने की संभावना ट्यूरिंग-पूर्ण है।
Ioannis Filippidis

106

एक लोक-प्रमेय है जो कहता है कि सी को पार्स करना मुश्किल है, और सी ++ अनिवार्य रूप से असंभव है।

यह सच नहीं है।

यह सच है कि पार्सिंग मशीनरी को हैक किए बिना प्रतीक तालिका डेटा में एलएएलआर (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।


6
पोस्टस्क्रिप्ट: जैसा कि वेंडर को मैच करने के लिए व्याकरण मिलना वास्तव में कठिन है, विभिन्न विक्रेताओं की C ++ 11 मैनुअल की व्याख्या से मिलान करने के लिए नाम और प्रकार का रिज़ॉल्यूशन प्राप्त करें, और भी कठिन है, क्योंकि आपके पास एकमात्र साक्ष्य ऐसे प्रोग्राम हैं जो थोड़ा संकलित करते हैं अलग-अलग, यदि आप उन्हें पा सकते हैं। हम मोटे तौर पर अतीत में हैं कि C ++ 11 के लिए अगस्त 2013 तक उचित है, लेकिन मैं C ++ समिति में थोड़ा निराश करता हूं जो सी के रूप में एक और भी बड़ा (और अनुभव से, अधिक भ्रमित) मानक का उत्पादन करने पर नरक-तुला लगता है ++ 1 वर्ष।
इरा बैक्सटर

5
मैं वास्तव में जानना चाहता हूं: आप उस foo * bar;अस्पष्टता को कैसे संभालते हैं ?
मार्टिन

14
@ मॉर्टिन: हमारे पार्सर इसे दोनों तरह से पार्स करते हैं, एक पेड़ का निर्माण करते हैं जिसमें विशेष "अस्पष्टता नोड्स" होते हैं जिनके बच्चे वैकल्पिक पर्स होते हैं; बच्चे अपने बच्चों का अधिकतम बँटवारा करते हैं, इसलिए हम एक पेड़ के बजाय एक DAG के साथ समाप्त होते हैं। पार्सिंग पूर्ण होने के बाद , हम DAG के ऊपर एक विशेषता व्याकरण मूल्यांकनकर्ता (AGE) चलाते हैं (यदि आप इसे नहीं जानते हैं तो "ट्री को वॉक करें और सामान करें" के लिए फैंसी नाम) जो सभी घोषित पहचानकर्ताओं के प्रकारों की गणना करता है। ...
इरा बैक्सटर

12
... अस्पष्ट बच्चे दोनों प्रकार के अनुरूप नहीं हो सकते; एक अस्पष्ट बच्चे की खोज करने पर AGE जो समझदारी से टाइप नहीं किया जा सकता है बस उसे हटा देता है। जो बचा है वह अच्छी तरह से टाइप किए गए बच्चे हैं; इस प्रकार, हमने निर्धारित किया है कि "फू बार;" सही है। यह ट्रिक वास्तविक व्याकरणों में पाई जाने वाली सभी प्रकार की पागल अस्पष्टताओं के लिए काम करती है जिन्हें हम C ++ 11 की वास्तविक बोलियों के लिए बनाते हैं, और * नामों के लिए अर्थ विश्लेषण से पार्सिंग को पूरी तरह से अलग करते हैं। इस साफ जुदाई का मतलब है बहुत कम इंजीनियरिंग काम करना (कोई भी डीबग नहीं करना)। अधिक चर्चा के लिए stackoverflow.com/a/1004737/120163 देखें ।
इरा बैक्सटर

3
@ समयसीमा: दरअसल, मैं आपके साथ भाषा वाक्य रचना (और शब्दार्थ) को डिजाइन करने की अपारंपरिक मूर्खता पर रेलिंग के साथ हूं जो इतनी जटिल है कि इसे ठीक से प्राप्त करना इतना कठिन है (हां, C ++ भाषा यहां बुरी तरह से ग्रस्त है)। काश भाषा डिजाइन समितियां वाक्यविन्यास को डिजाइन करतीं ताकि सरल पार्सिंग प्रौद्योगिकियां काम करतीं, और स्पष्ट रूप से भाषा शब्दार्थ को परिभाषित करतीं और इसे कुछ शब्दार्थ विश्लेषण उपकरणों के साथ जांचती। काश, दुनिया ऐसा नहीं लगती। इसलिए, मैं यह विचार करता हूं कि आप जो भी निर्माण करना चाहते हैं, उसका निर्माण करते हैं, और जीवन के साथ, अजीबता के बावजूद प्राप्त कर सकते हैं।
इरा बैक्सटर

31

क्लैंग के पार्सर एक हाथ से लिखे गए पुनरावर्ती-वंशीय पार्सर हैं, जैसा कि कई अन्य ओपन-सोर्स और वाणिज्यिक सी और सी ++ फ्रंट एंड हैं।

क्लैंग कई कारणों से एक पुनरावर्ती-वंशीय पार्सर का उपयोग करता है:

  • प्रदर्शन : एक हाथ से लिखे गए पार्सर हमें एक तेज पार्सर लिखने की अनुमति देता है, जो गर्म रास्तों को आवश्यकतानुसार अनुकूलित करता है, और हम हमेशा उस प्रदर्शन के नियंत्रण में रहते हैं। एक तेज पार्सर होने से क्लैंग को अन्य विकास साधनों में उपयोग करने की अनुमति मिलती है जहां "असली" पार्सर आमतौर पर उपयोग नहीं किए जाते हैं, जैसे, एक आईडीई में वाक्य रचना हाइलाइटिंग और कोड पूरा।
  • डायग्नॉस्टिक्स और एरर रिकवरी : क्योंकि आप हाथ से लिखे हुए रिकर्सिव-डिसेंट पार्सर के पूर्ण नियंत्रण में हैं, इसलिए विशेष मामलों को जोड़ना आसान है जो सामान्य समस्याओं का पता लगाते हैं और महान डायग्नोस्टिक्स और एरर रिकवरी प्रदान करते हैं (उदाहरण के लिए, http: //clang.llgmm पर देखें) .org / features.html # expressivediags ) स्वचालित रूप से उत्पन्न पार्सर के साथ, आप जनरेटर की क्षमताओं तक सीमित हैं।
  • सरलता : पुनरावर्ती-वंशीय पार्सर लिखना, समझना और डीबग करना आसान है। आपको पार्सिंग विशेषज्ञ होने की जरूरत नहीं है या पार्सर को बढ़ाने / सुधारने के लिए एक नया टूल सीखना है (जो एक ओपन-सोर्स प्रोजेक्ट के लिए विशेष रूप से महत्वपूर्ण है), फिर भी आप अभी भी शानदार परिणाम प्राप्त कर सकते हैं।

कुल मिलाकर, C ++ कंपाइलर के लिए, यह बहुत मायने नहीं रखता है: C ++ का पार्सिंग भाग गैर-तुच्छ है, लेकिन यह अभी भी आसान भागों में से एक है, इसलिए यह इसे सरल रखने के लिए भुगतान करता है। सिमेंटिक विश्लेषण --- विशेष रूप से नाम लुकअप, आरंभीकरण, अधिभार संकल्प, और टेम्पलेट तात्कालिकता --- परिमाण के पार्सिंग की तुलना में अधिक जटिल है। यदि आप प्रमाण चाहते हैं, तो कोड के वितरण की जांच करें और क्लैंग के "सेमा" घटक (शब्दार्थ विश्लेषण के लिए) बनाम इसके "पार्स" घटक (पार्सिंग के लिए) में जाएं।


4
हां, शब्दार्थ विश्लेषण बहुत कठिन है। हमारे पास व्याकरण के नियमों की कुछ 4000 पंक्तियाँ हैं जिनमें हमारे C ++ 11 व्याकरण शामिल हैं, और ऊपर के "अर्थ विश्लेषण" Doub सूचियों के लिए विशेषता व्याकरण कोड की कुछ 180,000 पंक्तियाँ सहायक कोड की एक और 100,000 लाइनों के साथ हैं। पार्सिंग वास्तव में समस्या नहीं है, हालांकि यदि आप गलत पैर पर शुरू करते हैं तो यह काफी कठिन है।
इरा बाक्सटर

1
मुझे यकीन नहीं है कि त्रुटि रिपोर्टिंग / पुनर्प्राप्ति के लिए हाथ से लिखे गए पार्सर आवश्यक रूप से बेहतर हैं । ऐसा प्रतीत होता है कि लोगों ने ऐसे पार्सरों में अधिक ऊर्जा डाल दी है, जो कि स्वचालित पार्सर जनरेटर द्वारा उत्पादित पार्सरों को बढ़ाने में है। इस विषय पर बहुत अच्छा शोध हो रहा है; इस विशेष पेपर ने वास्तव में मेरी नज़र को पकड़ा है: एमजी बर्क, 1983, एलआर और एलएल सिंटैक्टिक त्रुटि निदान और पुनर्प्राप्ति के लिए एक व्यावहारिक विधि, पीएचडी थीसिस, कंप्यूटर विज्ञान विभाग, न्यूयॉर्क विश्वविद्यालय, आर्काइव.org
इरा बैक्सटर

1
... इस विचार ट्रेन को जारी रखना: यदि आप बेहतर निदान के लिए विशेष मामलों की जांच के लिए अपने हाथ से निर्मित पार्सर को संशोधित / विस्तारित / अनुकूलित करने के लिए तैयार हैं, तो आपको यंत्रवत् निर्मित पार्सर के बेहतर निदान में समान निवेश करने के लिए तैयार होना चाहिए। किसी भी विशेष पेरेस के लिए जिसे आप मैनुअल एक के लिए एन्कोड कर सकते हैं, आप मैकेनिकल एक के लिए एक चेक को भी कोड कर सकते हैं, (और (जी) एलआर पार्सर्स के लिए, आप इसे बहुत कम कर सकते हैं जैसे कि कटौती पर सिमेंटिक चेक)। इस सीमा तक जो अप्राप्य प्रतीत होता है, एक तो आलसी हो रहा है, लेकिन यह यंत्रवत् जनित पार्स आईएमएचओ का अभियोग नहीं है।
इरा बैक्सटर

8

gcc का पार्सर हस्तलिखित है। । क्लैंग के लिए मुझे उसी पर संदेह है। यह शायद कुछ कारणों से है:

  • प्रदर्शन : कुछ ऐसा जो आपने अपने विशेष कार्य के लिए हाथ से अनुकूलित किया है, लगभग हमेशा एक सामान्य समाधान की तुलना में बेहतर प्रदर्शन करेगा। अमूर्तता आमतौर पर एक प्रदर्शन हिट है
  • टाइमिंग : कम से कम जीसीसी के मामले में, जीसीसी बहुत सारे मुफ्त डेवलपर टूल का इस्तेमाल करता है (1987 में सामने आया)। उस समय याक आदि का कोई मुफ्त संस्करण नहीं था, जो मुझे लगता था कि एफएसएफ में लोगों के लिए प्राथमिकता होगी।

यह शायद "यहां आविष्कार नहीं किया गया" सिंड्रोम का मामला नहीं है, लेकिन "कुछ भी नहीं है" की तर्ज पर विशेष रूप से हमारे लिए आवश्यक कुछ भी अनुकूलित नहीं था, इसलिए हमने अपना लिखा।


15
1987 में याक का कोई मुफ्त संस्करण नहीं? मुझे लगता है कि 70 के दशक में यूनिक्स के तहत पहली बार जब याक वितरित किए गए थे तो मुफ्त संस्करण थे। और IIRC (अन्य पोस्टर में एक ही लगता है), जीसीसी इस्तेमाल किया एक YACC आधारित पार्सर है। मैंने इसे बेहतर त्रुटि रिपोर्टिंग प्राप्त करने के लिए बदलने का बहाना सुना।
इरा बैक्स्टर

7
मैं जोड़ना चाहूंगा कि हस्तलिखित पार्सर से अच्छे त्रुटि संदेश उत्पन्न करना अक्सर आसान होता है।
डायट्रिच एप

1
टाइमिंग पर आपकी बात गलत है। GCC में YACC आधारित पार्सर हुआ करता था, लेकिन बाद में इसे हस्तलिखित पुनरावर्ती वंश पार्सर के साथ बदल दिया गया।
टॉमी एंडरसन

7

अजीब जवाब वहाँ!

C / C ++ व्याकरण संदर्भ मुक्त नहीं हैं। वे फू * बार के कारण संदर्भ के प्रति संवेदनशील हैं; अस्पष्टता। हमें यह जानने के लिए टाइपडिफ की सूची बनानी होगी कि फू एक प्रकार है या नहीं।

इरा बैक्सटर: मुझे आपकी जीएलआर वाली बात नहीं दिख रही है। क्यों एक पेड़ का निर्माण करें जिसमें अस्पष्टता शामिल है। पार्सिंग का अर्थ है अस्पष्टताओं को हल करना, वाक्य रचना के पेड़ का निर्माण करना। आप इन अस्पष्टताओं को एक दूसरे पास में हल करते हैं, इसलिए यह कम बदसूरत नहीं है। मेरे लिए यह बहुत अधिक बदसूरत है ...

Yacc एक LR (1) पार्सर जनरेटर (या LALR (1)) है, लेकिन इसे संदर्भ संवेदनशील होने के लिए आसानी से संशोधित किया जा सकता है। और इसमें कुछ भी बदसूरत नहीं है। Yacc / Bison को C भाषा को पार्स करने में मदद करने के लिए बनाया गया है, इसलिए शायद यह C पार्स उत्पन्न करने वाला सबसे पुराना उपकरण नहीं है ...

GCC 3.x तक C पार्सर yacc / bison द्वारा उत्पन्न किया जाता है, टाइपिंग टेबल के साथ पार्सिंग के दौरान बनाया जाता है। "इन पार्स" टाइपफ़ीड्स टेबल बिल्डिंग के साथ, सी व्याकरण स्थानीय रूप से मुक्त और इसके अलावा "स्थानीय रूप से LR (1)" बन जाता है।

अब, Gcc 4.x में, यह एक पुनरावर्ती वंशीय पार्सर है। यह Gcc 3.x की तरह ही समान पार्सर है, यह अभी भी LR (1) है, और इसमें समान व्याकरण नियम हैं। अंतर यह है कि याक पार्सर को फिर से लिखा गया है, शिफ्ट / कम अब कॉल स्टैक में छिपा हुआ है, और कोई "State454: if (nextsym == '(') goto state398" नहीं है जैसा कि gcc 3.x yacc में है पार्सर, इसलिए यह पैच करना आसान है, त्रुटियों को संभालना और अच्छे संदेशों को प्रिंट करना, और पार्सिंग के अगले संकलन चरणों में से कुछ को निष्पादित करना है। एक gcc दोपहर के लिए बहुत कम "आसान पढ़ने के लिए" कोड की कीमत पर।

उन्होंने याक से पुनरावर्ती वंश पर स्विच क्यों किया? क्योंकि सी ++ को पार्स करने के लिए याक से बचना बहुत आवश्यक है, और क्योंकि जीसीसी मल्टी भाषा संकलक होने का सपना देखता है, अर्थात विभिन्न भाषाओं के बीच अधिकतम कोड साझा कर सकता है। यही कारण है कि C ++ और C parser एक ही तरह से लिखे गए हैं।

C ++, C की तुलना में पार्स करना कठिन है क्योंकि यह "स्थानीय रूप से LR" (1) सी के रूप में नहीं है, यह LR (k) भी नहीं है। func<4 > 2>4> 2 के साथ तात्कालिक रूप से देखा जाने वाला एक टेम्प्लेट फंक्शन है, func<4 > 2> जिसे पढ़ना होगा func<1>। यह निश्चित रूप से LR (1) नहीं है। अब गौर कीजिए func<4 > 2 > 1 > 3 > 3 > 8 > 9 > 8 > 7 > 8>। यह वह जगह है जहां एक पुनरावर्ती वंश आसानी से अस्पष्टता को हल कर सकता है, कुछ और फ़ंक्शन कॉल की कीमत पर (parse_template_parameter अस्पष्ट पार्सर फ़ंक्शन है। यदि parse_template_parameter (17tokens) विफल रहा है, तो फिर से parse_template_parameter (15tokens), parse_temtemtplate_template_ प्रयास करें। यह काम करता हैं)।

मुझे नहीं पता कि यह yacc / bison recursive sub grammars में जोड़ना संभव क्यों नहीं होगा, शायद यह gcc / GNU पार्सर विकास में अगला कदम होगा?


9
"मेरे लिए, यह कहीं अधिक बदसूरत है"। मैं आपको बता सकता हूं कि जीएलआर और विलंब अस्पष्टता संकल्प का उपयोग करके उत्पादन गुणवत्ता पार्सर की इंजीनियरिंग वास्तव में एक छोटी टीम के साथ व्यावहारिक है। अन्य सभी समाधान जो मैंने देखे हैं कि बैकफ़्लिप और हैक्स के साथ सार्वजनिक रूप से दांतों को कुतरने के वर्षों में इसमें LR, पुनरावर्ती वंश के साथ काम करना आवश्यक है, आप इसे नाम देते हैं। आप बहुत सी अन्य नई नई पार्सिंग तकनीकों को पोस्ट कर सकते हैं, लेकिन जहाँ तक मैं बता सकता हूँ, कि इस बिंदु पर दांतों की सिर्फ अधिक जानकारी है। विचार सस्ते हैं; अमल करना प्रिय है।
इरा बैक्सटर


@ फ़िज़: एक जटिल वैज्ञानिक प्रोग्रामिंग लैंगगैस को पार्सिंग पर दिलचस्प पेपर। उन्होंने कहा कि नोट की कई चीजें: ए) क्लासिक पार्सर जनरेटर (एलएल (के), एलएएलआर (1)) कठिन व्याकरण को नहीं संभाल सकते हैं, बी) उन्होंने जीएलआर की कोशिश की, पैमाने के साथ परेशानी थी लेकिन डेवलपर्स अनुभवहीन थे इसलिए उन्होंने अनुभव नहीं किया। पूरा [कि जीएलआर की गलती नहीं है] और सी) उन्होंने एक बैकट्रैकिंग (ट्रांसेक्शनल) पैकरैट पार्सर का इस्तेमाल किया और बेहतर त्रुटि संदेशों का उत्पादन करने के लिए इसमें बहुत प्रयास किए। "{| X || x et mySet, 3 | x}" को पार्स करने के उनके उदाहरण के बारे में, मुझे लगता है कि जीएलआर इसे ठीक कर देगा और इसे रिक्त स्थान की आवश्यकता नहीं है।
इरा बैक्सटर

0

ऐसा लगता है कि जीसीसी और एलएलवीएम-क्लैंग हस्तलिखित पुनरावर्ती वंश पार्सर का उपयोग कर रहे हैं, और मशीन उत्पन्न नहीं, बाइसन-फ्लेक्स आधारित, नीचे पार्सिंग।

विशेष रूप से बाइसन मुझे नहीं लगता कि कुछ चीजों को अस्पष्ट रूप से पार्स करने और बाद में दूसरा पास करने के बिना व्याकरण को संभाल सकता है।

मैं जानता हूं कि हास्केल के हैप्पी मोनैडिक (यानी राज्य-निर्भर) पार्सर्स के लिए अनुमति देता है जो सी सिंटैक्स के साथ विशेष मुद्दे को हल कर सकते हैं, लेकिन मुझे कोई सी पार्सर जनरेटर के बारे में नहीं पता है जो उपयोगकर्ता द्वारा आपूर्ति किए गए राज्य मोनड की अनुमति देता है।

सिद्धांत रूप में, त्रुटि पुनर्प्राप्ति एक हस्तलिखित पार्सर के पक्ष में एक बिंदु होगा, लेकिन जीसीसी / क्लैंग के साथ मेरा अनुभव यह रहा है कि त्रुटि संदेश विशेष रूप से अच्छे नहीं हैं।

प्रदर्शन के लिए - कुछ दावे निराधार लगते हैं। पार्सर जनरेटर का उपयोग करके एक बड़ी राज्य मशीन को उत्पन्न करना कुछ में परिणाम होना चाहिए O(n)और मुझे संदेह है कि पार्सिंग बहुत टूलिंग में अड़चन है।


3
इस प्रश्न का पहले से ही एक उच्च गुणवत्ता वाला उत्तर है, जिसे आप जोड़ने की कोशिश कर रहे हैं?
टॉड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.