2011-03-31 15 views
24

इस wikipedia पृष्ठ से:पीईजी और सीएफजी के बीच अंतर क्या हैं?

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

पीईजी का विकल्प ऑपरेटर मिलान करने वाले शॉर्ट सर्किट क्यों करता है? क्या यह स्मृति उपयोग को कम करने के लिए है (ज्ञापन के कारण)?

मुझे यकीन नहीं है कि पसंद ऑपरेटर नियमित अभिव्यक्तियों में क्या है लेकिन मान लीजिए कि यह एक स्वर से मेल खाने के लिए /[aeiou]/ है। तो यह regex कम्यूटिव है क्योंकि मैं इसे 5 में से किसी एक में लिखा होगा! (पांच फैक्टोरियल) स्वर चरित्रों के क्रमपरिवर्तन? यानी /[aeiou]//[eiaou]/ जैसा व्यवहार करता है। इसे कम्यूटिव होने का क्या फायदा है? (सी.एफ़ पेग की गैर-commutativity)

परिणाम यह है कि अगर एक CFG एक पेग को सीधे लिप्यंतरण है, पूर्व में किसी भी अस्पष्टता से निर्धारणात्मक संभव पार्स से एक पार्स पेड़ उठा हल हो गई है है। सावधानीपूर्वक उस क्रम को चुनना जिसमें व्याकरण विकल्प निर्दिष्ट हैं, एक प्रोग्रामर के पास नियंत्रण का सौदा है जिस पर पार्स पेड़ चयनित है।

क्या यह कह रहा है कि पीईजी का व्याकरण सीएफजी से बेहतर है?

+0

"सुपीरियर"? "श्रेष्ठ" के लिए आप क्या मानदंड हैं? – Gabe

+1

कम्यूटिटी के लिए, शब्द (हवाई जहाज) से निपटने की कोशिश कर रहे 'वायु हवाई जहाज) के बारे में सोचें। – xanatos

+0

ऐसा लगता है कि आप पसंद ऑपरेटर और चरित्र वर्ग की अवधारणाओं को भ्रमित कर रहे हैं। नियमित अभिव्यक्तियों में वर्ण वर्गों को स्क्वायर ब्रैकेट '[एईओयू] 'के साथ सीमित किया जाता है जबकि पसंद ऑपरेटर पाइप वर्ण' | 'होता है। पीईजी में पसंद ऑपरेटर बदले में स्लैश कैरेक्टर '/' है। – hippietrail

उत्तर

35

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

एक पीईजी व्याकरण निर्धारक है, जिसका अर्थ है कि किसी भी इनपुट को केवल एक ही तरीके से पार्स किया जा सकता है।

क्लासिक उदाहरण लेने के लिए; व्याकरण

if_statement := "if" "(" expr ")" statement "else" statement 
       | "if" "(" expr ")" statement; 

इनपुट के लिए आवेदन किया

if (x1) if (x2) y1 else y2 

या तो के रूप में

if_statement(x1, if_statement(x2, y1, y2)) 

या

पार्स नहीं किया जा सकता है
if_statement(x1, if_statement(x2, y1), y2) 

एक CFG-पार्सर एक शिफ्ट उत्पन्न होगा/कम -कफ्लिक्टिक्ट, क्योंकि यह मैं तय नहीं कर सकता एफ इसे "अन्य" कीवर्ड तक पहुंचने पर, स्थानांतरित करना चाहिए (एक और टोकन पढ़ें), या कम करें (नोड को पूरा करें)। बेशक, इस समस्या को हल करने के तरीके हैं।

एक पीईजी-पार्सर हमेशा पहली पसंद उठाएगा।

आपके लिए निर्णय लेने के लिए कौन सा बेहतर है। मेरी उद्देश्य राय यह है कि अक्सर पीईजी-व्याकरण लिखना आसान होता है, और सीएफजी व्याकरण का विश्लेषण करना आसान होता है।

+0

क्या आप ऐसे सीएफजी व्याकरण (2 पार्स पेड़ के साथ) का उदाहरण प्रदान कर सकते हैं? –

+0

अन्य उदाहरण के लिए धन्यवाद। अब यह स्पष्ट है। –

3

मुझे लगता है कि आप एलआर और अस्पष्टता के साथ सीएफजी को भ्रमित कर रहे हैं। ग्रामर निर्धारितवादी/नोडेटर्मिनिस्टिक नहीं हैं, हालांकि उनके पार्सर्स हो सकते हैं। एक संदिग्ध व्याकरण अभी भी सीएफजी है यदि यह परिभाषा का अनुपालन करता है, और पीईजी क्या करता है इसके लिए एक निर्धारक पार्सर बनाया जा सकता है।

+1

नहीं, सीएफजी कभी-कभी संदिग्ध होते हैं क्योंकि उनके "पसंद" ऑपरेटर की कोई प्राथमिकता नहीं होती है, इसलिए यदि कोई दिया गया स्ट्रिंग "पसंद" में दोनों विकल्पों से मेल खाती है, तो आपके पास अस्पष्टता है। पीईजी में "पसंद" में प्रथम-मैच-जीत प्राथमिकता है, इसलिए कोई अस्पष्टता नहीं है क्योंकि बाएं विकल्प * जरूरी * जीतता है। – aaronblohowiak

+2

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

संबंधित मुद्दे