द्विआधारी धाराओं के साथ काम करने में समस्या प्रति पार्सर समस्या नहीं है, यह एक परेशानी की समस्या है। लेक्सर कच्चे डेटा को तत्वों में बदल देता है जो पार्स संभाल सकता है।
अधिकांश किसी भी पार्सिंग सिस्टम में आपको अपनी खुद की लेक्सर की आपूर्ति करने में कुछ समस्याएं होती हैं, और यदि ऐसा होता है, तो आदर्श रूप से, आसानी से एक जटिल व्याख्याक लिखते हैं जो आपकी बाइनरी स्ट्रीम पर काम करता है।
समस्या यह है कि आज सबसे अधिक पार्सिंग और लेक्सिंग सिस्टम स्वयं उच्च स्तर के टूल से बनाए जाते हैं। और यह टूल सबसे अधिक संभावना है कि बाइनरी धाराओं के साथ काम करने के लिए डिज़ाइन नहीं किया गया है। यही है, यह आपके लिए व्यावहारिक नहीं है कि बाइनरी स्ट्रीम के टोकन और व्याकरण को निर्दिष्ट करें जिसका उपयोग बाद के पार्सर्स और लेक्सर बनाने के लिए किया जा सकता है। इसके अलावा, बहु बाइट बाइनरी संख्याओं (शॉर्ट्स, लम्बे, फ्लोट इत्यादि) की उच्च स्तरीय अवधारणाओं के लिए जो भी संभव है, उसमें कोई समर्थन नहीं है, जो आपको बाइनरी स्ट्रीम में सामना करने की संभावना है, न ही जेनरेट पार्सर के लिए संभवतः उन पर अच्छा काम करने की संभावना है यदि आपको वास्तव में उनके वास्तविक मूल्य पर काम करने की आवश्यकता है, तो सिस्टम को ज्यादातर टेक्स्ट आधारित टोकन के लिए डिज़ाइन किया गया है, और अंतर्निहित रनटाइम उस पाठ को परिवर्तित करने के विवरण को संभालता है जो मशीन का उपयोग कर सकता है (जैसे वास्तविक रूप से एसीआई अंकों के अनुक्रम बाइनरी पूर्णांक)।
जो कुछ भी कहा गया है, आप शायद वास्तव में उपकरण के पार्सिंग सेक्शन का उपयोग कर सकते हैं, क्योंकि पार्सर्स सार तत्वों पर अधिक काम करते हैं जो उन्हें लेक्सर द्वारा खिलाया जाता है। एक बार जब आप अपने व्याकरण को प्रतीकात्मक स्तर पर बनाते हैं, तो आपको बार्नी स्ट्रीम से समस्या को टोकरी में फ़ीड करने के लिए समस्या को टोकन को फिर से करने की आवश्यकता होगी।
यह वास्तव में अच्छा है, क्योंकि पार्सर मूल लेक्सर से कहीं अधिक जटिल हो जाता है, इसलिए टूलकिट आपके लिए "कठिन भाग" को संभाल लेगा। लेकिन आपको अभी भी अपना खुद का लेक्सर बनाने और जेनरेट किए गए पार्सर में इसे सही तरीके से इंटरफेस करने के साथ निपटने की आवश्यकता होगी। एक दुर्बल कार्य नहीं है, और यदि व्याकरण किसी वास्तविक जटिलता का है, तो लंबे समय तक आपके प्रयास के लायक होने की संभावना है।
यदि यह सब कुछ अधिक सरल है, तो आप शायद इसे स्वयं से हाथ से बेहतर कर सकते हैं। मेरे सिर के शीर्ष में, एक कठिन द्विआधारी व्याकरण की कल्पना करना मुश्किल है, क्योंकि बाइनरी प्रारूप का प्रमुख बिक्री बिंदु यह है कि यह मशीन के बहुत करीब है, जो पाठ के विरोधाभास में है कि अधिकांश पार्सर्स के साथ काम करने के लिए डिज़ाइन किया गया है। लेकिन मुझे आपके उपयोग के मामले को नहीं पता।
लेकिन एक डिस्सेबलर के मामले पर विचार करें। यह एक साधारण लेक्सर है जो विभिन्न स्तरों के उच्च स्तर पर खड़े हो सकता है (जैसे कि उन परिचालनों में जिनके पास कोई तर्क नहीं है, जो एक बाइट को तर्क के रूप में लेते हैं, या एक शब्द), और एक पार्सर को फ़ीड करते हैं उसके बाद निर्देशों को उनके निमोनिक्स में बदलने और सामान्य असेंबलर सिंटैक्स में ऑपरेंड करने के लिए उपयोग किया जा सकता है, साथ ही साथ लेबल संदर्भों को संभाला जा सकता है।
यह एक दूषित मामला है, क्योंकि एक डिस्सेबलर आम तौर पर लेक्सिंग और पार्सिंग चरणों को अलग नहीं करता है, आमतौर पर परेशान करने के लिए पर्याप्त जटिल नहीं होता है, लेकिन समस्या को देखने का यह एक तरीका है।
अनुशेष:
यदि आपके पास पर्याप्त जानकारी पाठ करने के लिए बाइनरी धारा परिवर्तित करने के लिए इंजन को खिलाने के लिए है, तो आप आप पर्याप्त जानकारी के बजाय पाठ बनाने के लिए है, तो आप वास्तविक टोकन बना सकता है कि पार्सर लेक्सर से देखना चाहते हैं।
कहा कि, क्या तुम कर सकते हो अपने पाठ स्वरूप लेते हैं, का उपयोग करें कि आपके पार्स उपकरण और व्याकरण के लिए आधार के रूप में है, और यह आप के लिए lexer और पार्सर मशीन बनाने के लिए है, और फिर हाथ से, आप परीक्षण कर सकते हैं "पाठ परीक्षण" का उपयोग कर आपका पार्सर और इसकी प्रसंस्करण।
लेकिन जब आप बाइनरी पढ़ने के बजाए बाइनरी पढ़ने के लिए चारों ओर जाते हैं, तो लेक्सड और पार्स किए जाने के बजाय, बस टोकन बनाते हैं जो कि लेक्सर बनाते हैं (ये साधारण वस्तुएं होनी चाहिए), और सीधे पार्सर पंप करें। यह आपको लेक्स चरण बचाएगा और आपको कुछ प्रोसेसिंग समय बचाएगा।
मैं समझ मैं 2 साल बाद इस का उल्लेख है, लेकिन मैं एक परियोजना है कि सिर्फ इस करता है पर काम कर रहा है। मेरे पास fparsec शैली combinators का उपयोग कर लिखा नमूना एमपी 4 कंटेनर बाइनरी पार्सर है। https://github.com/devshorts/ParsecClone – devshorts