2012-01-11 17 views
7

मुझे आश्चर्य है कि क्या एएनटीएलआर वी 3, जो "एलएल (*)" के रूप में अपने आंतरिक पार्सिंग एल्गोरिदम प्रस्तुत करता है, पूरी तरह से पीईजी (पार्सिंग अभिव्यक्ति व्याकरण) पार्सर्स का प्रतिनिधि है।एलएल (*) बनाम पीईजी पार्सर्स: क्या अंतर है?

क्या कोई अंतर है?

उत्तर

1

ANTLR article पीईजी के बारे में गलत था।

एलएल (*) डीसीएफजी (निर्धारक संदर्भ मुक्त व्याकरण) का एक उप-समूह है, जो सीएफजी (संदर्भ मुक्त व्याकरण) का उप-समूह है।

पेग A{n}B{n}C{n} तरह संदर्भ संवेदनशील व्याकरण, जिसमें A और B और C सब तब हो n बार व्यक्त कर सकते हैं। यहाँ परिभाषा है:

s := &(x C) A+ y/ε 
x := A x B/A B 
y := B y C/B C 

लेकिन वहाँ (सबूत पंप लेम्मा शामिल है) CFG में इस तरह के व्याकरण को परिभाषित करने के लिए कोई रास्ता नहीं है। तो पीईजी सबसेट सीएफजी नहीं है। क्या पीईजी सीएफजी का सुपरसेट है? मुझे नहीं पता। डालूँगा (*) और पेग के बीच

दो मुख्य अंतर:

  1. डालूँगा (*) केवल एक DFA पैटर्न अग्रावलोकन सकते हैं, जबकि पेग एक पुनरावर्ती पैटर्न अग्रावलोकन कर सकते हैं। उदाहरण के लिए, पीईजी में आप नेस्टेड माता-पिता को देख सकते हैं जबकि एलएल (*) नहीं कर सकता है।

  2. पेग में चुनाव ऑपरेटर / प्राथमिकता विकल्प (या "अधिकार"), जिसका अर्थ है यदि आप नियम A/AB है, यह कभी नहीं दाहिने हाथ की ओर AB तक पहुँच जाता है। एलएल (*) में नियम A | AB के लिए, AB से मिलान करना संभव है।

आप एक अग्रदर्शी के बिना एक पेग व्याकरण है, या अपने अग्रदर्शी पैटर्न एक DFA में कम किया जा सकता है, तो यह डालूँगा (*) में अनुवाद किया जा सकता है। यदि नहीं, तो यह संभव नहीं है।

+0

आपका पीईजी-व्याकरण अभी तक सही नहीं है। यह ए {एन} बी {एन + 1} सी {एन + 1} भी पार्स करेगा। – CoronA

+0

@ कोरोन ए पॉइंटिंग के लिए धन्यवाद, मैंने यह सुनिश्चित करने के लिए अद्यतन व्याकरण के साथ जवाब संपादित किया है कि सी {ए} बी {एन} के बाद सही होता है। – luikore

1

उपकरण के अनुसार सूचीबद्ध here ANTLR एक पेग पार्सर की एक पूरी प्रतिनिधि है:

ANTLR, टेरेंस पार से एक अच्छी तरह से स्थापित पार्सर जेनरेटर, व्यापक पेग सुविधाओं का समर्थन करता है और डालूँगा पार्स तकनीकों के साथ पार्स करने packrat को जोड़ती है ।

+0

कुछ बाएं-रिकर्सिव पैकर एक्सटेंशन मौजूद हैं, जो जाहिर है, एएनटीएलआर द्वारा समर्थित नहीं हैं। –

3

ANTLR में आप, अपने व्याकरण में सभी उत्पादन नियमों पर वैश्विक बैक ट्रैकिंग सक्षम कर सकते हैं तो k >= 1 के लिए आप काफी पेग के रूप में एक ही पार्स सकता है। बेशक, सभी संभावित बैकट्रैकिंग के कारण, पार्सर का रन-टाइम घटता है। (कुछ) मेमोरी की लागत पर आप ज्ञापन को भी सक्षम कर सकते हैं, जो इसे रैखिक-पार्सर की तरह व्यवहार कर सकता है, जो रैखिक समय में इनपुट को पार्स करने में सक्षम है।

तो नहीं, इसमें कोई अंतर नहीं है w.r.t एएनटीएलआर और पीईजी/पैक्रेट (सही विकल्प सक्षम के साथ!)।

3

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

+0

404-ed। क्या आप एक अद्यतन लिंक प्रदान कर सकते हैं? – chakrit

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