क्या आप चाहते हैं एक बड़े पैमाने पर कोड परिवर्तन इंजन है।
एएनटीएलआर चाल नहीं करेगा; एएसटी आवश्यक हैं लेकिन पर्याप्त नहीं हैं। Life After Parsing पर मेरा निबंध देखें। ग्रहण का "एएसटी" बेहतर हो सकता है, यदि ग्रहण पैकेज नाम और प्रकार के संकल्प के लिए कुछ समर्थन प्रदान करता है; अन्यथा आप कभी भी यह समझने में सक्षम नहीं होंगे कि प्रत्येक "doSomething" (ओवरलोडेड या स्थानीय हो सकता है) को प्रतिस्थापित करने के लिए, जब तक कि आप उन्हें सभी समान रूप से प्रतिस्थापित करने के इच्छुक नहीं हैं (और आप संभवतः ऐसा नहीं कर सकते हैं, क्योंकि कुछ प्रतीकों का संदर्भ है जावा पुस्तकालय तत्वों के लिए)।
हमारे DMS Software Reengineering Toolkit का उपयोग आपके कार्य को पूरा करने के लिए किया जा सकता है। डीएमएस जावा को एएसटी (टिप्पणी कैप्चर समेत) को पार्स कर सकता है, एएसटी को मनमानी तरीकों से पार कर सकता है, एएसटी का विश्लेषण/परिवर्तन कर सकता है, और निर्यात संशोधित एएसटी वैध स्रोत कोड (टिप्पणियों सहित) के रूप में संशोधित किया जा सकता है।
असल में आप सभी टिप्पणियों, तारों और पहचानकर्ताओं की घोषणाओं को गिनना चाहते हैं, उन्हें एक बाहरी "डेटाबेस" में मैप किए जाने के लिए निर्यात करें (मैन्युअल रूप से? Google अनुवाद द्वारा?) समकक्ष तक। प्रत्येक मामले में आप न केवल ब्याज की वस्तु को ध्यान में रखना चाहते हैं, बल्कि इसकी सटीक स्थान (स्रोत फ़ाइल, रेखा, यहां तक कि कॉलम) को नोट करना चाहते हैं क्योंकि मूल पाठ में समान रूप से वर्तनी वाले आइटमों को संशोधित पाठ में अलग-अलग वर्तनी की आवश्यकता हो सकती है।
यदि आपके पास एएसटी है तो स्ट्रिंग का गणना बहुत आसान है; बस पेड़ को क्रॉल करें और स्ट्रिंग अक्षर युक्त वृक्ष नोड्स देखें। (एएनटीएलआर और ग्रहण निश्चित रूप से भी ऐसा कर सकते हैं)।
यदि पार्सर ने टिप्पणियां कैप्चर की हैं तो टिप्पणियों की गणना भी सरल है। डीएमएस करता है। मुझे पूरा यकीन नहीं है कि क्या एएनटीएलआर का जावा व्याकरण करता है, या ग्रहण एएसटी इंजन; मुझे संदेह है कि वे दोनों सक्षम हैं।
घोषणाओं (कक्षाएं, विधियों, फ़ील्ड, स्थानीय) की गणना अपेक्षाकृत सीधी है; इसके बारे में चिंता करने के लिए और भी अधिक मामले हैं (उदा।, कक्षा वर्गों में एक्सटेंशन वाले अज्ञात वर्ग)। आप एएसटी पर चलने और पेड़ संरचनाओं से मेल खाने के लिए एक प्रक्रिया को कोड कर सकते हैं, लेकिन यहां वह जगह है जहां डीएमएस एक फर्क पड़ता है: आप सतह-वाक्यविन्यास पैटर्न लिख सकते हैं जो उस स्रोत कोड की तरह दिखते हैं, जिसे आप मिलान करना चाहते हैं। उदाहरण के लिए:
pattern local_for_loop_index(i: IDENTIFIER, t: type, e: expression, e2: expression, e3:expression): for_loop_header
= "for (\t \i = \e,\e2,\e3)"
पाश चर के लिए स्थानीय की घोषणाओं से मेल खाते हैं, और पहचानकर्ता, प्रकार, और विभिन्न भाव के लिए subtrees प्राप्त होगा; आप केवल पहचानकर्ता को पकड़ना चाहते हैं (और इसका स्थान, आसानी से स्रोत स्थिति की जानकारी से लिया जाता है जो प्रत्येक पेड़ नोड पर डीएमएस टिकटों को लेता है)। आपको विभिन्न प्रकार के पहचानकर्ताओं के मामलों को कवर करने के लिए शायद 10-20 ऐसे पैटर्न की आवश्यकता होगी।
कैप्चर चरण पूरा हो गया है, कुछ को सभी कब्जे वाली इकाइयों को अपनी लक्षित भाषा में अनुवाद करने की आवश्यकता है। मैं तुम्हें छोड़ दूंगा; अनुवादित इकाइयों को वापस रखना बाकी है।
इसकी कुंजी सटीक स्रोत स्थान है। एक लाइन संख्या अभ्यास में पर्याप्त नहीं है; आपके पास एक ही पंक्ति में कई अनुवादित इकाइयां हो सकती हैं, सबसे खराब स्थिति में, कुछ अलग-अलग क्षेत्रों के साथ (उदाहरण के लिए लूप के लिए नेस्टेड की कल्पना करें)। टिप्पणियों, तारों और घोषणाओं के लिए प्रतिस्थापन प्रक्रिया सरल हैं; किसी भी पहचान वाले स्थानों से मेल खाने वाले नोड्स के लिए पेड़ को पुन: स्कैन करें, और इसके अनुवाद के साथ वहां मिली इकाई को प्रतिस्थापित करें। (आप इसे डीएमएस और एएनटीएलआर के साथ कर सकते हैं। मुझे लगता है कि ग्रहण एडीटी के लिए आपको "पैच" उत्पन्न करने की आवश्यकता है, लेकिन मुझे लगता है कि यह काम करेगा।)।
मजेदार हिस्सा पहचानकर्ता का उपयोग करने में आता है।इसके लिए आपको दो बातें पता करने की जरूरत:
एक पहचानकर्ता के किसी भी
उपयोग के लिए
- , क्या घोषणा का उपयोग करता है है, यदि आप इसे जानते हैं, तो आप इसे घोषणा के लिए नए नाम से बदल सकते हैं; डीएमएस पूर्ण नाम और प्रकार के रिज़ॉल्यूशन के साथ-साथ उपयोग सूची प्रदान करता है, जिससे यह बहुत आसान हो जाता है, और
- क्या नाम बदलकर पहचानकर्ता मूल रूप से अलग-अलग क्षेत्रों में अलग-अलग होते हैं? सामान्य रूप से करना मुश्किल है। हालांकि, जावा भाषा के लिए, हमारे पास "छायांकन" जांच है, इसलिए आप कम से कम तय कर सकते हैं कि आपके पास कोई समस्या है। (, तो आप बस समझौता पेड़ वापस बाहर पुनर्लेखन एक स्रोत फ़ाइल डीएमएस का उपयोग कर के रूप में भी एक नाम प्रक्रिया है कि इस तरह छाया को हल करने के लिए इस्तेमाल किया जा सकता है का विरोध करता
पेड़ पैचिंग के बाद नहीं है के अंतर्निहित prettyprinter। मुझे लगता है कि ग्रहण एएसटी कर सकते हैं अपने पेड़ के साथ पैच लिखो। मुझे यकीन नहीं है कि एएनटीएलआर एएसटी से स्रोत कोड को पुन: उत्पन्न करने के लिए कोई सुविधा प्रदान करता है, हालांकि किसी ने जावा व्याकरण के लिए कोड किया हो सकता है। यह harder to do than it sounds है, सभी पिक्री विवरणों के कारण। वाईएमएमवी
अपने लक्ष्य को देखते हुए, मैं थोड़ा आश्चर्यचकित हूं कि आप एक स्रोतफाइल "foo.java" नहीं चाहते हैं जिसमें "कक्षा foo {...}" का नाम बदलकर .java हो। इसके लिए न केवल तब्दील पेड़ को लिखना होगा अनुवादित करने के लिए फ़ाइल का नाम (बहुत आसान) लेकिन शायद निर्देशिका पेड़ का पुनर्निर्माण भी कर रहा है (डीएमएस निर्देशिका निर्माण और फ़ाइल प्रतियों को भी करने के लिए सुविधाएं प्रदान करता है)।
यदि आप इसे कई भाषाओं के लिए करना चाहते हैं, तो आपको प्रति भाषा एक बार प्रक्रिया को चलाने की आवश्यकता होगी। यदि आप केवल स्ट्रिंग्स (क्लासिक इंटरनेशनललाइजेशन केस) के लिए ऐसा करना चाहते हैं, तो आप एक अद्वितीय संसाधन आईडी के साथ संसाधन पहुंच पर कॉल करके प्रत्येक स्ट्रिंग को बदल देंगे (जिसे बदलने की जरूरत है, उनमें से सभी नहीं); एक रनटाइम टेबल विभिन्न तारों को पकड़ लेगा।
संपत्ति फ़ाइलों का उपयोग करें। –
इसे देखें http://stackoverflow.com/questions/1318347/how-to-use-java-property-files –
[जावा अंतर्राष्ट्रीयकरण ट्यूटोरियल] (http://docs.oracle.com/javase/tutorial/i18n/ index.html) अच्छी शुरुआत है। –