सबसे शक्तिशाली प्रकार का पार्सर क्या है?


28

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

तो क्या सबसे शक्तिशाली प्रकार का पार्सर है? कागजात के लिए उद्धरण (साथ ही अधिक परिचयात्मक लेख) का स्वागत किया जाएगा।

(मुझे पता है कि 'शक्तिशाली' ठीक से परिभाषित नहीं है, लेकिन चलो इसके साथ थोड़ा ढीला हो जाएं और देखें कि उत्तर कहां जाते हैं)


1
डाउनवोट: अनुसंधान स्तर नहीं।
वॉरेन शूडी

3
@Warren: मैंने पूछने से पहले अक्सर पूछे जाने वाले प्रश्न की जाँच की - यह एक आवश्यकता नहीं लगती है।
पॉल बिगगर

1
वास्तव में दो FAQs हैं, एक सामान्य साइट के लिए और दूसरा CStheory के लिए। CStheory एक इंगित करती है कि ऐसे प्रश्नों का उत्तर दिया जा सकता है जैसे कि विकिपीडिया को पढ़ना ऑफ-टॉपिक है; देखें "किस तरह के प्रश्न बहुत बुनियादी हैं?" में meta.cstheory.stackexchange.com/questions/225/...
वारेन शूडी

1
@Warren: वह अक्सर पूछे जाने वाले प्रश्न हैं जो मैंने पढ़ा है। मैंने विकिपीडिया पढ़ा था, लेकिन मुझे यह वास्तविक अंतर्दृष्टि की आवश्यकता थी।
पॉल बिगगर

1
आप उत्पादन या सैद्धांतिक लोगों में पार्सर्स का मतलब है, यानी जो CFG के अलावा व्याकरण के प्रकार को कवर करते हैं?
राफेल

जवाबों:


33

एक व्याकरण को आमतौर पर एक संदर्भ मुक्त व्याकरण के रूप में परिभाषित किया जाता है - विकिपीडिया पृष्ठ पर एक सटीक परिभाषा दी गई है, लेकिन यह उसी तरह से काम करता है जैसा कि PLY में होता है , जो बाइसन पर आधारित है , जो बदले में याक पर आधारित है ।

यह यहां कहता है कि PLY एक LALR पार्सर का उपयोग करता है । यह अनिवार्य रूप से एक LR पार्सर है जहाँ लुकअप टेबल को संघनित किया जाता है, संभवतः पार्सिंग संघर्षों का परिचय देते हुए, एलआर व्याकरण की अभिव्यंजकता को कम करते हुए (यानी, एक संदर्भ मुक्त व्याकरण जिसे एक LR पार्सर पार्स कर सकता है)। यदि आप पार्सर की इस विशेष शाखा और अन्य पार्सरों की सीमाओं के बारे में जानना चाहते हैं, तो यहां सभी प्रकार की पार्सिंग तकनीकों (एलएल, एलआर और अन्य) का अवलोकन दिया गया है

आपके प्रश्न का उत्तर देने के लिए: किसी भी संदर्भ-मुक्त भाषा को पार्स करने में सक्षम पार्सिंग एल्गोरिदम मौजूद हैं, भले ही भाषा अस्पष्ट हो (यानी, इनपुट की व्याख्या करने का एक से अधिक तरीका है):

इस तरह की पहली एल्गोरिथ्म था CYK एल्गोरिथ्म , जो दुर्भाग्य से की एक चलने का समय है , जहां n इनपुट स्ट्रिंग और की लंबाई है | जी | व्याकरण का आकार है और इसलिए पार्सिंग भाषाओं के लिए अव्यावहारिक है।O(n3|G|)n|G|

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

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

Parser का अंतिम प्रकार GLR पार्सर है । यह LR पार्सिंग का एक सामान्यीकृत संस्करण है, जो किसी भी संदर्भ-मुक्त भाषा को पार्स करने में सक्षम है।

GLR का एक परिपक्व कार्यान्वयन ASF + SDF है । बाइसन एक जीएलआर पार्सर भी उत्पन्न कर सकता है, हालांकि इसका कार्यान्वयन 'मानक' जीएलआर एल्गोरिथ्म से थोड़ा अलग है। Elkhound एल्गोरिथ्म एक GLR / LALR संकर एल्गोरिथ्म है। यह जब संभव हो तो LALR का उपयोग करता है और आवश्यकता पड़ने पर GLR, किसी भी व्याकरण को पार्स करने में तेज और सक्षम दोनों होता है।

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

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

अंत में, अपने स्वयं के पार्सर-जनरेटर को लागू करना एक तुच्छ मामला नहीं है, विशेष रूप से इसे तेजी से प्राप्त करने के लिए। मैंने व्यक्तिगत रूप से फ्लेक्स (लेक्सर जनरेटर) के अपने संस्करण को बनाने के लिए व्यक्तिगत रूप से समाप्त कर दिया है, और जबकि यह अपेक्षाकृत सरल एल्गोरिथम समस्याओं में एक अभ्यास की तरह लग रहा था, यह सही होने के लिए काफी जटिल हो गया, विशेष रूप से जब मैंने यूनिकोड का समर्थन करने की कोशिश की। अपने स्वयं के लेखन के बजाय पहले से मौजूद कार्यान्वयन का उपयोग करने पर विचार करें।


1
बहुत बढ़िया जवाब !! खूंटी में फिट होने के बारे में कोई विचार?
पॉल बिगगर

2
पीईजी सीएफजी की तुलना में 'अलग' हैं: ऐसे सीएफजी हैं जो पीईजी नहीं हैं और इसके विपरीत। मैं आपको यहां संदर्भित करता हूं: stackoverflow.com/questions/1857022/…
एलेक्स टेन ब्रिंक

यह रुचि का भी हो सकता है: blogs.ethz.ch/copton/2009/07/08/parsing-expression-grammars
एलेक्स दस ब्रिंक

1
वास्तव में, सबसे आम पार्सर जनरेटर (yacc, Antlr, bison) गैर-सीएफ अवधारणाओं को विधेय या मनमाने ढंग से कोड की अनुमति देते हैं जो एक नियम की जांच करते हैं कि उन्हें सम्मान दिया जा सकता है। पूर्ववर्ती निर्णय लेना। इसका उपयोग स्थैतिक शब्दार्थ को मुख्य रूप से लागू करने के लिए किया जा सकता है क्योंकि मूल सिंटैक्स सार संदर्भ मुक्त रहता है।
राफेल

1
पुनरावर्ती भाषाएं हमेशा ट्यूरिंग मशीनों द्वारा हलाल करने वाली भाषाओं में सटीक होती हैं। कोई भी संदर्भ संवेदनशील भाषा इसलिए भी पुनरावर्ती है, लेकिन चूंकि संदर्भ संवेदनशील भाषाएं घातीय समय में निर्णायक हैं, इसलिए पुनरावर्ती भाषाएं हैं जो संदर्भ संवेदनशील नहीं हैं। अप्रतिबंधित व्याकरण और भी अधिक शक्तिशाली हैं: रुकने की समस्या को एक अप्रतिबंधित व्याकरण द्वारा वर्णित किया जा सकता है, लेकिन पुनरावर्ती भाषा नहीं है।
एलेक्स टेन ब्रिंक

15

इस साल ICFP 2010 में एक पेपर, टोटल पार्सर कॉम्बिनेटर , एक बहुत ही ख़त्म करने वाले पार्सर कॉम्बीनेटर लाइब्रेरी के बारे में बताता है और यह भी स्थापित करता है कि इस लाइब्रेरी में "पार्सर कॉम्बीनेटर उतने ही अर्थपूर्ण होते हैं" जितना कि पार्सर को समाप्त करने की गारंटी है। दुर्भाग्य से मुझे यह याद नहीं है कि लेखक ने "जितना संभव हो सके अभिव्यंजक" का अर्थ दिया है, लेकिन यह निश्चित रूप से इस शक्ति के बारे में आपके प्रश्न के लिए प्रासंगिक लगता है।


1
मेरे पास एक कार है जो प्रदूषित नहीं करती है, वास्तव में यह या तो नहीं चलती है ... तो सवाल यह है: इस पुस्तकालय द्वारा किस तरह की भाषा को पार्स किया गया है? इसका मतलब यह नहीं है कि यह काम दिलचस्प नहीं है, ज़ाहिर है।
बाबू

2

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

प्राकृतिक भाषा प्रसंस्करण में, स्वाद अलग हैं, उदाहरण के लिए, अस्पष्टता (भी: अंतर्निहित अस्पष्टता) से निपटने और मुक्त शब्द क्रम बहुत प्रमुख भूमिका निभाता है। यहां खोजशब्द संवेदनशील भाषाओं का संदर्भ देते हैं और फिर से शुरू होने पर ऑटोमेटा आपको पढ़ना शुरू करने में मदद कर सकता है।


1
जिस तरह से सवाल पूछा गया था, उसे देखते हुए और शिकायत है कि सीएफ बहुत विवश है, आपका जवाब स्पष्ट रूप से सबसे अच्छा है। तो यह चला जाता है ...
babou

0

पार्सर जेनरेटर उपकरण:

ANTLR बहुत अच्छा है। वैकल्पिक रूप से, आप जावासीसी पर एक नज़र डाल सकते हैं


मैं एक कंप्यूटर वैज्ञानिक नहीं हूँ (मेरी डिग्री क्या कहती है?) के बावजूद, इसलिए मेरे शब्द यहाँ हल्के से तौले जा सकते हैं। मैं Sazzad से सहमत हूं - ANTLR एक बहुत शक्तिशाली उपकरण है। यह बहुत पूरा हो गया है, और मुझे अभी तक पार्सर जनरेटर (एलएल (के) के साथ कोई समस्या नहीं है अगर मुझे सही याद है)। दूसरी ओर, मुझे अभी तक कुछ जटिल व्याकरण के लिए एक कंपाइलर को लागू करना है ...
जोर्ज सिगवार्डसन

5
मुझे लगता है कि आप प्रश्न के बिंदु और शायद पूरी साइट को याद कर रहे हैं। यह सिद्धांत और कार्यान्वयन के बारे में नहीं, पार्सिंग सिद्धांत के बारे में है।
पॉल बिगगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.