2014-06-05 6 views
7

में सामान्यीकृत नीचे पार्सर कॉम्बिनेटर्स मुझे आश्चर्य है कि हास्केल में नीचे-ऊपर पार्सिंग के लिए हार्सेल में नीचे-ऊपर पार्सिंग के लिए कोई सामान्यीकृत पार्सर संयोजक क्यों नहीं है, जो शीर्ष नीचे पार्सिंग के लिए पारसीक संयोजकों की तरह है।
(मैं मिल सकता है कुछ अनुसंधान कार्य
https://haskell-functional-parsing.googlecode.com/files/Ljunglof-2002a.pdf http://www.di.ubi.pt/~jpf/Site/Publications_files/technicalReport.pdf के बाद वर्ष 2004 के दौरान लेकिन कुछ भी चला गया)हास्केल

वहाँ यह नहीं प्राप्त करने के लिए किसी भी विशेष कारण है?

उत्तर

11

यह संदर्भित पारदर्शिता के कारण है। बस के रूप में कोई समारोह

let x = 1:x 
let x = 1:1:1:x 
let x = 1:1:1:1:1:1:1:1:1:... -- if this were writeable 

के बीच का अंतर बता सकता है कोई समारोह एक व्याकरण जो एक सीमित ग्राफ़ और एक व्याकरण जो एक अनंत पेड़ है के बीच का अंतर बता सकते हैं। सभी संभावित पार्सिंग राज्यों को गिनने के लिए नीचे-ऊपर पार्सिंग एल्गोरिदम को व्याकरण को ग्राफ़ के रूप में देखने में सक्षम होना चाहिए।

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

numSequence n = string (show n) *> option() (numSequence (n+1)) 

n पर शुरू संख्याओं के किसी भी परिमित आरोही अनुक्रम स्वीकार करता है। इसमें अनगिनत कई अलग-अलग पार्सिंग राज्य हैं। (यह एक विषय से मुक्त तरीके से इस प्रतिनिधित्व करने के लिए संभव हो सकता है, लेकिन यह मुश्किल हो सकता है और कोड की अधिक समझ की तुलना में एक पार्स पुस्तकालय में सक्षम है, मुझे लगता है कि आवश्यकता होगी)

एक नीचे से ऊपर Combinator पुस्तकालय सकता है लिखा है, हालांकि यह थोड़ा बदसूरत है, सभी पारसर्स की आवश्यकता के द्वारा करने के लिए "लेबल" हो इस तरह से हो सकता है, यह है कि

  • एक ही लेबल हमेशा एक ही पार्सर को संदर्भित करता है, और
  • वहाँ केवल एक परिमित सेट लेबल

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

4

चूंकि लुई का जवाब नीचे-नीचे पार्सर संयोजक लाइब्रेरी एक यथार्थवादी नहीं है। इस पृष्ठ पर कोई व्यक्ति इस पृष्ठ पर जाता है बस हैकेल के नीचे ऊपर पार्सर जनरेटर, जो आप खोज रहे हैं उसे the Happy parser generator कहा जाता है। यह हैकेल के लिए yacc जैसा है।

4

जैसा कि लुक्की ने ऊपर कहा था: हास्केल का पुनरावर्ती पार्सर परिभाषाओं का उपचार नीचे-ऊपर पार्सिंग पुस्तकालयों की परिभाषा की अनुमति नहीं देता है। नीचे-ऊपर पार्सिंग लाइब्रेरी संभव है हालांकि यदि आप रिकर्सिव व्याकरण को अलग-अलग प्रतिनिधित्व करते हैं। आत्म-प्रचार के लिए माफी मांगने के साथ, एक (शोध) पार्सर लाइब्रेरी जो इस तरह के दृष्टिकोण का उपयोग करती है grammar-combinators है। यह एक व्याकरण परिवर्तन को लागू करता है जिसे वर्दी पाल रूपांतरण कहा जाता है जिसे मूल व्याकरण के लिए नीचे-ऊपर पार्सर प्राप्त करने के लिए शीर्ष-नीचे पार्सर एल्गोरिदम के साथ जोड़ा जा सकता है।