क्या रेग्युलर एक्सप्रेशंस की भाषा को इसे पार्स करने के लिए ऑटोमैटिक डाउन पुश की जरूरत है?


12

मैं एक उपयोगकर्ता को एनएफए में नियमित अभिव्यक्ति दर्ज करने के लिए परिवर्तित करना चाहता हूं ताकि मैं फिर मेल खाते उद्देश्यों के लिए एनएफए को एक स्ट्रिंग के खिलाफ चला सकूं। न्यूनतम मशीन क्या है जिसका उपयोग नियमित अभिव्यक्तियों को पार्स करने के लिए किया जा सकता है?

मुझे लगता है कि यह ऑटोमेटन को नीचे धकेलना होगा क्योंकि कोष्ठक के संरक्षण का अर्थ है गिनती करना और डीएफए / एनएफए की मनमानी गिनती करना नहीं। क्या यह धारणा सही है? उदाहरण के लिए, अभिव्यक्ति (bc *) d को पीडीए की आवश्यकता होगी ताकि कोष्ठक में उप-अभिव्यक्ति को सही ढंग से संभाला जा सके।


1
"पार्सिंग" से आपका वास्तव में क्या मतलब है? क्या आप जाँचते हैं कि क्या इनपुट वास्तव में एक नियमित अभिव्यक्ति है या क्या आपके पास एक और जटिल बात है, उदाहरण के लिए, एक मशीन जो संबंधित NFA के विवरण का उत्पादन करती है? (यदि आपको यकीन नहीं है कि इनपुट वास्तव में एक नियमित अभिव्यक्ति है और आपको इसकी जांच करने की आवश्यकता है, तो आपको यह जांचने में सक्षम होना चाहिए कि कोष्ठक सही है और इसका मतलब सामान्य रूप से स्टैक का उपयोग करना है।)
केवह

व्यावहारिक उत्तर के लिए, आप grep.y के लिए योजना 9 Grep स्रोत को देख सकते हैं
ब्रूस एडगर

जवाबों:


8

तुम सही हो। यह दिखाना आसान है कि मानक तकनीकों का उपयोग करके नियमित अभिव्यक्तियों का वाक्यविन्यास नियमित नहीं है ।

एक संभावना है कि सभी प्रतीकों से छुटकारा पाने के लिए एक समरूपता (जो कि बंद है) का उपयोग करें, लेकिन कोष्ठक, जो आपको डाइक भाषा के साथ छोड़ देता है जिसे गैर-नियमित रूप से जाना जाता है। यदि संदेह है, तो पम्पिंग लेम्मा का उपयोग ।( पी ) पीREG(p)p

उस ने कहा, आप शायद पीडीए को हाथ से कोड नहीं करना चाहते हैं। ANTLR या byacc जैसे पार्सर जनरेटर का उपयोग करने पर विचार करें । यदि, दूसरी ओर, आप प्रोग्रामिंग पार्सर द्वारा भाषाओं की पार्सिंग की जांच स्वयं करना चाहते हैं, तो आपको अन्य बुनियादी पार्सिंग एल्गोरिदम जैसे CYK , Earley , पुनरावर्ती वंश और LR से जारी रखना चाहिए ।


धन्यवाद। इन कार्यों के लिए कोड लिखना एक बेहतर समझ पैदा करता है और यह मौजूदा उपयोगिताओं जैसे कि lex, yacc, bison आदि के रूप में कुशल होने का इरादा नहीं है
फिल राइट

@ राष्ट्रीय: मैं देख रहा हूँ, अच्छा! मैंने इस मामले के लिए और संकेत दिए।
राफेल

मैं इस एक के लिए एक हाथ से कोडित पुनरावर्ती वंश पार्सर का पक्ष लेता हूं।
डेव क्लार्क

यदि इसके लिए हाथ से पार्सर लिखना, या तो पुनरावर्ती वंश (फैक्टरिंग और मालिश के बाद) एक विकल्प है, तो C < sites.google.com/site/lccretargetablecompiler > के लिए LCC parser में बहुत सारे ऑपरेटरों को संभालने के लिए एक दिलचस्प विकल्प है। लेकिन शायद हाथ से निर्माण के लिए सबसे आसान है पूर्ववर्ती पार्सिंग।
वॉनब्रांड

3

मैं आपको सुझाव देता हूं कि आप प्रश्न पर " नियमित अभिव्यक्ति का उपयोग करते हुए नियमित अभिव्यक्तियों का मिलान " करते हुए, जुका का अच्छा जवाब पढ़ें । अंश:

उदाहरण के लिए, हम मानक संकेतन को "संपीड़ित" नियमित अभिव्यक्ति प्राप्त करने के लिए निम्नानुसार संशोधित कर सकते हैं :

  • आपको किसी भी उपसर्ग को हटाने की अनुमति है जिसमें एक अनुक्रम है ('s')
  • आपको किसी भी प्रत्यय को हटाने की अनुमति है जिसमें अनुक्रम है)

यही है, ((a|b)*c)de(f|g)उदाहरण के लिए, "संपीड़ित" संकेतन में व्यक्त किया जा सकता है, उदाहरण के लिए, निम्न रूपों में से कोई भी: a|b)*c)de(f|gया ((a|b)*c)de(f|gया (a|b)*c)de(f|g)

[...]

"संकुचित" संकेतन (एक नियमित अभिव्यक्ति का) एक नियमित भाषा है।

यह नियमित अभिव्यक्ति भाषा पर केवल एक दिलचस्प (मेरे अनुसार) "अलग दृष्टिकोण" की एक कड़ी है; जैसा कि नीचे टिप्पणी में रेखांकित किया गया है, यह एक वाक्यविन्यास के पेड़ के निर्माण के लिए उपयोगी नहीं है। यदि आप अपने पार्सर को कोड करना चाहते हैं तो मैं आपको कोडप्रोजेक्ट " राइटिंग- ओन -रेगुलर-एक्सप्रेशन- पैरसर" पर यह सरल लेख सुझाऊँगा ।


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

4
आप (और जुका) रेक्सक्स को पार्स नहीं कर रहे हैं, केवल उन्हें पहचान रहे हैं। "हाँ, यह (संकुचित) regexp है।"
गाइल्स का SO- बुराई पर रोक '21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.