मैं एक संदर्भ मुक्त व्याकरण को Greibach सामान्य फॉर्म (जीएनएफ) में परिवर्तित कर रहा हूं। मुख्य परिवर्तन (होपक्रॉफ्ट & उलमैन से) व्याकरण के अनुक्रमित चर पर पुनरावृत्तियों का अनुक्रम है। यह अनिवार्य रूप से "स्टेटलेस" है। मैं उचित सूचकांक से अधिक परतों के अनुक्रम के रूप में यह लागू किया है (कार्यान्वयन काफी सीधा है):एक स्टेटलेस दुनिया में राज्य को रखने
gnf :: Ord a => Set (Rule a) -> Set (Rule a)
gnf rl = foldl step1 rl [1..maxIndex rl]
where step1 rl' k = foldl step2 rl' [1..k - 1]
where step2 rl'' j = noLR k (subst rl'' k j)
maxIndex rl नियमों का एक सेट में अधिकतम चर सूचकांक रिटर्न; subst rl k jk पर प्रतिस्थापन करता है-जिन नियमों के दाएं हाथ की ओर j -indexed चर के साथ शुरू होता है, द्वारा नियमों के अनुसार नियम। gnf करने के बाद, मुझे रिवर्स ऑर्डर में व्याकरण पर अंतिम पास करने की आवश्यकता है।
समस्या noLR, जो बाएं पुनरावर्ती कश्मीर -indexed नियमों के साथ एक व्याकरण बदल देती है। यह एक "राज्यव्यापी" फ़ंक्शन है, क्योंकि प्रत्येक नियम (या के -indexed नियम) के लिए एक अद्वितीय चर उत्पन्न किया जाना चाहिए, जिसके लिए noLR लागू किया गया है। इसलिए मैं स्टेटफुल समारोह
noLR :: Ord a => Int -> Set (Rule a) -> State [Sym a] (Set (Rule a))
noLR rl = do (n:ns) <- get; put ns;
let rl' = ... remove left recursion rl n ...
in return rl'
मैं एक साथ कर सकते हैं क्रम noLR अवगत कराने के लिए लिखा था n जो noLR एक पैरामीटर के रूप लेता है। मैं नहीं उपरोक्त फ़ंक्शन में चरण 2 के अंदर noLR निष्पादित करने के लिए सुनिश्चित करें। मैं का उपयोग करने में सक्षम नहीं लगता ... स्कीमा में, क्योंकि राज्यव्यापी गणना कई पुनरावर्ती कार्यों के अंदर एम्बेडेड है।
मुझे क्या करना चाहते हैं n वैश्विक चर के कुछ प्रकार, के n एक स्पष्ट सूत्रण, जो मैं कॉल कर सकते हैं और चरण 2, जिसके कारण मैं मूल रूप से समारोह लिखा अंदर अद्यतन के समान हो है ईटा -expansion (एन के लिए) के साथ एक गुना के रूप में। क्या किसी को इस तरह के प्रभाव को प्राप्त करने के लिए राज्य मोनैड के अंदर gnf संरचना कैसे बना सकता है? गुना में आखिरी गणना के अलावा, कुछ और "राज्यपूर्ण" नहीं है, और मैं "मामूली" उदाहरणों के साथ राज्य मोनैड का उपयोग करके केवल आरामदायक हूं। मैं बल्कि खो गया हूँ।
'foldM' देखें। निश्चित रूप से 'gnf' शीर्ष स्तर evalState कॉल से शुरू होगा। शीर्षक के लिए – sclv
+1। – fuz