2012-05-08 23 views
5

मैं निम्नलिखित व्याकरण, जो मुझे बताया गया हूँ एलआर (1) नहीं बल्कि एसएलआर (1) है:यह व्याकरण एलआर (1) कैसे है लेकिन एसएलआर (1) नहीं है?

एस :: = एक एक | बी सी | डी सी | ख घ एक

एक :: = घ

मुझे समझ नहीं आता क्यों है। आप यह कैसे साबित करेंगे?

+5

आप कंप्यूटर व्यापार में एक कैरियर बनाने जा रहे हैं, तो आप की जरूरत है जब आप कुछ नहीं जानते तो पढ़ने के लिए सीखना। एलआर भाषाओं पर ध्यान से विकिपीडिया पढ़ें, और इसे काम करें।अगर इसमें घूरने और समझने में कुछ समय लगता है, तो हो; यह ठेठ है। http://en.wikipedia.org/wiki/LR_parser –

+0

धन्यवाद, आप बहुत उपयोगी रहे हैं! –

+0

एक गंभीर तरीके से, हाँ: -} –

उत्तर

8

इस बात को समझने का एक तरीका व्याकरण के लिए एलआर (1) और एसएलआर (1) पार्सर्स बनाने का प्रयास करना होगा। अगर हमें ऐसा करने के दौरान किसी भी बदलाव/कमी या कम/विवादों को कम किया जाता है, तो हम दिखा सकते हैं कि व्याकरण उन भाषाओं में से किसी एक वर्ग से संबंधित नहीं होना चाहिए।

चलिए एसएलआर (1) पार्सर से शुरू करते हैं। सबसे पहले, हमें व्याकरण के लिए एलआर (0) विन्यास सेट की गणना करने की आवश्यकता है। ये यहां देखा जाता है:

(1) 
S -> .aA 
S -> .bAc 
S -> .dc 
S -> .bda 

(2) 
S -> a.A 
A -> .d 

(3) 
S -> aA. 

(4) 
A -> d. 

(5) 
S -> b.Ac 
S -> b.da 
A -> .d 

(6) 
S -> bA.c 

(7) 
S -> bAc. 

(8) 
S -> bd.a 
A -> d. 

(9) 
S -> bda. 

(10) 
S -> d.c 

(11) 
S -> dc. 

इसके बाद, हम सब nonterminals के लिए अनुसरण सेट प्राप्त करने की आवश्यकता। यह यहाँ दिखाया गया है:

FOLLOW(S) = { $ } 
FOLLOW(A) = { $, c } 

को देखते हुए यह है, हम वापस जाने के लिए और एसएलआर में एलआर (0) configurating सेट उन्नयन कर सकते हैं (1) configurating सेट:

(1) 
S -> .aA [ $ ] 
S -> .bAc [ $ ] 
S -> .dc [ $ ] 
S -> .bda [ $ ] 

(2) 
S -> a.A [ $ ] 
A -> .d  [ $, c ] 

(3) 
S -> aA. [ $ ] 

(4) 
A -> d.  [ $, c ] 

(5) 
S -> b.Ac [ $ ] 
S -> b.da [ $ ] 
A -> .d  [ $, c ] 

(6) 
S -> bA.c [ $ ] 

(7) 
S -> bAc. [ $ ] 

(8) 
S -> bd.a [ $ ] 
A -> d.  [ $, c ] 

(9) 
S -> bda. [ $ ] 

(10) 
S -> d.c [ $ ] 

(11) 
S -> dc. [ $ ] 
दिलचस्प बात यह

, वहाँ कोई संघर्ष कर रहे हैं यहाँ! एकमात्र संभावित शिफ्ट/संघर्ष को कम करना राज्य (8) में है, लेकिन यहां कोई संघर्ष नहीं है क्योंकि शिफ्ट कार्रवाई a पर है और यह $ पर है। नतीजतन, यह व्याकरण वास्तव में एसएलआर (1) है। चूंकि कोई एसएलआर (1) व्याकरण भी एलआर (1) है, इसका मतलब है कि व्याकरण एसएलआर (1) और एलआर (1) दोनों है।

आशा है कि इससे मदद मिलती है!

+1

बस ध्यान दें कि प्रत्येक व्याकरण एसएलआर (1) एलआर (1) व्याकरण है लेकिन सभी एलआर (1) एसएलआर (1) –

+0

नहीं है यदि आप एक उदाहरण की तलाश में हैं तो आप कर सकते हैं -> XX 2) एक्स -> कुल्हाड़ी 3) एक्स -> b' –

+0

@templatetypedef, क्या होगा अगर यह बीडीए हो गया होता '1) एस: इस व्याकरण का उपयोग करें। [$] राज्य में 8. क्या संघर्ष कम हो जाएगा? क्योंकि हमारे पास केवल एक ही प्रतीक है जो आम है। – Zephyr

7

मैं ऊपर जवाब पर टिप्पणी करने के लिए पर्याप्त कर्म नहीं है, और मैं इस सवाल का थोड़ी देर हो चुकी हूँ, लेकिन ...

मैं कहीं और एक उदाहरण है और ओ पी के रूप में इस व्याकरण देखा है वास्तव में एक टाइपो बनाया। यह होना चाहिए:

एस :: = ए | बी सी | डी सी | ख घ एक

एक :: = घ

अर्थात, एस के पहले खंड है 'एक एक', नहीं 'एक एक'।

में इस मामले एक के लिए निर्धारित इस प्रकार है {$, एक, ग} और राज्य में एक एसएलआर संघर्ष है 8.