2009-02-20 20 views
26

लिखने के लिए सर्वोत्तम अभ्यास क्या कोई पार्सर लिखते समय मुझे सबसे अच्छा अभ्यास करना चाहिए? सलाह केप्रोग्रामिंग भाषा पार्सर

+2

क्या एक पार्सर के लिए? एक कंपाइलर या आईपी संदेश? – Tim

उत्तर

10

कुछ टुकड़े:

  • अपने व्याकरण पता - एक उपयुक्त प्रपत्र
  • में उसे लिख सही उपकरण का चयन करें। इसे Spirit2x के साथ C++ के भीतर से करें, या बाहरी पार्सर टूल जैसे एंटरलर, yacc, या जो कुछ भी आपको उपयुक्त बनाता है
  • क्या आपको एक पार्सर चाहिए? शायद regexp पर्याप्त होगा? या शायद चाल करने के लिए एक पर्ल स्क्रिप्ट हैक? लेखन जटिल पार्सर्स समय लेते हैं।
5

हाँ। इसे उत्पन्न करने की कोशिश करें, लिखो नहीं। वाईएसी, एएनटीएलआर, फ्लेक्स/बाइसन, कोको/आर, गोल्ड पार्सर जेनरेटर इत्यादि का उपयोग करने पर विचार करें। अगर मौजूदा पार्सर जनरेटर में से कोई भी आपकी जरूरतों को पूरा नहीं करता है तो मैन्युअल रूप से एक पार्सर लिखने का रिज़ॉर्ट।

7

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

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

3
  • पार्सर सही तरह का चयन करें, कभी कभी एक पुनरावर्ती वंशज पर्याप्त होगी, कभी कभी आप एक एलआर पार्सर का उपयोग करना चाहिए (यह भी, वहाँ एलआर पारसर्स के कई प्रकार हैं)।
  • यदि आपके पास जटिल व्याकरण है, तो एक सार सिंटेक्स ट्री बनाएं।
  • लेक्सर में क्या होता है, सिंटैक्स का हिस्सा क्या है और अर्थशास्त्र का विषय क्या है, इसकी पहचान करने की कोशिश करें।
  • पार्सर को कम से कम लेक्सर कार्यान्वयन के साथ जितना संभव हो सके बनाने की कोशिश करें।
  • उपयोगकर्ता को एक अच्छा इंटरफ़ेस प्रदान करें ताकि वह पार्सर कार्यान्वयन का अज्ञेयवादी हो।
18

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

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

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

फायदे: -

  • सरल निर्माण
  • बेहतर प्रदर्शन
  • बेहतर उत्पादन के नियंत्रण
  • छोटे विचलन के साथ सामना कर सकते हैं, उदाहरण के लिए एक व्याकरण के साथ काम करें जो 100% संदर्भ मुक्त नहीं है

मैं नहीं कह रहा हूं कि व्याकरण हमेशा अनुपयुक्त होते हैं, लेकिन अक्सर लाभ कम होते हैं और अक्सर लागत और जोखिमों से वजन कम होते हैं।

(मेरा मानना ​​है कि उनके लिए तर्क speciously अपील कर रहे हैं और उनके लिए एक सामान्य पूर्वाग्रह नहीं है कि यह संकेत है कि एक और कंप्यूटर विज्ञान साक्षर है का एक तरीका है के रूप में।)

2

पहले, कोशिश मत करो सबकुछ पार्स करने के लिए एक ही तकनीक को लागू करने के लिए। आईपी ​​पते (विज्ञापन कोड कोड का थोड़ा सा) से सी ++ प्रोग्राम (जिसमें प्रतीक तालिका से प्रतिक्रिया के साथ औद्योगिक-शक्ति पार्सर की आवश्यकता होती है) से कुछ संभावित उपयोग मामले हैं, और उपयोगकर्ता इनपुट से (जिसे बहुत संसाधित करने की आवश्यकता है) तेज़) कंपाइलर्स (जो आम तौर पर थोड़ा समय पार्सिंग खर्च कर सकते हैं)। यदि आप उपयोगी उत्तर चाहते हैं तो आप यह निर्दिष्ट करना चाहते हैं कि आप क्या कर रहे हैं।

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

तीसरा, अच्छा, यह आपके द्वारा किए जा रहे कार्यों पर निर्भर करता है।

7

सबसे पहले Dragon book पढ़ें।

Parsers जटिल हो जाते हैं नहीं करता है, तो आप जानते हैं कि कैसे उन्हें निर्माण करने के लिए है, लेकिन वे बात यह है कि अगर आप पर्याप्त समय में डाल दिया, आप अंत में वहाँ मिल जाएगा के प्रकार के नहीं हैं। मौजूदा ज्ञान आधार पर निर्माण करना बेहतर तरीका है। (अन्यथा इसे लिखने और इसे कुछ दर्जन बार फेंकने की उम्मीद है)।