2010-11-03 6 views
38

"सुखद" अर्थ, उदाहरण के लिए: आप व्याकरण को एक "प्राकृतिक" तरीके से लिख सकते हैं बिना उन्हें एक ठोस तरीके से फिर से लिखना, और उबाऊ बॉयलरप्लेट पेश किए बिना।कौन सा हास्केल पार्सिंग तकनीक उपयोग करने के लिए सबसे सुखद है, और क्यों?

चलिए इस प्रश्न के प्रयोजनों के लिए निर्धारित करते हैं कि, जब तक कि प्रौद्योगिकी का प्रदर्शन रोगजनक रूप से खराब न हो, प्रदर्शन यहां सबसे बड़ा मुद्दा नहीं है।

हालांकि, ऐसा कहा जाता है कि, यदि आप प्रदर्शन कारणों से व्याकरण को फिर से लिखने की बात आती है तो आप उल्लेख कर सकते हैं कि कोई तकनीक गिरती है या नहीं।

कृपया मुझे इस प्रश्न का उत्तर देते समय, व्याकरण के आकार और जटिलता का एक विचार दें। साथ ही, क्या आपने प्रश्न में प्रौद्योगिकी की किसी भी उल्लेखनीय "उन्नत" विशेषताओं का उपयोग किया है, और उन लोगों के आपके प्रभाव क्या थे।

बेशक, इस प्रश्न का उत्तर डोमेन पर निर्भर हो सकता है, इस मामले में, मुझे इस तथ्य को जानने में खुशी होगी।

उत्तर

27

यह वास्तव में निर्भर करता है कि आप किस चीज से शुरू करते हैं और आप क्या करना चाहते हैं। एक आकार बिल्कुल फिट बैठता नहीं है।

यदि कोई एलआर व्याकरण है (उदाहरण के लिए आप एक Yacc व्याकरण से काम कर रहे हैं), तो यह पारसी या यू-पार्सिंगलिब के लिए उपयुक्त एलएल में बदलने के लिए काम का एक अच्छा सौदा है। हालांकि कई, sepBy आदि पार्सर्स यहां बहुत उपयोगी हैं, लेकिन आपको उम्मीद है कि पार्सर हैप्पी + एलेक्स से धीमे हो।

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

यदि आप प्रोग्रामिंग भाषा की तरह कुछ स्वरूपित फ़ाइल को डीकोड कर रहे हैं, तो Attoparsec या इसी तरह Parsec या uu-parsinglib से बेहतर हो सकता है। इस संदर्भ में बेहतर तेज़ी से - बाइटस्ट्रिंग बनाम चार नहीं, लेकिन मुझे लगता है कि Attoparsec त्रुटि हैंडलिंग/स्रोत स्थान ट्रैकिंग के संबंध में कम काम करता है ताकि पार्सर्स को तेजी से चलाना चाहिए क्योंकि वे प्रति इनपुट तत्व कम काम कर रहे हैं।

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

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

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

रिकॉर्ड के लिए मैंने फ्राउन के साथ एक सी पार्सर लिखा है, हैप्पी के साथ जीएल-छायांकन भाषा, यूयू_Parsing के साथ एक अधूरा सी पार्सर, और Parsec के साथ कई चीजें। मेरे लिए पसंद जो मैं शुरू करता था, एलआर व्याकरण - फ्राउन या हैप्पी (अब फ्राउन के रूप में हैप्पी नहीं रखा जाता है), अन्यथा आमतौर पर पारसेक (जैसा कि मैंने कहा था कि यूयू_परसे अच्छा है लेकिन भाषाडिफ की सुविधा की कमी है)। बाइनरी प्रारूपों के लिए मैं अपना खुद का रोल करता हूं, लेकिन मुझे आमतौर पर विशेष आवश्यकताएं होती हैं।

+3

यह एक दिलचस्प जवाब है। क्या किसी के पास पैक्रेट पार्सिंग/पीईजी के बारे में बताने के लिए कोई राय या दिलचस्प कहानी है? http://pdos.csail.mit.edu/~baford/packrat/ – gawi

+1

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

+0

फ्रिसबी पेपर पर अच्छा दिखता है: http://repetae.net/computer/frisby/ – gawi

5

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

यह सच है कि वर्तमान में आपको चीजों के टोकनिंग पक्ष पर थोड़ा और करने की ज़रूरत है, लेकिन हमारे लिए यह लाइब्रेरी की मौलिक ताकत के सापेक्ष एक छोटा सा बिंदु है।

5

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

+2

Parsec के साथ एक आवेदक शैली में पार्सर्स लिखना पूरी तरह से संभव है। – Guildenstern

+0

@ गुइल्डेंस्टर्न, जो केवल Parsec3 से है, Parsec2 ने इसका समर्थन नहीं किया – Schiavini

संबंधित मुद्दे

 संबंधित मुद्दे