मेरे पास एक बहुत सी ++ - सिंटैक्स जैसी भाषा है। लेक्सर और पार्सर जगह पर हैं और सही एएसटी का उत्पादन करते हैं। सबसे बड़े हिस्से के लिए बैकएंड भी किया जाता है।एक कंपाइलर लिखना: काम करने के लिए सरल टेम्पलेट कैसे प्राप्त करें?
प्रकार बनाने के लिए कंपाइलर का उपयोग करने वाली मूल प्रणाली बहुत सरल है: सभी प्रकारों को अंतर्निहित माना जाता है और सभी उदाहरण वैश्विक हैं। तो वहां एक साधारण नक्शा है जो एक प्रकार के नाम से मेल खाता है जो वैरिएबल बनाता है जो मूल रूप से बूस्ट :: किसी भी प्रकार का सामान्य प्रकार है। कुंजी के रूप में चर के नाम के साथ एक और नक्शा और मूल्य के रूप में कार्य करता है चर वैश्विक क्षेत्र के रूप में:
std::map< std::string, std::function< Variable() > typeList;
//register some types
typeList[ "X" ] = Variable::Create<X>;
typeList[ "Y" ] = CreateInstanceOfY;
....
संकलक X myVar;
की तरह एक आरंभीकरण के लिए एएसटी नोड हो जाता है जब यह मूल रूप से करता है
std::map< std::string, Variable > globalScope;
globalScope[ "myVar" ] = typeList[ "X" ]();
जब myVar बाद में प्रयोग किया जाता है पर ऐसा लगता है जैसे
X& x = myVar.GetReference<X>();
सरल प्रकार भेजने द्वारा पहुँचा जा सकता अब मैं इस एक सा विस्तार और सरल टेम्पलेट का उपयोग करना चाहते हैं। मान लीजिए कि एक प्रकार "सरणी" है जिसे एक वेक्टर का उपयोग करके कार्यान्वित किया जाता है। मैं
typeList[ "array<X>" ] = Variable::Create< std::vector<X> >;
पर सब कुछ पंजीकृत कर सकता है लेकिन यह काफी अनुकूल नहीं है क्योंकि इसे सभी संयोजनों के लिए दोहराया जाना होगा। आदर्श रूप में मैं कुछ इस तरह लिखने के लिए अनुमति देता है कार्यक्षमता आवश्यकता होगी:
typeList.CreateTemplateVariable("array", "X")
जो फिर एक चर उदाहरण है, जिसमें आंतरिक रूप से एक std :: वेक्टर < एक्स> रखती पैदा करेगा। मैंने कड़ी मेहनत की लेकिन यह पता नहीं लगा कि यह कैसे करना है। हो सकता है कि मैंने सरल प्रकार के मैपिंग के साथ गलत तरीके से शुरू किया और यही वजह है कि मैं इसके चारों ओर अपना सिर नहीं ले सकता।
तो सवाल सरल है: क्या ऐसा करना संभव है? और कैसे?
जब आप एएसटी से सी ++ कोड बनाते हैं, तो यह पहले से ही एक कंपाइलर है। – belgther
शब्दावली के बारे में थोड़ा सा नाइटपिक: एक कंपाइलर एक प्रारूप से दूसरे प्रारूप में कोड का अनुवाद करता है।एक दुभाषिया कुछ कोड निष्पादित करता है। –
@ जोचिमपिलबोर्ग यह इंगित करने के लिए धन्यवाद .. मैं वास्तव में शब्दावली के साथ अच्छा नहीं हूं। – stijn