वाम प्रत्यावर्तन। वाम-पुनरावर्ती व्याकरण। बैकट्रैक के साथ रिकर्सिव डिसेंट

भविष्य कहनेवाला विश्लेषण का उपयोग करने में मुख्य कठिनाई इनपुट भाषा के लिए एक व्याकरण खोजना है जिसका उपयोग विशिष्ट रूप से परिभाषित इनपुट के साथ एक विश्लेषण तालिका बनाने के लिए किया जा सकता है। कभी-कभी, कुछ सरल परिवर्तनों के साथ, एक व्याकरण जो एलएल (1) नहीं है, उसे समकक्ष एलएल (1) व्याकरण में घटाया जा सकता है। इन परिवर्तनों में, सबसे कुशल वाम गुणनखंडन और निष्कासन हैं वाम प्रत्यावर्तन... यहां बनाने के लिए दो बिंदु हैं। सबसे पहले, इन परिवर्तनों के बाद प्रत्येक व्याकरण एलएल (1) नहीं बन जाता है, और दूसरी बात, ऐसे परिवर्तनों के बाद, परिणामी व्याकरण कम समझ में आता है।

तत्काल बाएं रिकर्सन, यानी, रिकर्सन, को निम्न तरीके से हटाया जा सकता है। सबसे पहले, हम ए-नियमों को समूहित करते हैं:

जहां कोई भी रेखा A से शुरू नहीं होती है। फिर इस नियम सेट को से बदलें

जहां ए "एक नया नॉनटर्मिनल है। वही चेन पहले की तरह नॉनटर्मिनल ए से आउटपुट हो सकती हैं, लेकिन अब वे नहीं हैं वाम प्रत्यावर्तन... यह प्रक्रिया सभी प्रत्यक्ष हटा देती है वाम प्रत्यावर्तनलेकिन दो या दो से अधिक चरणों वाले बाएं रिकर्सन को हटाया नहीं जाता है। नीचे दिया गया एल्गोरिथम 4.8आपको सभी को हटाने की अनुमति देता है वाम प्रत्यावर्तनव्याकरण से।

एल्गोरिथम 4.8... हटाया जा रहा है वाम प्रत्यावर्तन.

प्रवेश... ई-नियमों के बिना केएस-व्याकरण जी (जैसे ए -> ई)।

उत्पादन... केएस-व्याकरण जी "बिना वाम प्रत्यावर्तनजी के बराबर

तरीका... चरण 1 और 2 का पालन करें।

(1) G के गैर टर्मिनलों को किसी भी क्रम में व्यवस्थित करें।

(2) निम्नलिखित प्रक्रिया करें:

चरण 2 पर बाहरी लूप के (i-1) वें पुनरावृत्ति के बाद, प्रपत्र के किसी भी नियम के लिए कहाँ के< i, выполняется s >क। नतीजतन, अगले पुनरावृत्ति पर (i द्वारा) आंतरिक लूप (जे द्वारा) क्रमिक रूप से किसी भी नियम में एम द्वारा निचली सीमा को बढ़ाता है जब तक एम> = मैं। फिर डायरेक्ट डिलीट करने के बाद वाम प्रत्यावर्तन A i-नियमों के लिए, m, i से बड़ा हो जाता है।

एल्गोरिथम 4.8लागू होता है यदि व्याकरण में कोई ई-नियम नहीं है (फॉर्म ए -> ई के नियम)। व्याकरण में उपलब्ध ई-नियमों को पहले ही हटाया जा सकता है। परिणामी व्याकरण बिना वाम प्रत्यावर्तनई-नियम हो सकते हैं।

वाम गुणनखंड

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

अगर - दो ए-नियम और इनपुट श्रृंखला एक गैर-रिक्त स्ट्रिंग से शुरू होती है, जो कि आउटपुट है हम नहीं जानते कि पहले नियम के अनुसार विस्तार करना है या दूसरे के अनुसार। आप तैनाती करके निर्णय को स्थगित कर सकते हैं। फिर, विश्लेषण करने के बाद कि क्या घटा है, आप द्वारा या द्वारा विस्तार कर सकते हैं। वाम-कारक नियम रूप लेते हैं

एल्गोरिथम 4.9... व्याकरण का वाम गुणनखंड।

प्रवेश... सीएस व्याकरण जी.

उत्पादन... एक वाम-कारक सीएस-व्याकरण जी ", जी के बराबर।

तरीका... प्रत्येक नॉनटर्मिनल ए के लिए, इसके दो या अधिक विकल्पों के लिए सबसे लंबा उपसर्ग खोजें। यदि, अर्थात्, एक गैर-तुच्छ सामान्य उपसर्ग है, तो सभी A-नियमों को बदलें

जहाँ z उन सभी विकल्पों को दर्शाता है जो से शुरू नहीं होते हैं

जहां ए "एक नया नॉनटर्मिनल है। इस परिवर्तन को तब तक लागू करें जब तक कि दो विकल्पों में एक सामान्य उपसर्ग न हो।

उदाहरण 4.9... सशर्त बयानों के व्याकरण पर फिर से विचार करें उदाहरण 4.6:

एस -> अगर ई तो एस | अगर ई तो एस और एस | एक ई -> बी

वाम गुणनखंड के बाद, व्याकरण रूप लेता है

एस -> अगर ई तो एसएस "| ए एस" -> अन्य एस | ई ई -> बी

दुर्भाग्य से, व्याकरण अस्पष्ट रहता है, और इसलिए LL (1) व्याकरण नहीं है।

(समय: 1 सेकंड। मेमोरी: 16 एमबी कठिनाई: 20%)

औपचारिक व्याकरण और ऑटोमेटा (TFGiA) के सिद्धांत में, तथाकथित द्वारा एक महत्वपूर्ण भूमिका निभाई जाती है संदर्भ मुक्त व्याकरण(केएस-व्याकरण)। एक सीएस व्याकरण एक चौगुनी है जिसमें एक सेट एन नॉनटर्मिनल प्रतीक, एक सेट टी टर्मिनल प्रतीक, एक सेट पी नियम (प्रोडक्शंस), और एक प्रारंभिक प्रतीक एस सेट एन से संबंधित है।

P के प्रत्येक उत्पादन p का रूप A -> . है , जहां A एक गैर-टर्मिनल वर्ण (N से A) है और a एक स्ट्रिंग है जिसमें टर्मिनल और गैर-टर्मिनल वर्ण हैं। शब्द आउटपुट की प्रक्रिया केवल प्रारंभिक वर्ण S वाली एक पंक्ति से शुरू होती है। उसके बाद, प्रत्येक चरण में, वर्तमान पंक्ति में शामिल गैर-टर्मिनल वर्णों में से एक को प्रस्तुतियों में से एक के दाईं ओर से बदल दिया जाता है जिसमें यह बाईं ओर होता है पक्ष। यदि इस तरह के ऑपरेशन के बाद केवल टर्मिनल वर्णों वाली एक स्ट्रिंग प्राप्त होती है, तो आउटपुट प्रक्रिया समाप्त हो जाती है।

कई सैद्धांतिक समस्याओं में, तथाकथित पर विचार करना सुविधाजनक है सामान्य रूपव्याकरण। व्याकरण को सामान्य करने की प्रक्रिया अक्सर बाएं रिकर्सन को खत्म करने से शुरू होती है। इस समस्या में, हम केवल इसके विशेष मामले पर विचार करेंगे, जिसे डायरेक्ट लेफ्ट रिकर्सन कहा जाता है। अनुमान नियम ए -> आर को तत्काल बाएं रिकर्सन शामिल कहा जाता है यदि स्ट्रिंग आर का पहला अक्षर ए है।

सीएस-व्याकरण सेट है। सीधे बाएँ पुनरावर्तन वाले नियमों की संख्या ज्ञात करना आवश्यक है।

इनपुट डेटा

इनपुट फ़ाइल INPUT.TXT की पहली पंक्ति में व्याकरण में नियमों की संख्या n (1 ≤ n ≤ 1000) शामिल है। अगली n पंक्तियों में से प्रत्येक में एक नियम होता है। गैर-टर्मिनल प्रतीकों को अंग्रेजी वर्णमाला के बड़े अक्षरों, टर्मिनल प्रतीकों - लोअरकेस अक्षरों द्वारा दर्शाया जाता है। उत्पादन का बायाँ भाग दायीं ओर से प्रतीकों द्वारा अलग किया जाता है ->। प्रोडक्शन का राइट साइड 1 से 30 कैरेक्टर लंबा है।

औपचारिक व्याकरण का चॉम्स्की वर्गीकरण

व्याकरण प्रकार 0 (सामान्य)। नियम α → β . के रूप में हैं

टाइप 1 व्याकरण (संदर्भ संवेदनशील, सीवी)

नियम αAβ → αγβ के रूप में हैं। γ V + से संबंधित है, अर्थात, व्याकरण गैर-छोटा है

α, β कहा जाता है बाएँ और दाएँ संदर्भ

टाइप 2 व्याकरण (संदर्भ मुक्त, केएस)

नियम A → α के रूप में हैं। α V * से संबंधित है, अर्थात, व्याकरण को छोटा किया जा सकता है => KZ में KS भाषाएँ शामिल नहीं हैं

बीएनएफ के सबसे करीब

टाइप 3 व्याकरण (स्वचालित, नियमित)

नियम ए → एबी, ए → ए, ए → ε . के रूप में हैं

ऑटोमेटा भाषाएं केएस भाषाओं में समाहित हैं

उदाहरण। एक व्याकरण जो सही कोष्ठक अभिव्यक्तियों की भाषा उत्पन्न करता है।

एस → (एस) | एसएस | मैं

स्पॉनिंग (आउटपुट)

पदनाम

=> + (1 या अधिक)

=> * (0 या अधिक)

व्याकरण का भावात्मक रूपएक स्ट्रिंग है जिसे प्रारंभ चरित्र से घटाया जा सकता है।

व्याकरण का वाक्य (वाक्य)एक वाक्य-मात्र रूप है।

भाषा एल (जी) व्याकरण- यह उसके सभी प्रस्तावों का सेट है।

दंतकथा:

बाएँ, दाएँ आउटपुट (स्पॉनिंग)।

खंड i + i * i . के लिए बाएँ और दाएँ आउटपुट

वाक्य पंक्ति का आउटपुट ट्री (वाक्यविन्यास ट्री, पार्स ट्री)। स्पॉनिंग के विपरीत, आउटपुट ऑर्डर के बारे में जानकारी को इससे बाहर रखा गया है।

पार्स ट्री क्राउन - बाएं से दाएं पत्ती लेबल की एक श्रृंखला

वह व्याकरण जो किसी वाक्य के लिए एक से अधिक पार्स ट्री देता है, कहलाता है अस्पष्ट.

अस्पष्ट व्याकरण का एक उदाहरण। अंकगणितीय अभिव्यक्तियों का व्याकरण।

ई → ई + ई | ई * ई | मैं

चेन i + i * i . के लिए दो पार्स ट्री

अस्पष्ट व्याकरण का एक उदाहरण। सशर्त ऑपरेटर व्याकरण

एस → अगर बी तो एस

| अगर बी तो एस और एस

जंजीर लगाने के लिए दो पार्स पेड़ अगर बी तो अगर बी तो ए

एक समान असंदिग्ध व्याकरण में परिवर्तित करना:

एस → अगर बी तो एस



| अगर b तो S2 और S

S2 → अगर b तो S2 और S2

44 औपचारिक भाषाएँ और व्याकरण: गैर-रिक्त, परिमित और अनंत भाषाएँ

45 ऑटोमेटा की तुल्यता और न्यूनीकरण

परिमित राज्य मशीनों की तुल्यता

मान लें कि S एक वर्णमाला (प्रतीकों का एक सीमित सेट) है और S * वर्णमाला S के सभी शब्दों का सेट है। आइए हम अक्षर e द्वारा एक खाली शब्द को निरूपित करें, अर्थात, इसमें अक्षर (S से प्रतीक) बिल्कुल नहीं होते हैं, लेकिन चिह्न × शब्दों के एट्रिब्यूशन (संयोजन) का संचालन है।

तो, आव × वा = आव्वा। असाइनमेंट ऑपरेशन का × चिह्न अक्सर छोड़ा जाता है।

अक्षर S के शब्दों को छोटे ग्रीक अक्षरों a, b, g, .... द्वारा दर्शाया जाएगा। जाहिर है, e असाइनमेंट ऑपरेशन के लिए एक इकाई है:

यह भी स्पष्ट है कि असाइनमेंट ऑपरेशन सहयोगी है, यानी। (एबी) जी = ए (बीजी)।

इस प्रकार, असाइनमेंट ऑपरेशन के संबंध में वर्णमाला एस में सभी शब्दों का सेट एस * एकता के साथ एक अर्धसमूह है, यानी। मोनोइड;

S * को अक्षर S के ऊपर एक मुक्त मोनॉयड कहा जाता है।

राज्य मशीन न्यूनीकरण

विभिन्न राज्य मशीनें एक ही तरह से काम कर सकती हैं, भले ही उनके पास अलग-अलग राज्य हों। एक महत्वपूर्ण कार्य न्यूनतम राज्य मशीन को ढूंढना है जो दिए गए ऑटोमेटन मैपिंग को लागू करता है।

ऑटोमेटन समकक्ष के दो राज्यों को कॉल करना स्वाभाविक है, जिन्हें किसी भी इनपुट शब्दों से अलग नहीं किया जा सकता है।

परिभाषा 1: एक राज्य मशीन के दो राज्य p और q

A = (S, X, Y, s0, d, l) समतुल्य कहलाते हैं (p ~ q द्वारा निरूपित) यदि ("aÎ X *) l * (p, a) = l * (q, a)

46 सिंगल-टेप और मल्टी-टेप ट्यूरिंग मशीनों की समानता

जाहिर है, के-टेप एमटी की अवधारणा "साधारण" सिंगल-टेप मशीन की अवधारणा से व्यापक है। परिभाषा 6. (के + 1) -टेप एमटी एम प्रोग्राम डब्ल्यू के साथ एक के-टेप मशीन एम का अनुकरण करता है यदि इनपुट शब्दों (x1, x2, ..., xk) के किसी भी सेट के लिए काम का परिणाम एम के साथ मेल खाता है समान इनपुट डेटा पर कार्य M का परिणाम। यह माना जाता है कि सबसे पहले w शब्द (k + 1) th टेप M पर लिखा जाता है। परिणाम को रोकने के क्षण में एमटी के पहले k टेप की स्थिति के रूप में समझा जाता है, और यदि M किसी दिए गए इनपुट पर नहीं रुकता है, तो इसका अनुकरण करने वाली मशीन को इस इनपुट पर भी नहीं रुकना चाहिए।

परिभाषा 7. (के + 1) - टेप एमटी एम * को के-टेप मशीनों के लिए एक सार्वभौमिक ट्यूरिंग मशीन कहा जाता है यदि किसी के-टेप मशीन एम के लिए एक प्रोग्राम डब्ल्यू है जिस पर एम * एम अनुकरण करता है। नोट: परिभाषा में यूनिवर्सल एमटी की एक ही मशीन एम को अलग-अलग के-ड्रॉ फ्रेम (विभिन्न कार्यक्रमों पर डब्ल्यू) का अनुकरण करना चाहिए। निम्नलिखित प्रमेय पर विचार करें। प्रमेय 3. किसी भी k≥1 के लिए एक सार्वभौमिक (k + 1) है - ट्यूरिंग टेप मशीन। सबूत। आइए हम प्रमेय को रचनात्मक रूप से सिद्ध करें, अर्थात्, आइए हम दिखाएं कि आवश्यक यूनिवर्सल मशीन एम * का निर्माण कैसे किया जा सकता है। आइए जटिल विवरणों को छोड़कर केवल सामान्य निर्माण योजना पर विचार करें। मुख्य विचार सिम्युलेटेड ट्यूरिंग मशीन के विवरण को एक अतिरिक्त (k + 1) -थ टेप पर रखना और सिमुलेशन प्रक्रिया में इस विवरण का उपयोग करना है।

परिभाषा 8. हम कहते हैं कि एक ट्यूरिंग मशीन M एक आंशिक फलन की गणना करता है f: A * → A * यदि मशीन M के पहले टेप पर लिखे गए किसी x∈A * के लिए: यदि f (x) परिभाषित है, तो M रुक जाता है, और फिलहाल मशीन के आखिरी टेप पर स्टॉप में f (x) शब्द है; यदि f (x) परिभाषित नहीं है, तो मशीन M रुकती नहीं है।

परिभाषा 9. हम कहते हैं कि मशीन एम और एम बराबर हैं यदि वे एक ही कार्य की गणना करते हैं। तुल्यता की धारणा अनुकरण की तुलना में "कमजोर" है: यदि मशीन M 'मशीन M का अनुकरण करती है, तो मशीन M' M के बराबर है; बातचीत आम तौर पर सच नहीं है। दूसरी ओर, सिमुलेशन के लिए आवश्यक है कि M में M के समान रिबन की संख्या कम से कम हो, जबकि तुल्यता के लिए यह आवश्यक नहीं है। यह वह गुण है जो हमें निम्नलिखित प्रमेय बनाने और सिद्ध करने की अनुमति देता है।

प्रमेय 4. समय जटिलता टी (एन) के साथ किसी भी के-टेप मशीन एम के लिए, समय जटिलता टी ′ (एन) = ओ (टी 2 (एन)) के साथ एक समकक्ष एक-टेप मशीन एम मौजूद है।

48 CF व्याकरण के समतुल्य परिवर्तन: श्रृंखला नियमों का बहिष्करण, एक मनमाना व्याकरण नियम को हटाना

परिभाषा।फॉर्म का व्याकरण नियम , कहां , वी ए कहा जाता है जंजीर.

कथन।एक CS-व्याकरण के लिए जिसमें शृंखला के नियम हैं, एक समान व्याकरण "का निर्माण संभव है, जिसमें शृंखला नियम शामिल नहीं हैं।

प्रमाण के पीछे का विचार इस प्रकार है। यदि व्याकरण स्कीमा है

आर = (..., ,..., , ... , },

तो ऐसा व्याकरण एक स्कीमा वाले व्याकरण के बराबर होता है

आर "= (..., ,...},

श्रृंखला के सर्किट आर के साथ व्याकरण में आउटपुट के बाद से a :

एक स्कीमा आर के साथ व्याकरण में प्राप्त किया जा सकता है "नियम का उपयोग कर .

सामान्य स्थिति में, अंतिम कथन का प्रमाण निम्नानुसार किया जा सकता है। हम R को दो उपसमुच्चय R 1 और R 2 में विभाजित करते हैं, जिसमें R 1 में फॉर्म के सभी नियम शामिल हैं

R 1 से प्रत्येक नियम के लिए, हम नियमों का समुच्चय S ( ), जो इस तरह बनाए गए हैं:

अगर *और आर 2 में एक नियम है α, जहां α शब्दकोश की श्रृंखला है (वी टी वी ए) *, फिर एस में ( ) नियम चालू करें α.

आइए हम नियम R 2 और सभी निर्मित समुच्चय S (S) को मिलाकर एक नई योजना R "का निर्माण करें। ) हम एक व्याकरण प्राप्त करते हैं "= (वी टी, वी ए, आई, आर"), जो दिए गए एक के बराबर है और इसमें फॉर्म के नियम नहीं हैं .

एक उदाहरण के रूप में, हम योजना के साथ व्याकरण 1.9 से श्रृंखला नियमों को समाप्त करते हैं:

आर = ( +|,

*|,

() | क)

सबसे पहले, हम व्याकरण के नियमों को दो सबसेट में विभाजित करते हैं:

आर 1 = ( , },

आर 2 = ( +, *, () | क)

R 1 से प्रत्येक नियम के लिए एक संगत उपसमुच्चय की रचना कीजिए।

एस ( ) = { *, () | ए),

एस ( ) = { () | क)

नतीजतन, हमें फॉर्म में चेन नियमों के बिना वांछित व्याकरण योजना मिलती है:

आर 2 यू एस ( ) हम ( ) = { + | * | () | ए,

* | () | ए,

() | ए)

विचाराधीन अंतिम प्रकार के परिवर्तन व्याकरण से एक खाली दाहिने हाथ के साथ नियमों को हटाने से जुड़े हैं।

परिभाषा।नियम देखें $ कहा जाता है अशक्त करने वाला नियम.

49. केएस-व्याकरण के समतुल्य परिवर्तन: बेकार प्रतीकों को हटाना।

एक मनमाना सीएस-व्याकरण दिया जाए जी ... नॉनटर्मिनल इस व्याकरण को कहा जाता है उत्पादक यदि कोई टर्मिनल श्रृंखला मौजूद है (एक खाली सहित) जैसे कि Þ * अनुत्पादक।

प्रमेय। प्रत्येक केएस व्याकरण अनुत्पादक गैर-टर्मिनलों के बिना एक केएस व्याकरण के बराबर है।

नॉनटर्मिनल व्याकरण जी बुलाया प्राप्त अगर ऐसी कोई जंजीर है , क्या एस Þ * ... अन्यथा, अटर्मिनल को कहा जाता है अप्राप्य।

प्रमेय। प्रत्येक सीएफ व्याकरण एक सीएफ व्याकरण के बराबर है जिसमें कोई पहुंच योग्य गैर-टर्मिनल नहीं है।

केएस-व्याकरण में एक गैर-टर्मिनल प्रतीक को कहा जाता है बेकार (या अनावश्यक) यदि यह अप्राप्य या अनुत्पादक है।

प्रमेय। प्रत्येक सीएस व्याकरण एक सीएस व्याकरण के बराबर होता है जिसमें कोई बेकार गैर-टर्मिनल नहीं होता है।

उदाहरण।व्याकरण में बेकार प्रतीकों को हटा दें

एस® एसी | ए; ए ® टैक्सी; बी ® बी; सी ® ए।

चरण 1... एक सेट का निर्माण प्राप्तपात्र: {एस} ® { एस, सी, ए}® { एस, सी, ए, बी}. सभी गैर-टर्मिनल पहुंच योग्य हैं। अगम्य कोई व्याकरण नहीं बदलता है।

चरण 2... एक सेट का निर्माण उत्पादकपात्र: {सी, बी}® { एस, सी, बी}. हमें वह मिलता है - उत्पादक नहीं। हम इसे और इसके साथ के सभी नियमों को व्याकरण से बाहर फेंक देते हैं। हम पाते हैं

एस® एसी; बी ® बी; सी ® ए।

चरण 3... एक सेट का निर्माण प्राप्तनए व्याकरण के प्रतीक: {एस} ® { अनुसूचित जाति}. हमें वह मिलता है बी अप्राप्य। हम इसे और इसके साथ के सभी नियमों को व्याकरण से बाहर फेंक देते हैं। हम पाते हैं

एस® एसी; सी ® ए।

यह अंतिम परिणाम है।

50. केएस-व्याकरण के समतुल्य परिवर्तन: बाएं रिकर्सन का उन्मूलन, बाएं कारककरण

बाएं रिकर्सन को हटा रहा है

भविष्य कहनेवाला विश्लेषण का उपयोग करने में मुख्य कठिनाई इनपुट भाषा के लिए एक व्याकरण खोजना है जिसका उपयोग विशिष्ट रूप से परिभाषित इनपुट के साथ एक विश्लेषण तालिका बनाने के लिए किया जा सकता है। कभी-कभी, कुछ सरल परिवर्तनों के साथ, एक व्याकरण जो एलएल (1) नहीं है, उसे समकक्ष एलएल (1) व्याकरण में घटाया जा सकता है। इन परिवर्तनों में, सबसे कुशल वाम गुणनखंडन और निष्कासन हैं वाम प्रत्यावर्तन... यहां बनाने के लिए दो बिंदु हैं। सबसे पहले, इन परिवर्तनों के बाद प्रत्येक व्याकरण एलएल (1) नहीं बन जाता है, और दूसरी बात, ऐसे परिवर्तनों के बाद, परिणामी व्याकरण कम समझ में आता है।

तत्काल बाएं रिकर्सन, यानी, रिकर्सन, को निम्न तरीके से हटाया जा सकता है। सबसे पहले, हम ए-नियमों को समूहित करते हैं:

जहां कोई भी रेखा A से शुरू नहीं होती है। फिर इस नियम सेट को से बदलें

जहां ए "एक नया नॉनटर्मिनल है। वही चेन पहले की तरह नॉनटर्मिनल ए से आउटपुट हो सकती हैं, लेकिन अब वे नहीं हैं वाम प्रत्यावर्तन... यह प्रक्रिया सभी प्रत्यक्ष हटा देती है वाम प्रत्यावर्तनलेकिन दो या दो से अधिक चरणों वाले बाएं रिकर्सन को हटाया नहीं जाता है। नीचे दिया गया एल्गोरिथम 4.8आपको सभी को हटाने की अनुमति देता है वाम प्रत्यावर्तनव्याकरण से।

वाम गुणनखंड

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

अगर - दो ए-नियम और इनपुट श्रृंखला एक गैर-रिक्त स्ट्रिंग से शुरू होती है, जो कि आउटपुट है हम नहीं जानते कि पहले नियम के अनुसार विस्तार करना है या दूसरे के अनुसार। आप तैनाती करके निर्णय को स्थगित कर सकते हैं। फिर, विश्लेषण करने के बाद कि क्या घटा है, आप द्वारा या द्वारा विस्तार कर सकते हैं। वाम-कारक नियम रूप लेते हैं

51. ट्यूरिंग मशीन की भाषा।

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

नियंत्रण उपकरण टेप के साथ बाएँ और दाएँ घूम सकता है, कुछ परिमित वर्णमाला के वर्णों को कोशिकाओं में पढ़ और लिख सकता है। खास है खालीएक वर्ण जो टेप की सभी कोशिकाओं को भरता है, उनमें से उन (परिमित संख्या) को छोड़कर, जिस पर इनपुट डेटा लिखा होता है।

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

ट्यूरिंग मशीन को कहा जाता है नियतात्मकयदि अधिक से अधिक एक नियम तालिका में राज्य और पट्टी प्रतीक के प्रत्येक संयोजन से मेल खाता है। यदि एक जोड़ी "धारीदार प्रतीक - राज्य" है जिसके लिए 2 या अधिक निर्देश हैं, तो ऐसी ट्यूरिंग मशीन कहलाती है गैर नियतात्मक.

एलएल (के) -संपत्ति व्याकरण पर अत्यधिक प्रतिबंध लगाता है। कभी-कभी व्याकरण को बदलना संभव होता है ताकि परिणामी व्याकरण हो संपत्ति एलएल (1) ... ऐसा परिवर्तन हमेशा सफल नहीं होता है, लेकिन यदि एलएल (1) व्याकरण प्राप्त करना संभव था, तो बिना बैकट्रैकिंग के पुनरावर्ती वंश की विधि का उपयोग विश्लेषक के निर्माण के लिए किया जा सकता है।

मान लीजिए कि आप निम्नलिखित व्याकरण द्वारा उत्पन्न भाषा के लिए एक पार्सर बनाना चाहते हैं:

+ टी | टी | टी

टी → टी * एफ | टी / एफ | एफ

एफअंक | ()

टर्मिनल सेट पहला (टी)सेट से भी संबंधित पहला (ई + टी), इसलिए, इनपुट श्रृंखला का विश्लेषण करते समय निष्पादित की जाने वाली प्रक्रिया कॉल के अनुक्रम को स्पष्ट रूप से निर्धारित करना असंभव है। समस्या यह है कि नॉनटर्मिनल नियम के दायीं ओर की पहली स्थिति में होता है, जिसका बायां पक्ष भी होता है ... ऐसी स्थिति में, नॉनटर्मिनल सीधे बाएं रिकर्सिव कहा जाता है।

नॉनटर्मिनल केएस व्याकरण जीबुलाया वाम पुनरावर्ती अगर व्याकरण में कोई आउटपुट है =>* अरे.

कम से कम एक बाएं पुनरावर्ती नियम वाला व्याकरण नहीं हो सकता एलएल (1)-व्याकरण।

दूसरी ओर, यह ज्ञात है कि प्रत्येक CF-भाषा को कम से कम एक गैर-लेवोरकर्सिव व्याकरण द्वारा परिभाषित किया जाता है।

    1. बाएं पुनरावर्तीता को समाप्त करने के लिए एल्गोरिदम

रहने दो जी = (एन, टी, पी, एस)- केएस व्याकरण और नियम ए → ओह 1 | अरे 2 | ... | अरे एन | वी 1 | वी 2 | ... | वी एमसे सभी नियमों का प्रतिनिधित्व करता है पीयुक्त बाईं ओर, और कोई भी जंजीर नहीं वी मैंनॉनटर्मिनल से शुरू नहीं होता .

सेट में जोड़ें एनएक और गैर टर्मिनल ए "और नियमों को प्रतिस्थापित करें बाईं ओर, निम्नलिखित में:

ए → वी 1 | वी 2 | ... | वी एम | वी 1 ए ' | वी 2 ए '| ... | वी एम ए "

ए '→ डब्ल्यू 1 | वू 2 | ... | वू एन | वू 1 ए '| वू 2 ए '| ...| वू एन ए "

आप साबित कर सकते हैं कि परिणामी व्याकरण मूल व्याकरण के बराबर है।

इस परिवर्तन को अंकगणितीय अभिव्यक्तियों का वर्णन करने वाले उपरोक्त व्याकरण में लागू करने के परिणामस्वरूप, हमें निम्नलिखित व्याकरण मिलता है:

टी | ते"

" → + टी | + ते"

टीएफ | फुट"

टी"→ * एफ | * फुट"

एफ → () | अंक

यह दिखाना आसान है कि परिणामी व्याकरण में संपत्ति है एलएल (1).

इसी तरह की एक और समस्या इस तथ्य से संबंधित है कि एक ही गैर-टर्मिनल के लिए दो नियम समान वर्णों से शुरू होते हैं।

उदाहरण के लिए,

एस → अगर ई तो एस और एस

एसअगर फिर एस

इस मामले में, आइए एक और नॉनटर्मिनल जोड़ें जो इन नियमों के विभिन्न अंत के अनुरूप होगा। हमें निम्नलिखित नियम मिलते हैं:

एसअगर फिर एस एस

एस" →

एस"→ अन्यथा एस

परिणामी व्याकरण के लिए, एक पुनरावर्ती वंश विधि लागू की जा सकती है।

    1. 9.1.4. बैकट्रैक के साथ रिकर्सिव डिसेंट।

पुनरावर्ती वंश पद्धति को लागू करने में सक्षम होने के लिए, आपको 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 की आवश्यकता है 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 व्याकरण को एक ऐसे रूप में रूपांतरित करता है जिसमें समुच्चय प्रथमप्रतिच्छेद न करें, जो एक जटिल प्रक्रिया है, इसलिए, व्यवहार में, एक तकनीक जिसे कहा जाता है बैकट्रैक के साथ पुनरावर्ती वंश .

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

यह पार्सिंग विधि बैकट्रैकिंग के बिना पुनरावर्ती वंश की तुलना में संभावित रूप से धीमी है, लेकिन इस मामले में यह व्याकरण को अपने मूल रूप में रखने और प्रोग्रामर के प्रयास को बचाने का प्रबंधन करता है।

वाम रिकर्सन वाला व्याकरण एलएल (1) व्याकरण नहीं है। नियमों पर विचार करें

(ए में बाएं रिकर्सन)

यहां दोनों गैर-टर्मिनल वेरिएंट के लिए पूर्ववर्ती प्रतीक ... इसी तरह, बाएं पुनरावर्ती लूप वाला व्याकरण एलएल (1) व्याकरण नहीं हो सकता है, उदाहरण के लिए

ईसा पूर्व

बीसीडी

सी

एक बाएं रिकर्सिव लूप वाले व्याकरण को केवल फॉरवर्ड लेफ्ट रिकर्सन वाले व्याकरण में परिवर्तित किया जा सकता है, और आगे, अतिरिक्त नॉनटर्मिनल्स को पेश करके, लेफ्ट रिकर्सन को पूरी तरह से समाप्त किया जा सकता है (वास्तव में, इसे एक राइट रिकर्सन द्वारा बदल दिया जाता है, जो पोज़ नहीं करता है एलएल (1) -प्रॉपर्टीज के संबंध में समस्या)।

एक उदाहरण के रूप में, जनरेटिव नियमों के साथ व्याकरण पर विचार करें


एस

बी बी

बीप्रतिलिपि

सीडीडी

सी

डीअज़ू


जिसमें एक बायां पुनरावर्ती लूप शामिल है ऐ बी सी डी... इस लूप को फॉरवर्ड लेफ्ट रिकर्सन से बदलने के लिए, हम नॉनटर्मिनल्स को निम्नानुसार ऑर्डर करते हैं: एस, ए, बी, सी, डी.

फॉर्म के सभी जनरेटिंग नियमों पर विचार करें

क्सीएक्सजे ,

कहां क्सीतथा Xj- गैर टर्मिनल, और γ - टर्मिनल और गैर-टर्मिनल प्रतीकों की एक स्ट्रिंग। जिसके लिए नियमों के संबंध में जे मैं, कोई कार्रवाई नहीं की जाती है। हालाँकि, यह असमानता सभी नियमों के लिए नहीं हो सकती है यदि कोई बायाँ पुनरावर्ती लूप है। हमारे द्वारा चुने गए क्रम में, हम एक नियम के साथ काम कर रहे हैं:

डीअज़ू

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

डीबीबीजे

जहां तक ​​कि बीपहले डीक्रम में, प्रक्रिया को दोहराया जाता है, जो नियम देता है:

डीसीसीबीजेड

फिर यह एक बार और दोहराता है और दो नियम देता है:

डीईसीबीजेड

डीडीडीसीबीजेड

रूपांतरित व्याकरण अब इस तरह दिखता है:

एस

बी बी

बीप्रतिलिपि

सीडीडी

सी

डीडीडीसीबीजेड

डीईसीबीजेड

इन सभी जनरेटिंग नियमों में आवश्यक रूप है, और बाएं रिकर्सिव लूप को फॉरवर्ड लेफ्ट रिकर्सन से बदल दिया जाता है। फॉरवर्ड लेफ्ट रिकर्सन को खत्म करने के लिए, हम एक नया नॉनटर्मिनल सिंबल पेश करते हैं जेडऔर नियमों को बदलें

डीईसीबीजेड

डीडीडीसीबीजेड

डीईसीबीजेड

डीईसीबीजेडजेड

जेडडीसीबीजेड

जेडडीसीबीजेडजेड

ध्यान दें कि परिवर्तन से पहले और बाद में डीएक नियमित अभिव्यक्ति उत्पन्न करता है

(ईसीबीजेड) (डीसीबीजेड) *

संक्षेप में, यह दिखाया जा सकता है कि यदि गैर-टर्मिनल बाईं ओर दिखाई देता है आर+ एसउत्पादक नियम, आरजिनमें से आगे बाएं रिकर्सन का उपयोग करें और एस- नहीं, यानी।

एα 1, एα 2,..., एαआर

β 1, β 2,..., β एस

तो इन नियमों को निम्नलिखित से बदला जा सकता है:

अनौपचारिक प्रमाण यह है कि परिवर्तन से पहले और बाद में एक नियमित अभिव्यक्ति उत्पन्न करता है ( β 1 | β 2 |... | β एस) ( α 1 | α 2 |... | α आर) *

यह ध्यान दिया जाना चाहिए कि बाएं रिकर्सन (या बाएं रिकर्सिव लूप) को समाप्त करके, हमें अभी भी एलएल (1) व्याकरण नहीं मिलता है, क्योंकि कुछ गैर-टर्मिनलों के लिए, परिणामी व्याकरण के नियमों के बाईं ओर, समान प्रतीकों से शुरू होने वाले वैकल्पिक दाहिने पक्ष हैं। इसलिए, बाएं रिकर्सन को समाप्त करने के बाद, व्याकरण को एलएल (1) फॉर्म में बदलना जारी रखना चाहिए।

17. व्याकरण को एलएल (1) फॉर्म में बदलना। गुणन.

गुणन

कई स्थितियों में, जिन व्याकरणों में LL (1) विशेषता नहीं होती है, उन्हें गुणनखंडन प्रक्रिया का उपयोग करके LL (1) व्याकरण में परिवर्तित किया जा सकता है। आइए ऐसी स्थिति के एक उदाहरण पर विचार करें।

पी→ शुरू डी; साथसमाप्त

डीडी, डी

डीडी

साथएस; साथ

साथएस

फ़ैक्टराइज़ेशन प्रक्रिया में, हम बाईं ओर एक नॉनटर्मिनल के लिए कई नियमों को प्रतिस्थापित करते हैं, जिनमें से दाईं ओर एक ही वर्ण (वर्णों की स्ट्रिंग) के साथ एक नियम के साथ शुरू होता है, जहां दाईं ओर सामान्य शुरुआत के बाद एक अतिरिक्त रूप से पेश किया जाता है गैर टर्मिनल इसके अलावा, व्याकरण को एक अतिरिक्त गैर-टर्मिनल के नियमों द्वारा पूरक किया जाता है, जिसके अनुसार नियम के मूल दाहिने हाथ के विभिन्न "अवशेष" इससे प्राप्त होते हैं। उपरोक्त व्याकरण के लिए, यह निम्नलिखित एलएल (1) व्याकरण देगा:

पी→ शुरू डी; साथसमाप्त

डीडी एक्स एक्स)

एक्स→ , डी(के लिए 1 नियम के अनुसार डीके लिए मूल व्याकरण डीअनुसरण करता है, डी)

एक्सε (के लिए दूसरे नियम के अनुसार डीके लिए मूल व्याकरण डीकुछ नहीं (खाली स्ट्रिंग))

साथएस यू(हम एक अतिरिक्त नॉनटर्मिनल पेश करते हैं यू)

यू→ ; साथ(के लिए 1 नियम के अनुसार सीके लिए मूल व्याकरण एसअनुसरण करता है; सी)

यूε (के लिए दूसरे नियम के अनुसार सीके लिए मूल व्याकरण एसकुछ नहीं (खाली स्ट्रिंग))

इसी तरह, नियम बनाना

एसएएसबी

एसएएससी

एसε

गुणनखंडन द्वारा नियमों में परिवर्तित किया जा सकता है

एसएएसएक्स

एसε

एक्सबी

एक्ससी

और परिणामी व्याकरण एलएल (1) है। हालाँकि, गुणन प्रक्रिया को सामान्य मामले में विस्तारित करके स्वचालित नहीं किया जा सकता है। निम्नलिखित उदाहरण दिखाता है कि क्या हो सकता है। नियमों पर विचार करें


1. पीक्यूएक्स

2. पीरयू

3. क्यूवर्गमीटर

4. क्यूक्यू

5. आरएसआरएन

6. आरआर


दो विकल्पों के लिए गाइड प्रतीकों के दोनों सेट पीशामिल होना एस, और "सहने" की कोशिश कर रहा है एसकोष्ठक के बाहर ", हम प्रतिस्थापित करते हैं क्यूतथा आरनियम 1 और 2 के दाईं ओर:


पीएसक्यूएमएक्स

पीएसआरएनवाई

पीक्यूएक्स

पीरयू


इन नियमों को निम्नलिखित से बदला जा सकता है:


पीक्यूएक्स

पीरयू

पीसपा 1

पी 1 → क्यूएमएक्स

पी 1 → रेनी


के लिए नियम पी1के लिए मूल नियमों के समान हैं पीऔर गाइड प्रतीकों के अतिव्यापी सेट हैं। हम इन नियमों को उसी तरह बदल सकते हैं जैसे नियमों के लिए पी:


पी 1 → एसक्यूएमएमएक्स

पी 1 → क्यूएमएक्स

पी 1 → sRny

पी 1 → रेनी


फैक्टरिंग, हमें मिलता है