पर्ल-संगत नियमित अभिव्यक्ति को कौन सी भाषाएं पहचानती हैं?


23

जैसा कि शीर्षक कहता है, मैंने पिछले सप्ताहांत में पर्ल-संगत नियमित अभिव्यक्तियों द्वारा मेल की जाने वाली भाषाओं के वर्ग के बारे में अपने दिमाग को लपेटने की कोशिश की, किसी भी मेल ऑपरेटर को छोड़कर जो पैटर्न के अंदर मनमाने कोड को निष्पादित करने की अनुमति देता है

यदि आप नहीं जानते कि PCRE क्या हैं, तो कृपया इसे और इसे पढ़ें ।

समस्या यह है कि, इंटरनेट पर उपलब्ध संसाधन संदर्भ-मुक्त भाषाओं पर बहुत अधिक रोकते हैं, और पीसीआरई उन से अधिक मेल खा सकते हैं (नीचे देखें); लेकिन मैं वास्तव में नहीं जानता कि इस तरह के सामान के बारे में अधिक प्रमेय या कागजात कहां मिलेंगे।

विशेष रूप से: पीसीआरई स्पष्ट रूप से नियमित भाषाओं का एक सुपरसेट है (जैसा कि पीसीआरई सिंटैक्स में सभी नियमित भाषा ऑपरेटर हैं)।

किसी भी सीएफजी को ग्रीबाच सामान्य रूप में रखा जा सकता है, जो बाईं पुनरावृत्ति को हटा देता है। मुझे लगता है कि इसका उपयोग (?(DEFINE)...)समूह के माध्यम से व्याकरण को मिलान करने के लिए, उप-पाठ में मिलान करने के लिए किया जा सकता है , अनुवाद के द्वारा बाईं पुनरावृत्ति पर गला घोंटना,

  • प्रत्येक उत्पादन के सिर पर गैर-टर्मिनल एक सबरूटीन बन जाता है (?<HEAD>...)
  • प्रत्येक उत्पादन का शरीर सबरूटीन में डाला जाता है; टर्मिनलों को छोड़ दिया जाता है, गैर-टर्मिनल प्रक्रिया चालान बन जाते हैं (यानी (?&NONTERMINAL));
  • |ऑपरेटर के माध्यम से एक ही nonterminal के साथ सभी निर्माणों को एक साथ Ored किया जाता है ( (?:...)यदि आवश्यक हो तो साथ में अतिरिक्त समूह बनाना )
  • पैटर्न तब एक (?(DEFINE)...)समूह बन जाता है जिसमें सभी "अनुवादित" प्रोडक्शंस होते हैं, और शुरुआती स्ट्रिंग की प्रक्रिया के लिए एक आह्वान होता है, पूरे स्ट्रिंग से मेल खाता है, अर्थात^(?(DEFINE)...)(?&START)$

यह किसी भी सीएफजी से निपटना चाहिए। इसलिए, पीसीआरई किसी भी सीएफएल से मेल खाने में सक्षम होना चाहिए।

और अधिक है: आइए सरल भाषा को लें यानी तार के भाषा दो बार दोहराए गए। यह भाषा सीएफएल नहीं है - सीएफएल के लिए पंपिंग लेम्मा विफल हो जाती है। (वेतन विशेष ध्यान दें कि | वी एक्स डब्ल्यू |पी पकड़ चाहिए, इस प्रकार तुम सिर्फ शुरुआत या दो बार-बार तार के सिरों पंप नहीं कर सकते।)

L={ww|wΛ}
|vxw|p

हालांकि, इस भाषा को आसानी से एक PCRE के अनुरूप है: ^(.*)\1$। इसलिए, हम सख्ती से सीएफएल से ऊपर हैं।

कितना ऊपर? खैर, जैसा कि मैंने कहा, मुझे कोई पता नहीं है। मुझे अपना मन बनाने के लिए सीएसएल या अन्य सभी कक्षाओं के बारे में कोई संसाधन नहीं मिला। कोई भी विशेषज्ञ इस पर चर्चा करने को तैयार है?

परिशिष्ट: मुझे यह निर्दिष्ट करने के लिए कहा गया था कि पीसीआर सिंटैक्स के किस सबसेट को अनुमति दी जानी चाहिए। जैसा कि मैंने पोस्ट की शुरुआत में लिखा था, मैं किसी भी ऑपरेटर को बाहर करना चाहता था जो पैटर्न के अंदर मनमाने कोड को निष्पादित करने की अनुमति देता है, जैसे कि ??{}

तर्क के लिए, मुझे लगता है कि हम pcresyntax (3) मैन पेज द्वारा परिभाषित सिंटैक्स के साथ चिपक सकते हैं , जो कि पर्ल 5.10-5.12 की पेशकश का एक उचित सबसेट है, कॉलआउट को घटाते हैं (जैसा कि वे पैटर्न के अंदर नहीं हैं)। मुझे यकीन नहीं है कि नियंत्रण क्रिया को जोड़ने या हटाने से उस भाषा को बदल दिया जाता है जिसे हम पहचान सकते हैं; यदि हां, तो यह पता लगाना अच्छा होगा कि हमें कौन सी कक्षाएं मिलती हैं और उन के बिना।


2
कृपया अपने प्रश्न में पीसीआरई की अपनी चुनी गई परिभाषा को शामिल करें, क्योंकि यह संस्करणों के बीच बदल गया है। असली पर्ल रेगीक्स में मनमाने ढंग से पर्ल कोड हो सकते हैं, जो उन्हें ट्यूरिंग-पूर्ण बनाते हैं।
गिल्स एसओ- बुराई को रोकना '

मैंने अंत में एक नोट जोड़ा, मुझे आशा है कि यह इस बिंदु को और अधिक स्पष्ट कर देगा।
peppe

जवाबों:


7

मैंने इस ब्लॉग पोस्ट को भी बेहद रोचक http://nikic.github.io/2012/06/15/The-true-power-of- अनियमित-expressions.html पाया है । यह बहुत ही प्रमाण प्रदान करता है जो मैंने इस तथ्य के बारे में दिया था कि regexps सीएफएल ( DEFINEब्लॉकों के माध्यम से व्याकरण को फिर से लिखकर ) को पहचानता है, और यहां तक ​​कि कुछ सीएसएल (जैसे दोहराया स्ट्रिंग की भाषा); यह उस पर बनाता है और आगे बढ़ता है, एक प्रमाण देता है कि बैकरेफरेंस के साथ regexps NP-hard (3-SAT को एक regexp को कम करके) है।


2
जब लेखक "एनपी-पूर्ण" कहता है, तो उन्हें "एनपी-हार्ड" कहना चाहिए। वे इस बात का कोई प्रमाण नहीं देते हैं कि PCRE भाषाओं का वर्ग एनपी में निहित है।
एन्द्र दास सलामन

सच है, यह टिप्पणियों में भी नोट किया गया है।
पेप्सी

5

वे ज्यादातर संदर्भ-संवेदनशील भाषाओं पर निर्णय लेते हैं (जो, जैसा कि आप बताते हैं, संदर्भ-मुक्त भाषाओं का एक सुपरसेट है)। इस पर्ल भिक्षु पोस्ट देखें ।

बुनियादी अंतर्दृष्टि यह है कि मशीन की "मेमोरी" कैप्चर समूहों की संख्या है, जो रैखिक रूप से बाध्य है।


5
दूसरे पैराग्राफ में आप जो तर्क देते हैं, वह बताता है कि पीसीआरई सीएस से अधिक क्यों नहीं स्वीकार कर सकता है , लेकिन यह नहीं कि यह समावेश सटीक क्यों है (जो आप अपने पहले पैराग्राफ में सुझाते हैं)। ऐसा नहीं लगता है कि लिंक किए गए लेख ने इसका प्रमाण दिया है, या तो।
राफेल

ठीक है, आप इनपुट स्ट्रिंग में अधिक से अधिक समूह नहीं कर सकते हैं, और समूहों की संख्या किसी दिए गए पैटर्न में तय की गई है, इसलिए आपके पास एक ऊपरी (रैखिक) सीमा है जो एक पैटर्न का उपयोग करता है। फिर भी, मुझे एक पीसीआरई का औपचारिक प्रमाण याद आता है -> रैखिक बाउंड ऑटोमेटोन परिवर्तन ...
peppe

हाँ, आप दो सही हैं। मैंने उत्तर को संशोधित कर दिया है।
Xodarap

पहले की चर्चा के लिए perlmonks.org/?node_id=406253 भी देखें ।
आंद्र सलाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.