क्या तुम सच में IMHO चाहते एक program transformation system जो आप पार्स और सीधे पुनर्लेखन व्यक्त करने के लिए पैटर्न स्रोत कोड (और यहां तक कि लक्ष्य भाषा) सतह वाक्य रचना में व्यक्त का उपयोग कर कोड को बदलने के लिए अनुमति देता है,।
आपको पता चलेगा कि यदि आप पाइथन पेड़ के एक्सएमएल प्रस्तुति पर अपना हाथ प्राप्त कर सकते हैं, तो XSLT/XPath रूपांतरण लिखने का प्रयास आप अपेक्षा से अधिक है; वास्तविक कोड का प्रतिनिधित्व करने वाले पेड़ आप अपेक्षा से अधिक गड़बड़ कर रहे हैं, एक्सएसएलटी उस नोटेशन को सुविधाजनक नहीं है, और यह उन पेड़ों पर सीधे सामान्य स्थितियों को व्यक्त नहीं कर सकता है जिन्हें आप देखना चाहते हैं (उदाहरण के लिए, कि दो सबट्री समान हैं)। एक्सएमएल के साथ एक अंतिम जटिलता: मान लीजिए कि इसे बदल दिया गया है। आप स्रोत कोड सिंटैक्स को फिर से उत्पन्न कैसे करते हैं? आपको किसी प्रकार का सुंदरप्रिंटर चाहिए।
कोड का प्रतिनिधित्व करने के तरीके के बावजूद एक सामान्य समस्या यह है कि स्कॉप्स और प्रकारों (जहां आप इसे प्राप्त कर सकते हैं) के बारे में जानकारी के बिना, सही परिवर्तन लिखना बहुत कठिन है। आखिरकार, यदि आप पाइथन को ऐसी भाषा में बदलने जा रहे हैं जो स्ट्रिंग कॉन्सट और अंकगणित के लिए विभिन्न ऑपरेटरों का उपयोग करता है (जावा के विपरीत जो दोनों के लिए "+" का उपयोग करता है), आपको यह तय करने में सक्षम होना चाहिए कि कौन सा ऑपरेटर उत्पन्न करना है। इसलिए आपको निर्णय लेने के लिए प्रकार की जानकारी चाहिए। पायथन तर्कसंगत रूप से टाइपलेस है, लेकिन व्यवहार में अधिकांश अभिव्यक्तियों में चर शामिल होते हैं जिनमें उनके पूरे जीवनकाल के लिए केवल एक ही प्रकार होता है। तो आपको गणना प्रकारों के लिए प्रवाह विश्लेषण की भी आवश्यकता होगी।
हमारे DMS Software Reengineering Toolkit में इन सभी क्षमताओं (पार्सिंग, फ्लो विश्लेषण, पैटर्न मिलान/पुनर्लेखन, सुंदर प्रिंटिंग), और robust parsers पाइथन सहित कई भाषाओं के लिए है।(हालांकि इसमें सी, कोबोल, जावा के लिए फ्लोर विश्लेषण क्षमता है, यह पाइथन के लिए तत्काल नहीं है। लेकिन फिर, आपने कहा कि आप संदर्भ के बावजूद परिवर्तन करना चाहते हैं)।
अजगर वाक्य रचना अपने उदाहरण के करीब पर डीएमएस में आपका रीराइट व्यक्त करने के लिए (जो अजगर नहीं है?)
domain Python;
rule revise_arguments(f:IDENTIFIER,A:expression,B:expression,
C:expression,D:expression):primary->primary
= " \f(\A,(\B),(\C),(\D)) "
-> " \f(\C,(\B),(\D)) ";
अंकन ऊपर डीएमएस नियम पुनर्लेखन भाषा (RSL) है। "..." मेटाक्वाट्स हैं जो अलग-अलग पायथन सिंटैक्स (उन उद्धरणों के अंदर, डीएमएस जानते हैं कि यह डोमेन नोटेशन घोषणा के कारण पायथन है) डीएमएस आरएसएल भाषा से। \ N मेटा उद्धरण के अंदर नियम पैरामीटर सूची में परिभाषित नामित nonterminal प्रकार के वाक्यविन्यास परिवर्तनीय प्लेसहोल्डर्स को संदर्भित करता है। हां, (...) मेटाक्वाट्स के अंदर पाइथन() हैं ... जहां तक डीएमएस का संबंध है, वे सिंटैक्स पेड़ों में मौजूद हैं, क्योंकि वे शेष भाषा की तरह हैं, सिर्फ सिंटैक्स हैं।
उपरोक्त नियम थोड़ा अजीब दिखता है क्योंकि मैं जितना संभव हो सके अपने उदाहरण का पालन करने की कोशिश कर रहा हूं, और अभिव्यक्ति भाषा बिंदु से, आपका उदाहरण अजीब सटीक है क्योंकि इसमें असामान्य कोष्ठक हैं।
इस नियम के साथ
, डीएमएस की तरह
foobar(2+3,(x-y),(p),(baz()))
निर्माण (अपने अजगर पार्सर का उपयोग) अजगर पार्स सकता है एक एएसटी, (पार्स करने वाली एएसटी) कि एएसटी के खिलाफ नियम से मेल, एक और एएसटी करने के लिए इसे फिर से लिखने इसी करने के लिए:
foobar(p,(x-y),(baz()))
और उसके बाद सतही वाक्यविन्यास (वैध) पायथन वापस सुंदर प्रिंट करें।
आप अपने उदाहरण का इरादा तो लिस्प कोड पर एक परिवर्तन होने के लिए आपको चाहते डीएमएस (मुश्किल नहीं निर्माण करने के लिए है, लेकिन हम इस बात के लिए बहुत कॉल की जरूरत नहीं है) के लिए एक लिस्प व्याकरण की जरूरत है, और इसी सतह बारे में वाक्य रचना:
domain Lisp;
rule revise_form(A:form,B:form, C:form, D:form):form->form
= " (\A,(\B),(\C),(\D)) "
-> " (\C,(\B),(\D)) ";
आप Algebra as a DMS domain को देखकर इस के लिए एक बेहतर महसूस कर सकते हैं।
यदि आपका लक्ष्य पाइथन में यह सब लागू करना है ... मुझे बहुत मदद नहीं है। डीएमएस एक बहुत बड़ी प्रणाली है, और यह दोहराने के लिए बहुत प्रयास होगा।
हाय ईरा। मुझे लगता है कि मैंने आपको पहले यह देखा है :) एक तीसरी पार्टी के लिए एक नई भाषा फ्रंट एंड जोड़ने के लिए कितना आसान है? आपकी लाइसेंसिंग कहानी क्या है? मुझे लगता है कि यह बंद स्रोत है। – bukzor
डीएमएस को मनमाने ढंग से सॉफ्टवेयर विश्लेषण और परिवर्तन उपकरण बनाने के समर्थन में, नई भाषाओं के अतिरिक्त को सक्षम करने के लिए डिज़ाइन किया गया है। इसे तीसरे पक्ष द्वारा * इस्तेमाल * के लिए भी डिज़ाइन किया गया है; दुनिया खुद से निपटने की तुलना में एक बहुत बड़ी जगह है। डीएमएस में संदर्भ मैनुअल और यहां तक कि प्रशिक्षण कक्षाओं के पूर्ण सेट हैं यदि आप उन्हें चाहते हैं। वाणिज्यिक विवरण के लिए, मेरी कंपनी से संपर्क करें; आप इसे आसानी से साइट से पा सकते हैं। –
हां, डीएमएस बंद स्रोत है, और वाणिज्यिक रूप से लाइसेंस प्राप्त है। आपको "आश्चर्य" छोड़ने के लिए, बहुत से लोग इसे महंगा मानते हैं। हर किसी की राय है; हम सोचते हैं कि यह क्या करता है इसके लिए यह सस्ता है, व्यावहारिक उपयोग के लिए इसकी आवश्यकता है। यदि आप उपलब्ध समाधानों की जांच करते हैं, तो आप पाते हैं कि आपूर्ति बहुत पतली है, क्योंकि यह सब कुछ करना मुश्किल है। क्लैंग में कुछ दिलचस्प ओवरलैप है, लेकिन पाइथन नहीं करता है। पायथन में एक एएसटी पैकेज है, लेकिन स्रोत-टू-सोर्स रीराइट्स को संभाल नहीं करता है। इसलिए, आपके पास नि: शुल्क और गैर-समाधान हो सकता है, या आपके पास सबसे अच्छा जवाब हो सकता है कि कई पीएचडी पैकेज करने के लिए 15 रैखिक वर्ष पैकेज कर सकते हैं। –