2009-02-10 18 views
13

में लाइन नंबर ओवरराइड करना जावा में लाइन नंबर ओवरराइड करने का कोई तरीका है (उदाहरण के लिए, किसी प्रकार के प्रीप्रोसेसर निर्देश का उपयोग करके)?जेनरेट किए गए जावा स्रोत

मैं जेनोनो का उपयोग कर जावा बाइट कोड के नीचे एक उच्च स्तरीय भाषा "संकलित" कर रहा हूं। मुझे मूल फ़ाइल से लाइन की रिपोर्ट करने के लिए कंपाइलर त्रुटियों की आवश्यकता है, जेनरेट किए गए जावा कोड नहीं।

सी # में # लाइन निर्देश है, और मैंने इसे स्रोत फ़ाइल से संकलित परिणाम में लाइन नंबरों को मैप करने के लिए सफलतापूर्वक इसका शोषण किया है। मुझे जावा के लिए इसकी ज़रूरत है।

धन्यवाद!

+0

यदि आप जावा बाइट कोड से संकलित कर रहे हैं, तो आपको लाइन नंबरों को जानना चाहिए। या क्या आपका मतलब है कि आप जावा से संकलित कर रहे हैं और जावा कंपाइलर इसे ले रहा है और बाइट कोड से संकलित कर रहा है? – jdigital

उत्तर

3

का उपयोग Janino आप Scanner से निकाले जाते हैं और location() विधि ओवरराइड कर सकते हैं हो सकता है। यह विधि एक स्थान वस्तु देता है। उदाहरण के लिए टिप्पणी (कोड जनरेशन के दौरान जोड़ा गया) के भीतर टिप्पणियों के भीतर, एनोटेशन देखने के लिए आप read() विधि को ओवरराइड कर सकते हैं, जिसमें लाइन नंबर की जानकारी हो।

आप बस SimpleCompiler.cook() विधि के लिए अपने स्कैनर गुजरती हैं और आप क्या फ़ाइल नाम, पंक्ति और स्तंभ त्रुटि को सूचना दी पाने नियंत्रित कर सकते हैं।

4

दुर्भाग्यवश, नहीं, जावा में समतुल्य #line निर्देश नहीं है। वास्तविक स्रोत से मेल खाने के लिए नई लाइनों को हटाने/डालने के द्वारा उत्पन्न किए जाने के बाद सबसे अच्छा आप स्रोत को संशोधित कर सकते हैं (या कोड जनरेटर को संशोधित करें)। या, आप संकलित होने के बाद बाइनरी क्लास फ़ाइलों में संग्रहीत लाइन नंबरों को संशोधित कर सकते हैं, लेकिन यह अधिक दर्दनाक होगा।

1

कोई आसान समाधान नहीं है। जब आप कोड उत्पन्न करते हैं तो एक वर्कअराउंड [आपकी भाषा] से जावा तक लाइन नंबर मैप उत्पन्न करना होगा। आप कंपाइलर आउटपुट पाइप कर सकते हैं और जावा की लाइन नंबरों को अपनी लाइन नंबरों के साथ बदलने के लिए मानचित्र का उपयोग कर सकते हैं।

8

मैंने इसे कभी भी जेएसपी के अलावा अन्य उपयोग नहीं देखा है, लेकिन JSR-45 किसी भी स्रोत भाषा के लिए इस उद्देश्य के लिए उपयोग करने के लिए डिज़ाइन किया गया था। इस प्रक्रिया में एक विशेष प्रारूप ("एसएमएपी") में दूसरी फ़ाइल बनाना शामिल है जो जेनरेट किए गए जावा स्रोत कोड में मूल स्रोत में रेखा संख्याओं को लाइन नंबरों पर जोड़ता है।

3

जावा कोड को अपनी मध्यवर्ती भाषा के रूप में उत्पन्न करने के बजाय, आप JVM असेंबलर का उपयोग करने का प्रयास कर सकते हैं। Jasmin में अच्छा वाक्यविन्यास है, और आप अपने कोड में उचित स्थानों पर .लाइन निर्देश डालने के लिए स्वतंत्र हैं। आप .source निर्देश का उपयोग कर मूल स्रोत फ़ाइल भी निर्दिष्ट कर सकते हैं।

दी, कोडांतरक मार्ग जा रहा अधिक परेशानी की तुलना में यह लायक है :)

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