2010-03-11 7 views
13

Parsec, शाब्दिक जानकारी पार्स करने के लिए डिज़ाइन किया गया है, लेकिन यह मेरे लिए होता है कि Parsec भी जटिल प्रारूप कि सशर्त क्षेत्रों, बाहर के आदेश क्षेत्रों को शामिल करने के लिए पार्स करने बाइनरी फ़ाइल प्रारूप करने के लिए उपयुक्त हो सकता है आदिबास्करी फ़ाइलों को पार्स करने के लिए हास्केल के पारसी का उपयोग करना?

वहाँ है ऐसा करने के लिए या एक समान, वैकल्पिक पैकेज ऐसा करने की क्षमता है? यदि नहीं, बास्करी फ़ाइल प्रारूपों को पार्स करने के लिए हास्केल में सबसे अच्छा तरीका क्या है?

उत्तर

10

आपको AttoParsec में रुचि हो सकती है, जो मुझे लगता है कि इस उद्देश्य के लिए डिज़ाइन किया गया था।

4

मैंने सफलतापूर्वक Data Binary का उपयोग किया है।

2

यह ठीक काम करता है, हालांकि आप Parsec 3, Attoparsec, या Iteratees का उपयोग करना चाह सकते हैं। स्ट्रिंग पर पारसी की निर्भरता इसके मध्यवर्ती प्रतिनिधित्व के रूप में आपकी स्मृति पदचिह्न को थोड़ा सा कर सकती है, जबकि अन्य बाइटस्ट्रिंग्स का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है।

आईटेरेट्स विशेष रूप से आकर्षक हैं क्योंकि यह सुनिश्चित करना आसान है कि वे आपके इनपुट की शुरुआत में नहीं रहेंगे और वे उपलब्ध होने वाले डेटा के घटकों को खिला सकते हैं। यह आपको पूरे इनपुट को अग्रिम में स्मृति में पढ़ने से रोकता है और आपको आलसी आईओ जैसे अन्य गंदे कामकाज से बचने देता है।

+1

वह पारसी टेक्स्ट में है। पैरासेक का तात्पर्य यह मुख्य रूप से टेक्स्ट के लिए है, बाइनरी नहीं, है ना? बाइटस्ट्रिंग्स के लिए भी, यह केवल स्ट्रीम और चार का एक उदाहरण बनाता है। आपका क्या मतलब है कि यह ठीक काम करता है? – me2

1

सर्वोत्तम दृष्टिकोण बाइनरी फ़ाइल के प्रारूप पर निर्भर करता है।

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

दूसरी ओर यदि आपका बाइनरी डेटा इस तरह की दुनिया में फिट नहीं है तो आपको एटोपारसेक की आवश्यकता होगी। मैंने कभी इसका उपयोग नहीं किया है, इसलिए मैं आगे टिप्पणी नहीं कर सकता, लेकिन this blog post बहुत सकारात्मक है।

12

द्विआधारी फ़ाइलों को पार्स करने के लिए महत्वपूर्ण उपकरण हैं:

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

+0

मुझे लगता है कि अटोपर्सेक जाने का रास्ता है, लेकिन मुझे वास्तविक बाइनरी डेटा को पार्स करने के उदाहरण खोजने में कठिनाई हो रही है। एकमात्र उदाहरण आरएफसी 2616.hs को भंडार में शामिल किया गया है लेकिन यह अभी भी बार्सरी नहीं है, बल्कि पाठ को पार करता है। कोई सुझाव? – me2

+0

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

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