2010-10-11 3 views
6

का समर्थन करता है मैंने स्ट्रिंग इनपुट को पढ़ने वाले पार्सर को लिखा है। यह काम करता है। मैंने मूल्यांकनकर्ता भी लिखा है जो परिणाम निकालता है। लेकिन एक छोटा सा विवरण है कि मुझे लागू करने में परेशानी हो रही है। निम्न उदाहरण को देखो:एक छोटे गणित प्रकार की भाषा का मूल्यांकन जो एक चर

+(sw+(2,2),sr) 

इस छोटे से भाषा की sw निर्माण "+ (2,2)" का मूल्यांकन करें और इसे कहीं स्टोर करने के लिए लगता है। एसआर निर्माण इस भंडारण क्षेत्र को पढ़ेगा। पूरी अभिव्यक्ति का मूल्यांकन 8 के लिए होगा।

इस पर मेरे विचार फ़ंक्शन eval के लिए एक अतिरिक्त पैरामीटर का उपयोग करना होगा, जो परिणाम संग्रहीत करता है। लेकिन मैं यह काम नहीं देख सकता। नोट मैं हैकेल के लिए नया हूँ, तो दयालु हो। ओह, यह होमवर्क है। तो मुझे एक समाधान मत दो, मुझे एक संकेत दें।

उत्तर

5

चूंकि अभिव्यक्ति भंडारण क्षेत्र में पढ़ और लिख सकते हैं, इसलिए आपके मूल्यांकन फ़ंक्शन को पैरामीटर के रूप में स्मृति की स्थिति मिलनी चाहिए, और परिणामस्वरूप नया राज्य वापस कर देना चाहिए।

evaluate :: Expr -> Int -> (Float, Int) 

[जहां Int भंडारण के प्रकार है, और Float परिणाम के प्रकार है, बेशक आप उसे बदल सकते हैं]।

evaluate (Sum a b) को लागू करते समय, आपको evaluate a में मेमोरी पास करने की आवश्यकता है, स्मृति का नया मान प्राप्त करें और इसे evaluate b पर दें।

 | 
    | m 
    \/
|----------| x 
|evaluate a|--------| 
|-----------  | 
    |    | 
    | m'   | 
    \/   \/
|----------| y --- 
|evaluate b|----->| + | 
|----------|  --- 
    |    | 
    |    | 
    \/   \/
    final   final 
    value of  result 
    memory 

पैटर्न मिलान का उपयोग करें। आप let (x,m') = evaluate a m in ... से शुरू करेंगे।

+0

धन्यवाद! मैंने अभिव्यक्ति को कठिन बनाने का उपयोग नहीं किया। लेकिन मुझे यह काम करने के लिए मिला। – Algific

+0

होमवर्क का जवाब देने पर बढ़िया काम सही तरीके से प्रश्न पूछता है। – Davorak

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