मैं वर्तमान में निम्नलिखित के आधार पर एक अभिव्यक्ति मूल्यांकक (एकल पंक्ति अभिव्यक्ति, जैसे सूत्र) लागू कर रहा हूं:
- दर्ज की गई अभिव्यक्ति को शाब्दिक बूलियन, पूर्णांक, दशमलव, तार, कार्य, पहचानकर्ता (चर) से अलग किया जाता है
- कोष्ठक से छुटकारा पाने के लिए मैंने शंटिंग-यार्ड एल्गोरिथ्म (हल्के ढंग से संशोधित कार्यों के साथ कार्यों को संभालने के लिए) को लागू किया और ऑपरेटरों को एक उपसर्ग क्रम में एक सभ्य पूर्वता के साथ आदेश दिया
- मेरे शंटिंग-यार्ड बस टोकन की एक (सिम्युलेटेड) कतार पैदा करता है (एक सरणी के माध्यम से, मेरी पावरबिल्डर क्लासिक भाषा ऑब्जेक्ट्स को परिभाषित कर सकती है, लेकिन केवल मूल भंडारण के रूप में गतिशील सरणियां हैं - सच्ची सूची नहीं, कोई शब्दकोष नहीं) जो कि मैं एक के साथ क्रमिक रूप से मूल्यांकन करता हूं सरल स्टैक मशीन
मेरा मूल्यांकनकर्ता अच्छी तरह से काम कर रहा है, लेकिन मुझे अभी भी याद नहीं है if()
और मैं सोच रहा हूं कि कैसे आगे बढ़ना है।
मेरे शंटिंग-यार्ड के बाद उपसर्ग और स्टैक आधारित मूल्यांकन के साथ, यदि मैं if()
एक और फ़ंक्शन को सच्चे और झूठे भागों के साथ जोड़ता हूं, तो एक एकल if(true, msgbox("ok"), msgbox("not ok"))
दोनों संदेश दिखाएगा जबकि मैं केवल एक दिखाना चाहूंगा। ऐसा इसलिए है क्योंकि जब मुझे किसी फ़ंक्शन का मूल्यांकन करने की आवश्यकता होती है, तो इसके सभी तर्कों का पहले ही मूल्यांकन किया गया है और स्टैक पर रखा गया है।
क्या आप मुझे if()
आलसी तरीके से लागू करने के लिए कोई रास्ता दे सकते हैं ?
हालांकि मैं इन्हें एक प्रकार के मैक्रो के रूप में संसाधित करने के बारे में हूं, लेकिन शुरुआती समय में मैंने अभी तक स्थिति मूल्यांकन नहीं किया है। शायद यह कि मुझे एक अलग तरह की संरचना का उपयोग करने के लिए एक कतार से अलग स्थिति और सही / गलत भाव रखने की आवश्यकता है? अभी के लिए मूल्यांकन से पहले अभिव्यक्ति को पार्स किया गया है, लेकिन मैं भविष्य के मूल्यांकन के लिए पूर्वनिर्धारित अभिव्यक्ति के रूप में मध्यवर्ती प्रतिनिधित्व को संग्रहीत करने की योजना भी बना रहा हूं।
संपादित करें : समस्या पर कुछ के बाद, मुझे लगता है कि मैं अपनी अभिव्यक्ति (एक रैखिक टोकन स्ट्रीम के बजाय एएसटी) का एक पेड़ प्रतिनिधित्व बना सकता हूं, जिससे मैं आसानी से अपनी एक या किसी अन्य शाखा को अनदेखा कर सकता हूं if()
।