7

मैं एक कंपाइलर-डिज़ाइन क्लास ले रहा हूं जहां हमें अपने स्वयं के कंपाइलर को लागू करना होगा (फ्लेक्स और बाइसन का उपयोग करके)। मुझे पार्सिंग में अनुभव हुआ है (ईबीएनएफ और रिकर्सिव-डेसेंट पार्सर्स लिखना), लेकिन यह पहली बार एक कंपाइलर लिख रहा है।एक कंपाइलर में इंटरमीडिएट कोड उत्पन्न करना। सशर्त से निपटने के दौरान एक एएसटी या पार्स पेड़ हमेशा जरूरी है?

भाषा डिज़ाइन बहुत खुला है (प्रोफेसर ने इसे हमारे पास छोड़ दिया है)। कक्षा में, प्रोफेसर इंटरमीडिएट कोड उत्पन्न करने के लिए चला गया। उन्होंने कहा कि पार्सिंग के दौरान एक सार सिंटेक्स ट्री या पार्स पेड़ बनाने के लिए हमारे लिए जरूरी नहीं है, और जब हम जाते हैं तो हम इंटरमीडिएट कोड उत्पन्न कर सकते हैं।

मैं इस दो कारणों के लिए भ्रमित कर पाया:

  • क्या होगा यदि आप एक समारोह पहले यह परिभाषित किया गया है बुला रहे हैं? आप शाखा लक्ष्य को कैसे हल कर सकते हैं? मुझे लगता है कि आपको इसे एक नियम बनाना होगा कि आपको उनका उपयोग करने से पहले कार्यों को परिभाषित करना होगा, या शायद उन्हें पूर्व-परिभाषित करना होगा (जैसे सी करता है?)

  • आप सशर्त शर्तों से कैसे निपटेंगे? यदि आपके पास if-else या यहां तक ​​कि केवल if है, तो if के लिए शाखा लक्ष्य को आप कैसे हल कर सकते हैं जब स्थिति false (यदि आप कोड बनाते समय उत्पन्न कर रहे हैं)?

मैंने कार्यों और शाखा लक्ष्यों के पते को हल करने के लिए एक एएसटी उत्पन्न करने और फिर इसे बनाने के बाद पेड़ पर चलने की योजना बनाई। क्या यह सही है या क्या मुझे कुछ याद आ रहा है?

उत्तर

7

आपके दोनों मुद्दों का सामान्य समाधान उन पते की सूची रखना है जिन्हें "पैच" होना चाहिए। आप कोड उत्पन्न करते हैं और लापता पते या ऑफसेट के लिए छेद छोड़ देते हैं। संकलन इकाई के अंत में, आप छेद की सूची से गुजरते हैं और उन्हें भरते हैं।

फोर्थ में पैच की "सूची" नियंत्रण स्टैक पर रखी जाती है और प्रत्येक नियंत्रण संरचना समाप्त होने पर अवांछित होती है। देखें FORTH Dimensions

उपाख्यान: प्रारंभिक लिस्प संकलक (मुझे विश्वास है कि यह लिस्प था) ने सशर्त प्रारूप में मशीन कोड की सूची के आगे संदर्भ संदर्भ के साथ प्रतीकात्मक प्रारूप में मशीन कोड निर्देशों की एक सूची उत्पन्न की। फिर यह पीछे सूची में चलने वाले बाइनरी कोड उत्पन्न करता है। इस तरह सभी आगे की शाखाओं के लिए कोड स्थान ज्ञात था जब शाखा निर्देश उत्सर्जित करने की आवश्यकता थी।

+0

यह समझ में आता है - धन्यवाद एक गुच्छा! –

+0

वैकल्पिक रूप से आप असेंबली कोड उत्सर्जित कर सकते हैं और असेंबलर को समस्या के उस हिस्से के बारे में चिंता करने दें। या वह धोखा दे रहा है? – dmckee

+0

निश्चित रूप से, कोडर पर असेंबलर को दो पास (या डेढ़ अगर यह पैचिंग का उपयोग करता है) बनाने की आवश्यकता होगी। कई कंपाइलर, विशेष रूप से फोर्थ, बाइनरी मशीन कोड को सीधे लक्षित करें। यह प्रदर्शन (गति और स्थान दोनों) या अन्य व्यावहारिक कारणों (जैसे कोई उपलब्ध असेंबलर) के लिए हो सकता है। –

1

Crenshaw tutorial किसी भी प्रकार के एएसटी का उपयोग करके का एक ठोस उदाहरण है। यह तत्काल कोड जनरेशन लक्ष्यीकरण m68k असेंबली के साथ एक कार्यरत कंपाइलर (सशर्त सहित, स्पष्ट रूप से) बनाता है।

आप दोपहर में दस्तावेज़ के माध्यम से पढ़ सकते हैं, और यह इसके लायक है।

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