क्या आधुनिक भाषाएं अभी भी पार्सर जनरेटर का उपयोग करती हैं?


38

मैं यहां विकिपीडिया पर gcc कंपाइलर सुइट के बारे में शोध कर रहा था , जब यह आया:

जीसीसी ने बाइसन के साथ उत्पन्न एलएएलआर पार्सर का उपयोग करना शुरू कर दिया, लेकिन धीरे-धीरे हाथ से लिखे गए पुनरावर्ती-वंशीय स्विचर्स पर स्विच किया; सी ++ के लिए 2004 में, और 2006 में सी और ऑब्जेक्टिव-सी के लिए। वर्तमान में सभी फ्रंट एंड्स में हाथ से लिखे हुए रिकर्सिव-डिसेंटर्स का उपयोग किया जाता है।

तो उस अंतिम वाक्य से, (और जितना मैं विकिपीडिया पर भरोसा करता हूं) मैं निश्चित रूप से कह सकता हूं कि "सी (जीसीसी), सी ++ (जी ++), ऑब्जेक्टिव-सी, ऑब्जेक्टिव-सी ++, फोरट्रान (गैफरान), जावा (जीसीजे), Ada (GNAT), गो (gccgo), पास्कल (gpc), ... मर्करी, मोडुला -2, मोडुला -3, PL / I, D (gdc), और VHDL (ghdl) "सभी फ्रंट-एंड्स हैं कि नहीं अब एक पार्सर जनरेटर का उपयोग करें। यही है, वे सभी हाथ से लिखे गए पार्सर का उपयोग करते हैं।

मेरा सवाल यह है कि क्या यह अभ्यास सर्वव्यापी है? विशेष रूप से, मैं [Python, Swift, Ruby, Java, Scala, ML, Haskell] में x के लिए "क्या मानक / आधिकारिक कार्यान्वयन के लिए हाथ से लिखे गए पार्सर है" के सटीक उत्तर की तलाश है। (वास्तव में, किसी भी अन्य भाषाओं की जानकारी यहाँ भी स्वागत है।) मुझे यकीन है कि मैं इसे बहुत खुदाई के बाद अपने दम पर पा सकता हूं। लेकिन मुझे यकीन है कि यह समुदाय द्वारा आसानी से जवाबदेह है। धन्यवाद!


3
डेटा बिंदु: CPython में एक घरेलू काढ़ा LALR पार्सर जनरेटर (pgen) है। बाकी के बारे में नहीं जानते।

8
डेटा बिंदु: Ghc (haskell) एक LALR पार्सर जनरेटर (खुश) का उपयोग करता है, जैसा कि OCaml करता है।
ट्वेन वैन लाहरोवेन

1
"आधुनिक उच्च प्रदर्शन संकलक करें ..." या समान होना चाहिए , क्योंकि भाषा कल्पना नहीं है कार्यान्वयन नहीं है, जबकि यह संकलक है जो या तो मशीन जनरेट किए गए पार्सर का उपयोग करता है या नहीं करता है।
dmckee

@ मिक्की, हाँ आप सही हैं। हालाँकि, नामकरण लंबे और बिंदु से कम होने लगता है। यदि आप मुझसे अधिक रचनात्मक हैं, तो इसे संपादित करने के लिए स्वतंत्र महसूस करें!
ईटनफिल

एमएल के बारे में: एमएलटन एक पार्सर जनरेटर का उपयोग करता है जो एमएल के लिए विशिष्ट है, मुझे 90% यकीन है कि एसएमएल / एनजे भी करता है, हालांकि मैं इसके बारे में कम परिचित हूं। आप "हाथ से लिखे" पर विचार करना चाहते हैं या नहीं कर सकते हैं।
पैट्रिक कॉलिन्स

जवाबों:


34

AFAIK, GCC सिंटैक्टिक एरर डायग्नॉस्टिक्स (यानी सिंटैक्स त्रुटियों पर मानवीय सार्थक संदेश देने) को बेहतर बनाने के लिए हाथ से लिखे गए पार्सर का उपयोग करता है।

पार्सिंग सिद्धांत (और इससे उत्पन्न होने वाले पार्सिंग जनरेटर) एक सही इनपुट वाक्यांश को पहचानने और पार्स करने के बारे में है । लेकिन हम संकलक से उम्मीद करते हैं कि वे कुछ गलत इनपुट के लिए सार्थक त्रुटि संदेश देते हैं (और वे क्रमिक त्रुटि के बाद सार्थक इनपुट को पार्स करने में सक्षम हैं)।

इसके अलावा, पुरानी विरासत की भाषाएं जैसे C11 या C ++ 11- (जो कि वैचारिक रूप से पुरानी हैं, भले ही उनका नवीनतम संशोधन केवल तीन साल पुराना हो) सभी संदर्भ-मुक्त नहीं हैं। पार्सर जनरेटर के लिए व्याकरण में इस संदर्भ संवेदनशीलता के साथ काम (यानी जंगली भैंसों या यहाँ तक कि Menhir ) boringly मुश्किल है।


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

2
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult। यह भी कम या ज्यादा असंभव है क्योंकि ये उपकरण संदर्भ-मुक्त पार्सर उत्पन्न करते हैं। यदि आप इस तरह के टूल का उपयोग कर रहे हैं तो पार्स ट्री को जनरेट करने के बाद सभी संदर्भ-संवेदनशील बाधाएं मौजूद हैं या नहीं, यह जांचने के लिए सही जगह है ।
dtech

7

पार्सर जनरेटर और पार्सर इंजन काफी सामान्य हैं। व्यापकता का लाभ यह है कि एक सटीक पार्सर का निर्माण जल्दी से हो जाता है और इसे प्राप्त करना आसान होता है, चीजों की समग्र योजना में।

पार्सर इंजन अपनी व्यापकता के कारण प्रदर्शन के मोर्चे पर खुद पीड़ित है। किसी भी हाथ से लिखा कोड हमेशा टेबल-संचालित पार्सर इंजन की तुलना में काफी तेज होगा।

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


15
कृपया प्रदर्शन के दावे के लिए उद्धरण दें? टेबल-चालित होने के कारण एक महत्वपूर्ण प्रदर्शन अनुकूलन हो सकता है और जनरेटर में एल्गोरिदम तक पहुंच होती है जो बहुत कुशल होती है लेकिन वास्तव में कभी भी हाथ से लागू नहीं होती है (ठीक है क्योंकि वे तालिकाओं और जादू की संख्या के अभेद्य गड़बड़ हैं)।

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

यदि आप पार्सिंग के दौरान प्रतीक तालिका जानकारी का उपयोग करते हैं, तो आप इसे संदर्भ-संवेदनशील भी कह सकते हैं। सुव्यवस्थित व्याकरण निश्चित रूप से संदर्भ मुक्त नहीं हैं, हालांकि मुझे नहीं लगता कि वे पूरी तरह से संवेदनशील हैं। त्रुटि सुधार और रिपोर्टिंग के बारे में आपके अन्य बिंदु अच्छी तरह से लिए गए हैं।
BobDalgleish

1
सी और सी ++ को पार्सिंग के दौरान प्रतीक तालिका की जानकारी की आवश्यकता होती है (या एक बहुत कम विशिष्ट पार्स वृक्ष को स्वीकार करें जहां कोई भेद नहीं किया जाता है, उदाहरण के लिए, अभिव्यक्ति बयान और चर घोषणाएं)। लेकिन मैं उन के बारे में नहीं सोच रहा था। जावा, लिस्प्स, जावास्क्रिप्ट, रूबी, पायथन, गो, रस्ट, स्काला, स्विफ्ट, हास्केल (और शायद कई और, शायद सी # और एमएल भी?) जैसी भाषाओं को एएसटी की तरह बनाने के लिए आपको ऐसी किसी भी जानकारी की आवश्यकता नहीं है? वैसे भी चाहते हैं। उनमें से कई वास्तव में एलएल (1) व्याकरण, या यहां तक ​​कि LALR व्याकरण हैं।

1
सभी वास्तविक भाषाओं के लिए प्रशस्ति पत्र संवेदी संवेदनशील हैं?
Psr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.