2011-09-19 14 views
6

मैं एक साधारण YAML पार्सर लिखने के लिए कोशिश कर रहा हूँ, मैं yaml.org, से कल्पना को पढ़ने से पहले मैं शुरू करते हैं, अगर यह बेहतर है एक हाथ से लुढ़का पार्सर, या उपयोग lex (flex/bison) लिखने के लिए मैं सोच रहा था। मैंने libyaml (सी लाइब्रेरी) को देखा - lex/yacc का उपयोग प्रतीत नहीं होता है। वाईएएमएल (प्रवाह शैलियों को छोड़कर), अधिक लाइन-ओरिएंटेड प्रतीत होता है, इसलिए, हाथ से लुढ़का हुआ पार्सर लिखना आसान है, या flex/bison धन्यवाद का उपयोग करें।वाईएएमएल पार्सिंग - लेक्स या हाथ से लुढ़का?

+1

क्या आपने केवल मानक, ऑफ-द-शेल्फ वाईएएमएल पार्सर का उपयोग करने पर विचार किया है? या आप विशेष रूप से अपना खुद का निर्माण करने में रुचि रखते हैं? साथ ही, ध्यान दें कि 'लेक्स' और' फ्लेक्स' * स्कैनर जनरेटर * हैं, नहीं * पार्सर जेनरेटर *; पार्सिंग करने के लिए, आप 'yacc' या' bison' का उपयोग करना चाहते हैं। – templatetypedef

+0

@templatetypedef मुझे अपना खुद का निर्माण करने में दिलचस्पी है। – vyom

+1

@templatetypedef मैंने शायद अपना प्रश्न स्पष्ट नहीं किया। मैं समझता हूं कि 'लेक्स' सिर्फ एक टोकननाइज़र है। मैं जानना चाहता था कि क्या वाईएएमएल की संरचना बेहतर है 'फ्लेक्स/बाइसन' या हाथ लुढ़का पार्सर – vyom

उत्तर

3

यह उत्तर मूल रूप से प्रश्न का उत्तर है: "क्या मुझे अपना खुद का पार्सर रोल करना चाहिए या पार्सर जनरेटर का उपयोग करना चाहिए?" और YAML के साथ बहुत कुछ नहीं है। लेकिन फिर भी यह आपके प्रश्न का उत्तर देगा।

आपको जो प्रश्न पूछने की आवश्यकता है वह यह नहीं है कि "यह इस भाषा/व्याकरण के साथ काम करता है", लेकिन "क्या मैं इसे लागू करने के लिए आत्मविश्वास महसूस करता हूं"। इस मामले की सच्चाई यह है कि आप जिस प्रारूप को पार्स करना चाहते हैं वह सिर्फ जेनरेट पार्सर के साथ काम करेगा। दूसरी सच्चाई यह है कि recursive descent parser पर लिखे गए सरल हाथ से जटिल भाषाओं को पार्स करना संभव है।

मैंने दूसरों के बीच लिखा है, EDDL (सी और संरचित तत्व) के लिए एक पुनरावर्ती मूल पार्सर और आईएनआई के लिए एक बाइसन/फ्लेक्स पार्सर। मैंने इन उदाहरणों को चुना, क्योंकि वे अंतर्ज्ञान और बाहरी आवश्यकताओं के खिलाफ जाते हैं, निर्णय को निर्धारित करते हैं।

चूंकि मैंने तकनीकी स्तर पर स्थापित किया है, यह संभव है, आप एक दूसरे को क्यों चुनेंगे? उत्तर देने के लिए यह वास्तव में कठिन सवाल है, यहां विषय पर कुछ विचार दिए गए हैं:

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

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