यह संदर्भित पारदर्शिता के कारण है। बस के रूप में कोई समारोह
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
जैसे किसी भी असीमित-बड़े नियमों को रद्द कर देगा।