2009-07-22 18 views
6

मुझे अभी तक कंप्यूटर विज्ञान में औपचारिक भाषाओं के क्षेत्र में नहीं मिला है, इसलिए शायद मेरा सवाल मूर्खतापूर्ण है। मैं सी ++ में एक साधारण एनएमईए पार्सर लिख रहा हूं, और मुझे चुनना है:पार्सर जनरेटर का उपयोग कब करें, रेगेक्स कब पर्याप्त है?

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

तब मैंने एक पार्सर जनरेटर का उपयोग करने के बारे में सोचा। मुझे लगता है कि सभी एक ही विधि का उपयोग करते हैं: वे एक एफएसए उत्पन्न करते हैं। लेकिन मुझे नहीं पता कि कौन सा अधिक कुशल है। आप आमतौर पर regexes के बजाय पार्सर जेनरेटर का उपयोग करते हैं (मुझे लगता है कि आप पार्सर जेनरेटर में रेगेक्स लिख सकते हैं)?

कृपया मतभेदों की व्याख्या करें, मुझे सिद्धांत और अनुभव दोनों में रूचि है।

उत्तर

7

ठीक है, अंगूठे का एक साधारण नियम यह है: यदि डेटा का व्याकरण आप पार्स करने की कोशिश कर रहे हैं तो regular है, नियमित अभिव्यक्तियों का उपयोग करें। यदि ऐसा नहीं है, तो नियमित अभिव्यक्तियां अभी भी काम कर सकती हैं (क्योंकि अधिकांश रेगेक्स इंजन गैर-नियमित व्याकरण का भी समर्थन करते हैं), लेकिन यह दर्दनाक (जटिल/खराब प्रदर्शन) हो सकता है।

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

4

रेगेक्स एक पार्सर जनरेटर है।

विकिपीडिया से:

रेगुलर एक्सप्रेशन (, regex या regexp के रूप में संक्षिप्त बहुवचन रूपों regexes, regexps, या regexen के साथ) है कि एक नियमित अभिव्यक्ति प्रोसेसर, एक कार्यक्रम से व्याख्या की जा सकती एक औपचारिक भाषा में बनाई गई या तो एक पार्सर जनरेटर के रूप में कार्य करता है या पाठ की जांच करता है और प्रदान किए गए विनिर्देश से मेल खाने वाले हिस्सों की पहचान करता है।

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

यह आपको लगता है कि यह बहुत तेज है। मैंने इस पोस्ट की तुलना में अभिव्यक्तियों को बड़ा देखा है।

जोड़ना कि आप जितना चाहें उतना घोंसला कर सकते हैं, जो भी भाषा आप इसे कोड करने का निर्णय लेते हैं। आप अधिकतम पुनः उपयोगिता के लिए इसे अनुभागों में भी कर सकते हैं।

2

जैसे स्नीकीनेस बताता है, आपके पास एक बड़ी और जटिल नियमित अभिव्यक्ति हो सकती है जो आश्चर्यजनक रूप से शक्तिशाली है। मैंने इसके कुछ उदाहरण देखे हैं, लेकिन केवल प्राणियों द्वारा कोई भी बनाए रखने योग्य नहीं था। यहां तक ​​कि Expresso का उपयोग करके भी बहुत मदद मिली; संशोधित करना और जोखिम में जोखिम भरा अभी भी मुश्किल था। तो जब तक आप Grep पर एक निर्धारण के साथ एक savant हैं, मैं इस दिशा की सिफारिश नहीं करेंगे।

इसके बजाय, व्याकरण पर ध्यान केंद्रित करने और compiler compiler को आपके लिए भारी उठाने पर विचार करें।

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