2010-02-04 13 views
18

मैं एक सुंदर जटिल डीएसएल पर काम कर रहा हूं जिसे मैं कुछ उच्च स्तरीय भाषाओं में संकलित करना चाहता हूं। पूरी प्रक्रिया एक सीखने का अनुभव रहा है। कंपाइलर जावा में लिखा गया है।एएसटी से कोड उत्पन्न करने के लिए सर्वश्रेष्ठ डिजाइन?

मैं सोच रहा था कि कोड जनरेटर भाग के डिजाइन के लिए कोई भी सर्वोत्तम अभ्यास जानता है या नहीं। मैं वर्तमान में सब कुछ एक अमूर्त वाक्यविन्यास पेड़ में पार्स किया है।

मैं एक टेम्पलेट सिस्टम का उपयोग करने के बारे में सोच रहा था, लेकिन मैंने उस दिशा का बहुत दूर शोध नहीं किया है, क्योंकि मैं पहले स्टैक ओवरफ्लो से कुछ ज्ञान सुनना चाहता हूं।

धन्यवाद!

+1

शायद यह सिर्फ इसलिए कि आपने बहुत पहले पूछा था। लेकिन आज के रूप में (2013), एएनटीएलआर (जो आप उपयोग कर रहे हैं) में "स्ट्रिंग टेम्पलेट्स" अंतर्निहित है। –

उत्तर

8

जब मैं इसे अपनी प्रोग्रामिंग भाषा कक्षा में वापस कर रहा था, तो हम Visitor पैटर्न के आधार पर उत्सर्जकों का उपयोग करके समाप्त हो गए। यह बहुत अच्छी तरह से काम करता है - इसे नई आउटपुट भाषाओं में फिर से लक्षित करना बहुत आसान बनाता है, जब तक कि आपका एएसटी मिलान करता है जो आप काफी अच्छी तरह प्रिंट कर रहे हैं।

+0

विचार के लिए धन्यवाद। मैं आगंतुक पैटर्न से परिचित हूं। मैं पेड़ में शाब्दिक अभिव्यक्तियों को अनुकूलित करने में इसका उपयोग करता हूं। –

+0

दावा नहीं करते कि आप इससे परिचित नहीं हैं, बस सुझाव देते हैं कि यह एक अच्छा कोड जेनरेटर भी बना सकता है :-) –

+0

हाँ, मेरा मतलब यह नहीं था कि स्मग लगाना। मैं अभी इसमें देख रहा हूं, धन्यवाद। :) –

-1

डीएसएल एक अच्छी बात है। और उन्हें लिखना एक अच्छा अभ्यास है।

लेकिन मुझे यकीन नहीं है कि आपके स्वयं के वाईएसीसी को लागू करना और इसी तरह 2010 में एक अच्छा विकल्प है, जब तक कि यह सिर्फ मजेदार या शैक्षिक न हो।

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

उदाहरण के लिए Groovy का उपयोग करके आप अपने छोटे और बड़े डीएसएल को बहुत आसान और आनंददायक तरीके से कार्यान्वित कर सकते हैं।
बीटीडब्ल्यू ग्रोवी एएसटी मैनिपुलेशन एपीआई में बनाया गया है।

+0

मुझे लगता है कि आपको गलत समझा जा सकता है। मैं एएसटी उत्पन्न करने के लिए पहले से ही एक पार्सर जेनरेटर का उपयोग कर रहा हूं। मैं एएनटीएलआर 3 का उपयोग कर रहा हूं और पेड़ बनाया है। मैं उस पेड़ को किसी अन्य उच्च स्तरीय भाषा में कोड में बदलने का सबसे अच्छा तरीका ढूंढ रहा हूं। धन्यवाद। –

6

आप जो वास्तव में चाहते हैं वह program transformation system है, जो एक भाषा (आपके डीएसएल) में सिंटैक्स संरचनाओं को अन्य लैंगुग में वाक्यविन्यास पैटर्न में मानचित्र करता है। कोड पीढ़ी परियोजना के दौरान इस तरह का एक उपकरण मनमाने ढंग से परिवर्तन (पेड़-पुनरीक्षण सामान्यीकृत स्ट्रिंग-रीराइट्स जो पोस्ट सिस्टम हैं जो पूर्ण ट्यूरिंग सक्षम हैं) का अर्थ है, जिसका अर्थ है कि जो भी आप उत्पन्न करते हैं और आपकी पीढ़ी की प्रक्रिया को परिष्कृत कैसे किया जाता है केवल आपकी महत्वाकांक्षा से , "कोड जेनरेटर ढांचे" गुणों से नहीं।

परिष्कृत कार्यक्रम परिवर्तन प्रणाली ट्रान्सफॉर्मेशन को सक्षम करने के लिए विभिन्न प्रकार के स्कोपिंग, प्रवाह विश्लेषण और/या कस्टम विश्लेषकों को जोड़ती है। यह कोई सैद्धांतिक शक्ति नहीं जोड़ता है, लेकिन इसमें बहुत सी व्यावहारिक शक्तियां शामिल हैं: अधिकांश वास्तविक भाषाएं (यहां तक ​​कि डीएसएल) में नामस्थान, नियंत्रण और डेटा प्रवाह, टाइप अनुमान, इत्यादि की आवश्यकता है।

हमारे DMS Software Reengineering Toolkit इस प्रकार है परिवर्तन प्रणाली का। इसका उपयोग सरल और जटिल भाषाओं के लिए, और छोटे, बड़े और यहां तक ​​कि विशाल सॉफ्टवेयर सिस्टम के लिए पारंपरिक भाषाओं और डीएसएल दोनों का विश्लेषण/परिवर्तन करने के लिए किया गया है।

ओपी द्वारा "turning the AST into other languages", that is accomplished by DMS by writing transformations that map surface syntax for the DSL (implemented behind the scenes his DSL's AST) to surface syntax for the target language (लक्षित भाषा एएसटी का उपयोग करके लागू) के बारे में टिप्पणियों से संबंधित। परिणामी लक्ष्य लैंगेज एएसटी को लक्षित भाषा में वास्तविक स्रोत कोड प्रदान करने के लिए डीएमएस द्वारा स्वचालित रूप से सुंदर मुद्रित किया जाता है, जो लक्ष्य एएसटी से मेल खाता है।

3

आप पहले से ही ANTLR उपयोग कर और अपने एएसटी तैयार रहे हैं, तो आप StringTemplate पर एक नज़र देख सकते हैं: http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

इसके अलावा धारा 9।निश्चित ANTLR संदर्भ के 6: भवन डोमेन-विशिष्ट बोली इस बताते हैं: http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

मुक्त कोड नमूने http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz पर उपलब्ध हैं। उपफोल्डर कोड \ टेम्पलेट्स \ जनरेटर \ 2pass \ में आपको गणितीय अभिव्यक्तियों को जावा बाइटकोड में परिवर्तित करने वाला एक उदाहरण मिलेगा।

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