2011-10-17 23 views
12

मैं fparsec की कुछ मूलभूत बातों से परिचित हूं लेकिन ऐसा लगता है कि यह टेक्स्ट फाइलों या धाराओं के प्रति तैयार है।क्या कोई ज्ञात पार्सर संयोजक लाइब्रेरी है जो F # में है जो बाइनरी (टेक्स्ट नहीं) फ़ाइलों को पार्स कर सकती है?

क्या कोई अन्य एफ # लाइब्रेरी है जो कुशलतापूर्वक बाइनरी फ़ाइलों को पार्स कर सकती है? या बाइनरी धाराओं के साथ कुशलतापूर्वक काम करने के लिए fparsec आसानी से संशोधित किया जा सकता है?

+2

मैं समझ मैं 2 साल बाद इस का उल्लेख है, लेकिन मैं एक परियोजना है कि सिर्फ इस करता है पर काम कर रहा है। मेरे पास fparsec शैली combinators का उपयोग कर लिखा नमूना एमपी 4 कंटेनर बाइनरी पार्सर है। https://github.com/devshorts/ParsecClone – devshorts

उत्तर

10

आप combinators पिकलर में रुचि हो सकती। ये पार्सर combinators की तरह एक सा है, लेकिन सरल द्विआधारी प्रारूपों (picklers आप बाइनरी डेटा और unpicklers उन्हें पार्स उत्पादन करने की अनुमति) पर अधिक ध्यान केंद्रित कर रहे हैं। एंड्रयू केनेडी (माप की इकाइयों के लेखक) द्वारा quite readable article about the idea (पीडीएफ) है।

मैं अपने आप को इन का अधिक अनुभव नहीं है, लेकिन मैं सिर्फ यह आप के लिए प्रासंगिक हो सकता है एहसास हुआ। कुछ बाइनरी संसाधनों (जैसे संसाधनों में संग्रहीत उद्धरण) उत्पन्न करने के लिए एफ # कंपाइलर में विचार का उपयोग किया जाता है। हालांकि, मुझे यकीन नहीं है कि F# compiler implementation कोई अच्छा है (यह F # कंपाइलर के प्रारंभिक दिनों से उन चीजों में से एक है)।

+0

मैं मैं से विशेषज्ञ एफ # बुक 'शब्द का पिकलर' याद लगता है ... धन्यवाद टॉमस मैं उन्हें बाहर भी जांच करेंगे। यह मुझे याद दिलाता है कि मैं एफ # कंपाइलर में आपके द्वारा उल्लिखित बहाली की जांच करने जा रहा था, मैं भी नहीं था। – 7sharp9

+0

@ टोमास आपके द्वारा सबमिट किए गए लिंक में दस्तावेज़ के माध्यम से देख रहे हैं, आपने [कार्यकर्ता की उपयोगिता के बारे में मुझसे पूछा गया प्रश्न का उत्तर दिया है/रैपर परिवर्तन] (http://www.monadgarden.com/andy/papers/wrapper.pdf)। अपने लिंक के अंत में एमएल में पिकलर्स को लागू करने के बारे में चर्चा देखें। –

+0

मैं monadic अचार के लिए जा रहा हूँ :-) – 7sharp9

6

द्विआधारी धाराओं के साथ काम करने में समस्या प्रति पार्सर समस्या नहीं है, यह एक परेशानी की समस्या है। लेक्सर कच्चे डेटा को तत्वों में बदल देता है जो पार्स संभाल सकता है।

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

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

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

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

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

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

यह एक दूषित मामला है, क्योंकि एक डिस्सेबलर आम तौर पर लेक्सिंग और पार्सिंग चरणों को अलग नहीं करता है, आमतौर पर परेशान करने के लिए पर्याप्त जटिल नहीं होता है, लेकिन समस्या को देखने का यह एक तरीका है।

अनुशेष:

यदि आपके पास पर्याप्त जानकारी पाठ करने के लिए बाइनरी धारा परिवर्तित करने के लिए इंजन को खिलाने के लिए है, तो आप आप पर्याप्त जानकारी के बजाय पाठ बनाने के लिए है, तो आप वास्तविक टोकन बना सकता है कि पार्सर लेक्सर से देखना चाहते हैं।

कहा कि, क्या तुम कर सकते हो अपने पाठ स्वरूप लेते हैं, का उपयोग करें कि आपके पार्स उपकरण और व्याकरण के लिए आधार के रूप में है, और यह आप के लिए lexer और पार्सर मशीन बनाने के लिए है, और फिर हाथ से, आप परीक्षण कर सकते हैं "पाठ परीक्षण" का उपयोग कर आपका पार्सर और इसकी प्रसंस्करण।

लेकिन जब आप बाइनरी पढ़ने के बजाए बाइनरी पढ़ने के लिए चारों ओर जाते हैं, तो लेक्सड और पार्स किए जाने के बजाय, बस टोकन बनाते हैं जो कि लेक्सर बनाते हैं (ये साधारण वस्तुएं होनी चाहिए), और सीधे पार्सर पंप करें। यह आपको लेक्स चरण बचाएगा और आपको कुछ प्रोसेसिंग समय बचाएगा।

+0

विस्तृत उत्तर के लिए सबसे पहले धन्यवाद। मैं इस आधार पर काम करने जा रहा था कि मैं निम्न स्तर के व्याकरण के उप-समूह के साथ काम कर रहा हूं और इसे ऊपर के रूप में ब्लॉक कर रहा हूं जिसे fparsec जैसे कुछ द्वारा संभाला जा सकता है। अर्थात (pbyte 0x45) >> = मज़ा एक्स -> (pbyte 0x78) आदि तब उन ब्लॉक का उपयोग हो सकता है पाठ है, जो तब fparsec द्वारा नियंत्रित किया जा सकता है निर्माण करने के लिए। – 7sharp9