2012-05-05 65 views
6

मैं टर्बो पास्कल 4.0 से जावा तक जैक क्रेन्शॉ के "चलो एक कंपाइलर का निर्माण" लिख रहा हूं। क्योंकि क्लासिक किताब अभी तक एक ओ-ओ संस्करणक्रैनशॉ के पुन: लिखने के लिए डिज़ाइन पैटर्न "चलो एक कंपाइलर बनाएं"?

Is there a more modern, OO version of "Let's Build a Compiler"?

किताब 15 अध्याय हैं नहीं है यह प्रेरित है। कंपाइलर को एक वृद्धिशील तरीके से प्रस्तुत किया जाता है: अध्याय मैं पूरे कंपाइलर के लिए बॉयलरप्लेट कोड प्रदान करता हूं, फिर प्रत्येक अध्याय में पिछले अध्याय के पास्कल प्रक्रियाओं में कुछ पंक्तियां शामिल होती हैं।

मैंने पहले ही 2 अध्यायों का चयन किया है, पैकेज के रूप में प्रत्येक अध्याय, प्रत्येक पास्कल प्रक्रिया जावा में एक स्थिर संरक्षित विधि के रूप में, एक अध्याय की प्रक्रियाओं को एक वर्ग में एकत्र किया जाता है जो कक्षा को अपने पिछले अध्याय से अनुवादित करता है ।

package td1; 
public class Cradle { 
    protected final static char TAB='\t'; 
    protected static char look; 

    protected static void getChar() throws IOException { 
     look=(char) System.in.read(); 
     }  
... 
} 

package td2; 

public class Cradle extends td1.Cradle{ 

    protected static void factor() throws IOException { 
    ... 
    } 

... 
} 

हालांकि, जब मैं td3 के लिए आते हैं, मैं td2.Cradle का कारक() अद्यतन करने के लिए है, लेकिन मैं नहीं है td2.Cradle में कारक() बदलने के लिए, क्योंकि वह कारक कर देगा चाहते हैं() td2 में td2 में प्रस्तुत किए जाने से अधिक करना चाहिए। मैंने td2.Cradle() "विस्तार" के बारे में सोचा, हालांकि, यह एक स्थिर वर्ग का विस्तार करना असंभव प्रतीत होता है।

My related question here

शायद मैं गैर स्थिर एक के लिए हर स्थिर विधि बदलना चाहिए?

मुझे निश्चित रूप से यहां कुछ डिज़ाइन पैटर्न की आवश्यकता है, कोई भी मदद कर सकता है? मुझे उम्मीद है कि मैं स्पष्ट था। संक्षेप में, यह परियोजना प्रत्येक प्रक्रिया के लिए अधिक से अधिक निर्देश प्रस्तुत करती है और मुझे उम्मीद है कि विरासत जैसे कुछ जावा तंत्र का उपयोग करके मध्यवर्ती कदमों को रिकॉर्ड करने की उम्मीद है।

पास्कल कोड क्लासिक पुस्तक LBC है। मैं भाग का उपयोग करने के क्योंकि

  1. प्रत्येक अध्याय कॉल/प्रक्रियाओं मिसाल अध्यायों में परिभाषित करने के लिए थोड़ा और लाइनों कहते प्रयास किया महसूस
  2. मैं अपने जावा स्रोत कोड जो कोई द्वारा एलबीसी चरण का पालन करना चाहता है के लिए उपयोगी बनाने के लिए आशा कदम। तो लेखक के कंपाइलर के अंतिम स्रोत कोड में डालने के लिए एक वर्ग का उपयोग करना उचित नहीं है। अध्यायों द्वारा कोड को विभाजित करना और धीरे-धीरे उन्हें बढ़ाना आवश्यक है क्योंकि क्रेन्शॉ ने किया था।

मेरा वास्तविक समाधान tp1 के तरीकों को रखना है। स्थिर के रूप में क्रैडल। Tp2.Cradle, tp3.Cradle, ... में tp15.Cradle गैर-स्थिर होने तक विधियां, और वे सभी स्थिर रूप से tp1.Cradle आयात करें। *। इसके अलावा, प्रत्येक पूर्णांक के लिए मैं 2 से अधिक, टीपी [i]। टीपी [i-1] विस्तारित करता है।

मुझे बेहतर समाधान बताने में संकोच न करें।

+1

क्या आप पास्कल कोड जोड़ सकते हैं जिसे आप फिर से लिखने की कोशिश कर रहे हैं? मैं समझता हूं कि आपने पास्कल की प्रक्रियाओं के लिए जावा स्थैतिक विधियों का उपयोग किया है। प्रश्नों से मुझे स्पष्ट नहीं है कि आप विरासत का उपयोग क्यों करना चाहते हैं। – Seitaridis

+1

@ सेटरिटिडीस एलबीसी में पास्कल कोड होता है, बस लिंक का पालन करें ... –

उत्तर

1

ऐसा लगता है जैसे आप सही रास्ते पर हैं। इन विधियों को ओवरराइड करने में सक्षम होने के लिए, उन्हें उदाहरण विधियां होनी चाहिए। और इसलिए आपको ऐसे मॉडल से दूर जाना चाहिए जो इन "वैश्विक तरीकों" पर निर्भर करता है, उदाहरण के लिए मॉडल पर, जहां आप क्रैडल क्लास का उदाहरण बनाते हैं और उस उदाहरण पर उपयुक्त विधियों को कॉल करते हैं।

+0

इस उत्तर के लिए धन्यवाद।मैं ऊपर अपना वास्तविक समाधान अद्यतन करता हूं। यह एक सुरुचिपूर्ण नहीं हो सकता है, लेकिन यह काम करता है। – zell