बाइनरी डेटा पर एक लेक्सर / पार्सर का उपयोग करना इतना गलत क्यों है?


13

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

क्या कोई समझा सकता है कि एक लेसर / पार्सर के साथ द्विआधारी डेटा को पार्स करना एक सीएस छात्र के लिए पर्याप्त स्पष्टता के साथ इतना गलत क्यों है जो एक पार्सिंग क्लास नहीं लिया है, लेकिन सिद्धांत पर एक पैर जमाने के साथ?


मेरा अनुमान है कि लेक्सर को बाइट / शब्द से छोटे टोकन शायद नहीं मिलेंगे। यदि आपको इसकी आवश्यकता है, तो एरलंग को
डेव क्लार्क

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

@GuyCoder: व्याकरण के लिए कई क्लासिक उदाहरण द्विआधारी वर्णमाला का उपयोग करते हैं, उदाहरण के लिए । S0S10S
राफेल

1
वैसे: "केवल एक प्रकार का टोकन होना, बाइट के लिए एक टोकन।" - अच्छा नहीं, इससे बाइट टोकन बनेंगे। 28
राफेल

5
@GuyCoder: किसी अन्य प्रोग्राम द्वारा उत्पन्न सभी डेटा को एक व्याकरण द्वारा वर्णित किया जा सकता है। यह एक संदर्भ-मुक्त नहीं हो सकता है, हालांकि।
राफेल

जवाबों:


10

सिद्धांत रूप में, कुछ भी गलत नहीं है।

प्रयोग में,

  • सबसे गैर-पाठ डेटा प्रारूप मुझे पता है कि संदर्भ-मुक्त नहीं हैं और इसलिए आम पार्सर जनरेटर के लिए उपयुक्त नहीं हैं। सबसे आम कारण यह है कि उनके पास लंबाई के क्षेत्र हैं जो एक उत्पादन को पेश करने की संख्या को देते हैं।

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

    इसके बाद आप मैन्युअल रूप से रिटेन लेक्सर जैसे ट्रिक्स को खेलना शुरू कर सकते हैं जो कि पार्सर से फीडबैक ले सकते हैं (C का लेक्स / yacc हैंडलिंग इस तरह के ट्रिक्स को टाइप करने के लिए हैंडल करने के लिए ट्रिक्स का इस्तेमाल करते हैं)। लेकिन फिर हम दूसरे बिंदु पर आते हैं।

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


"भाषाएं नियमित हैं" यदि "लेकिन संवेदी संवेदनशील भी 'का अर्थ लिया गया था, जिसका अर्थ है कि द्विआधारी डेटा एक व्याकरण है, मैं उत्तर में स्पष्ट कर दूंगा। यह समस्या का हिस्सा है; लोग व्याकरण या नियमित भाषा को एक बार सोचते हैं। उल्लेख पार्सर।
गाइ कोडर

7

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

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

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

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

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

दूसरे शब्दों में, यह आमतौर पर एक इनपुट की संरचना का पता लगाने के लिए एक बेकार का एक सा है, जिसके लिए आप पहले से ही संरचना को जानते हैं। चूंकि पार्सिंग मुफ़्त नहीं है (इसमें समय लगता है और आपके प्रोग्राम में जटिलता बढ़ जाती है), यही कारण है कि बाइनरी डेटा पर लेकर्स / पार्सर का उपयोग करना 'इतना गलत है'।


2
यह एक अच्छा परिप्रेक्ष्य है, लेकिन मुझे ऐसा लगता है कि यह सवाल का जवाब नहीं देता है।
राफेल

LANGSEC: Language-theoretic Securityएक दिलचस्प परिप्रेक्ष्य प्रदान करता है। एक लेख "अजीब मशीनों" के बारे में बात करता है: एक सिस्टम के इनपुट हैंडलिंग सुविधाओं को बनाने वाले एक ज्ञात प्रारूप के तदर्थ पार्सर्स । वे वास्तव में इरादा के अनुसार काम नहीं कर सकते। गलत मान्यताओं के कारण, दोषपूर्ण मशीन विशेष रूप से तैयार किए गए इनपुट को दिए गए अप्रत्याशित राज्य संक्रमण का प्रदर्शन करेगी, गणना करना संभव नहीं है। यह एक हमले वेक्टर बनाता है। औपचारिक व्याकरण का उपयोग करने से काफी सही एल्गोरिदम निकलेंगे।
माथियस मोरेरा

0

यदि किसी भाषा को कुछ गैर-तुच्छ तरीके से पार्स करने की आवश्यकता है, तो आमतौर पर इसका अर्थ है कि संरचनात्मक तत्वों का मिलान करने की आवश्यकता है, इसलिए इनपुट भाषा में अतिरेक होता है , या तो क्योंकि एकाधिक इनपुट एक ही पार्स ट्री के लिए मैप करते हैं या क्योंकि कुछ इनपुट स्ट्रिंग अमान्य हैं। मनुष्य अतिरेक पसंद करता है। : उदाहरण के लिए, अधिकांश मनुष्यों द्विआधारी ऑपरेटरों प्राथमिक गणित के लिए एक शुद्ध उपसर्ग या प्रत्यय अंकन की तुलना में अधिक पठनीय लगता है के बजाय याa+b×(cd)+e(+ a (* b (- c d)) e)a b c d - * + e +। सामान्य गणितीय संकेतन में लिस्प की तुलना में अधिक अतिरेक होता है (जिसके लिए अधिक कोष्ठकों की आवश्यकता होती है, लेकिन मुफ्त में परिवर्तनशील विविधताएं प्राप्त होती हैं, इसलिए बड़े आकृतियों का उपयोग करके अभिव्यक्तियों को व्यक्त करने के लिए कम प्रतीकों की आवश्यकता होती है) या आरपीएल (जिसे कभी भी कोष्ठक की आवश्यकता नहीं होती है)। इस तरह की अतिरेक कंप्यूटर के लिए शायद ही उपयोगी है - और यह कहाँ है, जो तब होता है जब डेटा में त्रुटियां हो सकती हैं, त्रुटि सुधार तर्क आमतौर पर डेटा के कार्यात्मक अर्थ से अलग रखा जाता है, उदाहरण के लिए त्रुटि सुधार कोड का उपयोग करके जो मनमाना पर लागू होता है बाइट दृश्यों की परवाह किए बिना कि वे क्या प्रतिनिधित्व करते हैं।

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

बाइनरी डेटा के लिए nontrivial पार्सर्स के खिलाफ एक और कारक यह है कि बहुत सारे बाइनरी फॉर्मेट को निम्न-स्तरीय कोड द्वारा पार्स करने के लिए डिज़ाइन किया गया है जो कि छोटे ओवरहेड के साथ निरंतर मेमोरी में काम करना पसंद करते हैं। किसी तत्व की मनमानी पुनरावृत्ति की अनुमति देने के लिए निश्चित आकार पसंद किया जाता है। एक प्रारूप जैसे कि टीएलवी जो किसी वस्तु के लिए बाएं से दाएं पार्सर को पहले स्मृति की सही मात्रा आवंटित करने की अनुमति देता है, फिर वस्तु का प्रतिनिधित्व पढ़ता है। बाएं से दाएं पार्स करना एक फायदा है क्योंकि यह डेटा को संसाधित करने की अनुमति देता है जैसे कि यह आता है, जिसमें कोई मध्यवर्ती बफर नहीं है।


पहले दो पैराग्राफ की बात क्या है? यहां तक ​​कि अगर आपके पास कोई अतिरेक नहीं है, तो आपको एक पार्सर की आवश्यकता है। इसके अलावा, पहला पैराग्राफ गलत है: ऐसे उदाहरण हैं जहां सभी शब्दों की अनुमति है लेकिन आप संरचना को प्राप्त करने के लिए पार्स करते हैं (उदाहरण के लिए आरएनए की माध्यमिक संरचना भविष्यवाणी)।
राफेल

@ राफेल एक गैर-तुच्छ पार्सर आमतौर पर अतिरेक का अर्थ है (हाँ, जैसा कि आप बताते हैं, अपवाद हैं)। मैंने उन भाषाओं पर विचार नहीं किया था जो न तो मनुष्यों के लिए और न ही कंप्यूटर के लिए डिज़ाइन की गई थीं, यह एक दिलचस्प उदाहरण है। पहले दो पैराग्राफ बाइनरी और मानव-पठनीय स्वरूपों के बीच विशिष्ट अंतरों पर चर्चा करते हैं (विशिष्ट अर्थ है कि यदि आप अपवादों की तलाश में हैं, तो आप उन्हें खोज लेंगे)।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.