2013-01-19 9 views
9

डीएफए बनाम Regexes एक व्याख्यात्मक विश्लेषक लागू करते समय?

क्यों किसी को अब भी कोड में DFAs लागू करेगा (गोटो बयान, मेज पर ही आधारित कार्यान्वयन) (मैं बस कैसे एक संकलक लिखने के लिए है, तो कृपया मुझे सही अगर मैं किसी भी गलत दावे करते हैं सीख रहा हूँ) जब वे बस कर सकते हैं नियमित अभिव्यक्तियों का प्रयोग करें? जहां तक ​​मैं समझता हूं, व्याख्यात्मक विश्लेषक पात्रों की एक स्ट्रिंग में लेते हैं और टोकन की एक सूची को मंथन करते हैं, जो भाषाओं की व्याकरण परिभाषा में टर्मिनलों हैं, जिससे नियमित अभिव्यक्ति द्वारा उन्हें वर्णित किया जा सकता है। अगर यह एक मैच पाता है तो लूप से तोड़ना, रेगेक्स के गुच्छा पर लूप करना आसान नहीं होगा?

+2

मुख्य कारण यह है कि तालिका संचालित डीएफए प्रोग्राम द्वारा आसानी से उत्पन्न किया जा सकता है (उदाहरण के लिए लेक्स)। –

उत्तर

5

आप बिल्कुल सही हैं कि डीएफए की तुलना में नियमित अभिव्यक्तियां लिखना आसान है। हालांकि, एक अच्छा सवाल सोचना है के बारे में

इन regex matchers कैसे काम करते हैं?

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

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

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

आशा है कि इससे मदद मिलती है!

+0

इसके अलावा रेगेक्स पैटर्न एक अच्छे लेक्सर का उपयोग करने से धीमे होते हैं और केवल अच्छे रेगेक्स सिस्टम माता-पिता जैसे डिलीमीटरों के बहुसंख्यक नेस्टेड जोड़े से मेल खाते हैं। –

+0

@GuyCoder एक कंपाइलर में पार्सर कोष्ठक को संभालता है, न कि लेक्सर। – EJP

+0

@EJP आपका अधिकार। मेरे पास अभी पार्सर संयोजक में मेरा सिर है और मैं लेक्सर/पार्सर नहीं सोच रहा हूं। –

संबंधित मुद्दे