के सबसेट के लिए एक स्टैक आधारित आभासी मशीन को कार्यान्वित करना हैलो हर कोई मैं वर्तमान में सीखने के अनुभव के लिए एक सरल प्रोग्रामिंग भाषा लागू कर रहा हूं लेकिन मुझे कुछ सलाह की आवश्यकता है। वर्तमान में मैं अपने इंटरप्रेटर को डिजाइन कर रहा हूं और मैं एक समस्या में आया हूं।सी
मेरी भाषा सी का सबसेट है और मुझे स्टैक दुभाषिया कार्यान्वयन के बारे में कोई समस्या है। भाषा में निम्नलिखित संकलन होगा:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
अब यह ठीक है, लेकिन जब "1 + 2" की जाती है परिणाम एक ढेर पर धकेल दिया जाता है और फिर समारोह रिटर्न लेकिन अभी भी ढेर पर एक नंबर है, और वहाँ नहीं होना चाहिए। मैं इस समस्या के आसपास कैसे हो सकता हूं?
मैंने फ़ंक्शन कॉल से पहले स्टैक के "राज्य" को सहेजने और फ़ंक्शन कॉल के बाद "स्थिति" को पुनर्स्थापित करने के बारे में सोचा है। उदाहरण के लिए स्टैक पर तत्वों की संख्या को सहेजना, फिर फ़ंक्शन कोड निष्पादित करें, वापसी करें, और उसके बाद स्टैक से पॉप करें जब तक कि हमारे पास पहले की तरह तत्वों की संख्या न हो (या यदि फ़ंक्शन कुछ लौटाया गया हो तो +1 हो सकता है)।
कोई विचार? किसी भी सुझाव के लिए धन्यवाद!
इसका मजाकिया आप नाम है क्योंकि मेरे एएसटी प्रतिनिधित्व में मेरे पास सिर्फ "ASTStmtExpr" नामक एक नोड है! मुझे लगता है कि मुझे समझना शुरू हो रहा है, इस प्रकार ... यहां मैं क्या अनिश्चित हूं: इन टिप्पणी उत्तरों की सीमाओं के कारण मेरे पास है एक snipplet पेस्ट करने के लिए: \t शून्य संकलक :: यात्रा (स्थिरांक ASTStmtExpr और expr_stmt, std :: shared_ptr समारोह) \t \t { \t \t \t expr_stmt.expr() -> स्वीकार (* इस, समारोह); \t \t} आप कह रहे हैं कि मुझे इसके बाद एक OP_POP जोड़ना चाहिए, और असाइनमेंट जैसी चीजों के लिए मैं एक डमी "नील" ऑब्जेक्ट दबा दूंगा ताकि फिर पॉप हो जाए? –
क्षमा करें मुझे नहीं पता था कि टिप्पणियां प्रारूपित नहीं हैं –
असाइनमेंट के लिए, आप डमी मान को धक्का नहीं देते हैं, क्योंकि आपके पास पहले से ही स्टैक पर असाइनमेंट का परिणाम होगा। एक असाइनमेंट '= 'ऑपरेटर का उपयोग करके सिर्फ एक अभिव्यक्ति है, जो' + 'या' -' से अलग नहीं है, इसके अलावा' = 'को एक चर को असाइन करने का दुष्प्रभाव होता है। अन्यथा यह अन्य सभी ऑपरेटरों की तरह व्यवहार करता है। –