2010-05-24 11 views
8

मैं OpenC का उपयोग करते थे ++ (http://opencxx.sourceforge.net/opencxx/html/overview.html) जैसे कोड पीढ़ी प्रदर्शन करने के लिए:स्रोत करने वाली स्रोत संकलक ढांचे चाहता था

स्रोत:

class MyKeyword A { 
    public: 
    void myMethod(inarg double x, inarg const std::vector<int>& y, outarg double& z); 
}; 

जनरेट की गई

class A { 
    public: 
    void myMethod(const string& x, double& y); 
    // generated method below: 
    void _myMehtod(const string& serializedInput, string& serializedOutput) { 
     double x; 
     std::vector<int> y; 
     // deserialized x and y from serializedInput 
     double z; 
     myMethod(x, y, z); 
    } 
}; 

इस तरह की कोड जनरेशन "MyKeyword", "inarg" और "outarg" और performin को संभालने के लिए मेटा-स्तरीय प्रोग्राम लिखकर OpenC++ (http://www.csg.is.titech.ac.jp/~chiba/opencxx/tutorial.pdf) के ट्यूटोरियल में उपयोग केस से सीधे मेल खाता है जी कोड पीढ़ी। हालांकि, ओपनसी ++ अब पुराना और निष्क्रिय है, और मेरा कोड जनरेटर केवल जी ++ 3.2 पर काम कर सकता है और यह उच्च संस्करण के जी ++ की शीर्षलेख फ़ाइलों को पार्स करने में त्रुटि को ट्रिगर करता है।

मैंने विवाकोर को देखा है, लेकिन यह मेटा-स्तरीय प्रोग्राम को संकलित करने के लिए इन्फ्रा-स्ट्रक्चर प्रदान नहीं करता है। मैं एलएलवीएम को भी देख रहा हूं, लेकिन मुझे दस्तावेज नहीं मिल रहा है जो मुझे मेरे स्रोत-से-स्रोत संकलन उपयोग को काम करने के लिए प्रशिक्षित करता है। मुझे आरओएसई कंपाइलर ढांचे के बारे में भी पता है, लेकिन मुझे यकीन नहीं है कि यह मेरे उपयोग के अनुरूप है या नहीं, और इसके मालिकाना सी ++ फ्रंट एंड बाइनरी का इस्तेमाल वाणिज्यिक उत्पाद में किया जा सकता है, और क्या विंडोज संस्करण उपलब्ध है या नहीं।

विशिष्ट ट्यूटोरियल/पेपर/दस्तावेज़ीकरण के लिए कोई टिप्पणी और पॉइंटर्स की बहुत सराहना की जाती है।

+1

आप ईडीजी फ्रंट एंड पर अपना लाइसेंस प्राप्त किए बिना वाणिज्यिक संदर्भ में गुलाब ढांचे का उपयोग नहीं कर सकते हैं। डुनो अगर गुलाब का विंडोज संस्करण है। –

उत्तर

3

मैं किसी भी रेडी-टू-उपयोग समाधान के बारे में पता नहीं है, लेकिन यदि आप एक अपेक्षाकृत कम प्रयास के साथ अपने स्वयं का निर्माण कर सकता है। एक संभावित विकल्प एल्सा सी ++ पार्सर है, जो थोड़ा पुराना है, लेकिन उपयोग करने में आसान है और काफी विस्तार योग्य है। एक और विकल्प क्लैंग ++ द्वारा उत्पादित एक्सएमएल एएसटी के साथ छेड़छाड़ करना है। मैंने विभिन्न परिदृश्यों में दोनों दृष्टिकोणों का उपयोग किया।

+0

समस्या का उत्तर देने के लिए बहुत बहुत धन्यवाद। एलास और क्लैंग ++ बहुत उपयोगी जानकारी हैं। –

+1

क्लैंग वह है जो मैं दृढ़ता से अनुशंसा करता हूं। एलएलवीएम आपकी जरूरतों के लिए कंपाइलर पथ से बहुत दूर है, लेकिन क्लेंग सही जगह पर है। –

+0

एल्सा साइट के बारे में 2005 के बाद से कोई अपडेट नहीं हुआ है; यह सी ++ 2003 को पार्स करने का प्रयास करने का दावा करता है। –

0

क्या आप टेम्पलेट मेटा प्रोग्रामिंग के अभ्यास से अवगत हैं? यदि आपने पहले इसका उपयोग नहीं किया है, तो यह सी ++ प्रीप्रोसेसर का उपयोग विषम मेटा-प्रोग्राम बनाने के लिए है जो सी ++ की तुलना में LISP की तरह महसूस करते हैं। विचार उपरोक्त जैसा ही है - एक पूर्व-संकलन चरण है जो कुछ इनपुट के आधार पर दोहराया कोड उत्पन्न करता है। हालांकि, यह सभी संकलन समय पर निष्पादित किया गया है (जबकि ऐसा लगता है कि ओपनसी ++ रन टाइम पर कई चीजें करता है)।

यह मानते हुए कि आप एक नया सीखने के इच्छुक हैं, चाहे आप इसे "भाषा" के रूप में उपयोग करने के इच्छुक हों?

बूस्ट एक लाइब्रेरी प्रदान करता है जो इस तकनीक का उपयोग आसान क्रमबद्धता प्रदान करने के लिए करता है, जैसा आपने ऊपर दिखाया था। From the tutorial in its manual:

///////////////////////////////////////////////////////////// 
// gps coordinate 
// 
// illustrates serialization for a simple type 
// 
class gps_position 
{ 
private: 
    friend class boost::serialization::access; 
    // When the class Archive corresponds to an output archive, the 
    // & operator is defined similar to <<. Likewise, when the class Archive 
    // is a type of input archive the & operator is defined similar to >>. 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & degrees; 
     ar & minutes; 
     ar & seconds; 
    } 
    int degrees; 
    int minutes; 
    float seconds; 
public: 
    gps_position(){}; 
    gps_position(int d, int m, float s) : 
     degrees(d), minutes(m), seconds(s) 
    {} 
}; 

int main() { 
    // create and open a character archive for output 
    std::ofstream ofs("filename"); 

    // create class instance 
    const gps_position g(35, 59, 24.567f); 

    // save data to archive 
    { 
     boost::archive::text_oarchive oa(ofs); 
     // write class instance to archive 
     oa << g; 
     // archive and stream closed when destructors are called 
    } 

    // ... some time later restore the class instance to its orginal state 
    gps_position newg; 
    { 
     // create and open an archive for input 
     std::ifstream ifs("filename"); 
     boost::archive::text_iarchive ia(ifs); 
     // read class state from archive 
     ia >> newg; 
     // archive and stream closed when destructors are called 
    } 
    return 0; 
} 
+0

प्रीप्रोसेसर का उपयोग करने के विचार के लिए धन्यवाद। हालांकि, कुछ विरासत और संगतता मुद्दे मुझे वर्तमान उपयोग को बदलने से सीमित कर देता है। –

1

आप हमारे DMS Software Reengineering Toolkit पर विचार कर सकते हैं। डेटा संरचनाओं (एएसटी, प्रतीक सारणी, नियंत्रण प्रवाह ग्राफ, डेटा प्रवाह ग्राफ, आप इसे कितनी दूर लेते हैं) के आधार पर मनमानी भाषाओं में स्रोत पाठ को पार्स करने के लिए डीएमएस एक सामान्य नींव है।

डीएमएस एक सामान्य उद्देश्य Source-to-source program transformation system है। आप स्रोत-से-स्रोत पैटर्न-निर्देशित परिवर्तनों को लागू कर सकते हैं, या प्रक्रियात्मक परिवर्तन (ओपनसी ++ की तरह), लिख सकते हैं और फिर परिवर्तित प्रोग्राम से संबंधित संकलित स्रोत टेक्स्ट को पुन: उत्पन्न कर सकते हैं।

डीएमएस स्पष्ट भाषा परिभाषाओं द्वारा पैरामीटर किया गया है, और सी, सी #, कोबोल, जावा, पायथन, जावास्क्रिप्ट, फोरट्रान को संभालता है।

इसमें एक पूर्ण C++ Front End है जो पूर्ण नाम और प्रकार के संकल्प के साथ सी ++ (एएनएसआई, जीएनयू, एमएस) की कई वास्तविक बोलीभाषाओं को संभालता है।सी ++ फ्रंट एंड के साथ डीएमएस कई संकलन इकाइयों के भीतर और उसके बीच "मेटाप्रोग्राम" द्वारा नियंत्रित परिवर्तनों को निष्पादित कर सकता है। इसका उपयोग सी ++ सॉफ़्टवेयर सिस्टम के कट्टरपंथी पुनर्गठन करने के लिए क्रोध में किया गया है, जिसमें मिशन एवियनिक्स सॉफ्टवेयर (वेबसाइट पर कागजात देखें) के बड़े पैमाने पर पुनर्चक्रण शामिल हैं, अंत में यूएवी में उपयोग किया जाता है।

डीएमएस विंडोज पर चलता है।

संपादित 2/3/2011: डीएमएस लिनक्स और सोलारिस पर शराब के तहत भी ठीक लगता है। ओएसएक्स के तहत शराब पर डीएमएस के लिए परीक्षण चल रहा है।

संपादित करें 3/1/2011: डीएमएस ओएसएक्स के लिए शराब के तहत भी चल रहा है।

संपादित करें 2/21/2013: सी ++ फ्रंट एंड अब एएनएसआई सी ++ 11, साथ ही सी ++ 11 के एमएस और जीएनयू संस्करणों को संभालता है।

संपादित करें 2/24/2015: अब एएनएसआई, एमएस और जीएनयू स्वादों में सी ++ 14 को संभालता है।

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