जैसा कि शीर्षक कहता है, मैंने पिछले सप्ताहांत में पर्ल-संगत नियमित अभिव्यक्तियों द्वारा मेल की जाने वाली भाषाओं के वर्ग के बारे में अपने दिमाग को लपेटने की कोशिश की, किसी भी मेल ऑपरेटर को छोड़कर जो पैटर्न के अंदर मनमाने कोड को निष्पादित करने की अनुमति देता है ।
यदि आप नहीं जानते कि PCRE क्या हैं, तो कृपया इसे और इसे पढ़ें ।
समस्या यह है कि, इंटरनेट पर उपलब्ध संसाधन संदर्भ-मुक्त भाषाओं पर बहुत अधिक रोकते हैं, और पीसीआरई उन से अधिक मेल खा सकते हैं (नीचे देखें); लेकिन मैं वास्तव में नहीं जानता कि इस तरह के सामान के बारे में अधिक प्रमेय या कागजात कहां मिलेंगे।
विशेष रूप से: पीसीआरई स्पष्ट रूप से नियमित भाषाओं का एक सुपरसेट है (जैसा कि पीसीआरई सिंटैक्स में सभी नियमित भाषा ऑपरेटर हैं)।
किसी भी सीएफजी को ग्रीबाच सामान्य रूप में रखा जा सकता है, जो बाईं पुनरावृत्ति को हटा देता है। मुझे लगता है कि इसका उपयोग (?(DEFINE)...)
समूह के माध्यम से व्याकरण को मिलान करने के लिए, उप-पाठ में मिलान करने के लिए किया जा सकता है , अनुवाद के द्वारा बाईं पुनरावृत्ति पर गला घोंटना,
- प्रत्येक उत्पादन के सिर पर गैर-टर्मिनल एक सबरूटीन बन जाता है
(?<HEAD>...)
- प्रत्येक उत्पादन का शरीर सबरूटीन में डाला जाता है; टर्मिनलों को छोड़ दिया जाता है, गैर-टर्मिनल प्रक्रिया चालान बन जाते हैं (यानी
(?&NONTERMINAL)
); |
ऑपरेटर के माध्यम से एक ही nonterminal के साथ सभी निर्माणों को एक साथ Ored किया जाता है ((?:...)
यदि आवश्यक हो तो साथ में अतिरिक्त समूह बनाना )- पैटर्न तब एक
(?(DEFINE)...)
समूह बन जाता है जिसमें सभी "अनुवादित" प्रोडक्शंस होते हैं, और शुरुआती स्ट्रिंग की प्रक्रिया के लिए एक आह्वान होता है, पूरे स्ट्रिंग से मेल खाता है, अर्थात^(?(DEFINE)...)(?&START)$
यह किसी भी सीएफजी से निपटना चाहिए। इसलिए, पीसीआरई किसी भी सीएफएल से मेल खाने में सक्षम होना चाहिए।
और अधिक है: आइए सरल भाषा को लें यानी तार के भाषा दो बार दोहराए गए। यह भाषा सीएफएल नहीं है - सीएफएल के लिए पंपिंग लेम्मा विफल हो जाती है। (वेतन विशेष ध्यान दें कि | वी एक्स डब्ल्यू | ≤ पी पकड़ चाहिए, इस प्रकार तुम सिर्फ शुरुआत या दो बार-बार तार के सिरों पंप नहीं कर सकते।)
हालांकि, इस भाषा को आसानी से एक PCRE के अनुरूप है: ^(.*)\1$
। इसलिए, हम सख्ती से सीएफएल से ऊपर हैं।
कितना ऊपर? खैर, जैसा कि मैंने कहा, मुझे कोई पता नहीं है। मुझे अपना मन बनाने के लिए सीएसएल या अन्य सभी कक्षाओं के बारे में कोई संसाधन नहीं मिला। कोई भी विशेषज्ञ इस पर चर्चा करने को तैयार है?
परिशिष्ट: मुझे यह निर्दिष्ट करने के लिए कहा गया था कि पीसीआर सिंटैक्स के किस सबसेट को अनुमति दी जानी चाहिए। जैसा कि मैंने पोस्ट की शुरुआत में लिखा था, मैं किसी भी ऑपरेटर को बाहर करना चाहता था जो पैटर्न के अंदर मनमाने कोड को निष्पादित करने की अनुमति देता है, जैसे कि ??{}
।
तर्क के लिए, मुझे लगता है कि हम pcresyntax (3) मैन पेज द्वारा परिभाषित सिंटैक्स के साथ चिपक सकते हैं , जो कि पर्ल 5.10-5.12 की पेशकश का एक उचित सबसेट है, कॉलआउट को घटाते हैं (जैसा कि वे पैटर्न के अंदर नहीं हैं)। मुझे यकीन नहीं है कि नियंत्रण क्रिया को जोड़ने या हटाने से उस भाषा को बदल दिया जाता है जिसे हम पहचान सकते हैं; यदि हां, तो यह पता लगाना अच्छा होगा कि हमें कौन सी कक्षाएं मिलती हैं और उन के बिना।