मैं एक कंपाइलर-डिज़ाइन क्लास ले रहा हूं जहां हमें अपने स्वयं के कंपाइलर को लागू करना होगा (फ्लेक्स और बाइसन का उपयोग करके)। मुझे पार्सिंग में अनुभव हुआ है (ईबीएनएफ और रिकर्सिव-डेसेंट पार्सर्स लिखना), लेकिन यह पहली बार एक कंपाइलर लिख रहा है।एक कंपाइलर में इंटरमीडिएट कोड उत्पन्न करना। सशर्त से निपटने के दौरान एक एएसटी या पार्स पेड़ हमेशा जरूरी है?
भाषा डिज़ाइन बहुत खुला है (प्रोफेसर ने इसे हमारे पास छोड़ दिया है)। कक्षा में, प्रोफेसर इंटरमीडिएट कोड उत्पन्न करने के लिए चला गया। उन्होंने कहा कि पार्सिंग के दौरान एक सार सिंटेक्स ट्री या पार्स पेड़ बनाने के लिए हमारे लिए जरूरी नहीं है, और जब हम जाते हैं तो हम इंटरमीडिएट कोड उत्पन्न कर सकते हैं।
मैं इस दो कारणों के लिए भ्रमित कर पाया:
क्या होगा यदि आप एक समारोह पहले यह परिभाषित किया गया है बुला रहे हैं? आप शाखा लक्ष्य को कैसे हल कर सकते हैं? मुझे लगता है कि आपको इसे एक नियम बनाना होगा कि आपको उनका उपयोग करने से पहले कार्यों को परिभाषित करना होगा, या शायद उन्हें पूर्व-परिभाषित करना होगा (जैसे सी करता है?)
आप सशर्त शर्तों से कैसे निपटेंगे? यदि आपके पास
if-else
या यहां तक कि केवलif
है, तोif
के लिए शाखा लक्ष्य को आप कैसे हल कर सकते हैं जब स्थितिfalse
(यदि आप कोड बनाते समय उत्पन्न कर रहे हैं)?
मैंने कार्यों और शाखा लक्ष्यों के पते को हल करने के लिए एक एएसटी उत्पन्न करने और फिर इसे बनाने के बाद पेड़ पर चलने की योजना बनाई। क्या यह सही है या क्या मुझे कुछ याद आ रहा है?
यह समझ में आता है - धन्यवाद एक गुच्छा! –
वैकल्पिक रूप से आप असेंबली कोड उत्सर्जित कर सकते हैं और असेंबलर को समस्या के उस हिस्से के बारे में चिंता करने दें। या वह धोखा दे रहा है? – dmckee
निश्चित रूप से, कोडर पर असेंबलर को दो पास (या डेढ़ अगर यह पैचिंग का उपयोग करता है) बनाने की आवश्यकता होगी। कई कंपाइलर, विशेष रूप से फोर्थ, बाइनरी मशीन कोड को सीधे लक्षित करें। यह प्रदर्शन (गति और स्थान दोनों) या अन्य व्यावहारिक कारणों (जैसे कोई उपलब्ध असेंबलर) के लिए हो सकता है। –