2010-05-12 3 views
5

मैं जावा और सी कोड के अस्थिर का एक्सएमएल प्रतिनिधित्व प्राप्त करना चाहता हूं। 3 महीने पहले, मैं this question yet कहा लेकिन समाधानस्रोत कोड को अस्थिर के एक्सएमएल आधारित प्रतिनिधित्व में कैसे परिवर्तित करें?

  • srcml इस समस्या के लिए एक अच्छा समाधान हो रहा है, लेकिन यह लाइन नंबर और स्तंभों का समर्थन नहीं करता, लेकिन मैं उस सुविधा की जरूरत है मेरे लिए सहज नहीं थे।
  • elsa: उद्धरण: "एल्सा एएसटी को एक्सएमएल दस्तावेज़ के रूप में निर्यात करने के लिए सतत प्रयास चल रहा है; हम अगले सार्वजनिक रिलीज में इसका विज्ञापन करने में सक्षम होने की उम्मीद कर रहे हैं।"
  • dms ... इसे समझ में नहीं आया।
  • विशेष रूप से जावा के लिए, javaml है जो लाइन संख्याओं का समर्थन करता है। लेकिन sourceforge page किसी भी फाइल को सूचीबद्ध नहीं करता है।

प्रश्न: सॉफ्टवेयर उपलब्ध है जो एक्सएम में एक्स के रूपांतरण का समर्थन करता है जो लाइन नंबर (और कॉलम) का समर्थन करता है [विशेष रूप से जावा और सी/सी ++] के लिए? क्या javaml और srcml का कोई विकल्प है?

ps: मुझे पार्स जेनरेटर नहीं हैं। मुझे एक उपकरण खोजने की उम्मीद है जिसे कंसोल टाइपिंग पर इस्तेमाल किया जा सकता है: ./my-xml- जनरेटर टेस्ट.जावा [या ऐसा कुछ] ... या जावा कार्यान्वयन भी बहुत अच्छा होगा।

+0

आप क्या करना चाहते हैं, * * आपको एक्सएमएल का उपयोग करने की आवश्यकता है? –

+2

srcML अब लाइन नंबर और कॉलम का समर्थन करता है। वेबसाइट से: "फ़ाइल स्तर पर मेटाडेटा से संबंधित फ़ाइल और निर्देशिका, यानी, भाषा, फ़ाइल स्थान और संस्करण जानकारी।" मैंने srcML का व्यापक रूप से उपयोग किया है और यह सत्यापित कर सकता है कि इसमें लाइन नंबर और कॉलम जानकारी है। –

उत्तर

1

http://www.gccxml.org/HTML/Index.html पर जीसीसी-एक्सएमएल है - चेतावनी; मैंने वास्तव में इसे स्वयं इस्तेमाल नहीं किया है।

+1

AFAIK, जीसीसी-एक्सएमएल केवल डंप प्रकार परिभाषा डेटा, कार्यों के शरीर के लिए कोड नहीं। –

2

DMS के बारे में आप क्या नहीं समझ पाए?

यह मौजूद है।

इसमें कंपाइलर सटीक parsers/frontends for C, C++, Java, C#, COBOL (and many other languages) है।

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

इसमें एएसटी से एक्सएमएल उत्पन्न करने के लिए एक अंतर्निहित विकल्प है, नोड प्रकार, स्रोत स्थिति (ऊपर के रूप में), और किसी भी संबंधित शाब्दिक मूल्य के साथ पूरा करें। कमांड लाइन कॉल है:

run DMSDomainParser ++XML <path_to_your_file> 

आप see what such an XML result looks like for Java कर सकते हैं।

शायद आप वास्तव में वह नहीं चाहते हैं जो आप चाहते हैं। एक 1000 सी प्रोग्राम में # शामिल फ़ाइल सामग्री की 100K लाइनें हो सकती हैं। एक रेखा 5-10 नोड्स के बीच पैदा करती है। डीएमएस एक्सएमएल आउटपुट succint है और प्रत्येक नोड केवल एक लाइन लेता है, इसलिए आप ~ 60 मिलियन वर्णों के 60 वर्णों के एक्सएमएल की ~ 1 मिलियन लाइनों को देख रहे हैं। यह एक बड़ी फाइल है, और आप शायद इसे एक्सएमएल-आधारित टूल से संसाधित नहीं करना चाहते हैं।

डीएमएस ही ASTs यह बनाता है जोड़ तोड़ के लिए बुनियादी सुविधाओं की एक विशाल राशि प्रदान करता है:,, traversing पैटर्न, स्रोत करने वाली स्रोत बदल देती है, नियंत्रण प्रवाह, डाटा प्रवाह (स्रोत के रूप में अनिवार्य रूप से कोडित पैटर्न के खिलाफ) मिलान अंक करने के लिए विश्लेषण, वैश्विक कॉल ग्राफ। आपको यह सारी मशीनरी दोहराने के लिए आश्चर्यजनक रूप से कठिन लगेगा, और आपको कुछ भी दिलचस्प करने की आवश्यकता होगी।

नैतिक: एक्सएम के साथ लड़ने के बजाय सीधे एएसटी में हेरफेर करने के लिए डीएमएस जैसे कुछ का उपयोग करने के लिए बेहतर है।

पूर्ण प्रकटीकरण: मैं डीएमएस के पीछे वास्तुकार हूँ।

3

थोड़ी देर हो चुकी है लेकिन यहाँ एक है: http://xmltranslator.appspot.com/sourcecodetoxml.html

मैं इसे अपने आप को लागू किया है और यह XML करने के लिए PHP और जावा बदल देता है। यह मुफ़्त है इसलिए आनंद लें!

ओना।

+0

और इनपुट जावा की 1000 लाइनों के लिए, आपको एक XML दस्तावेज़ कितना बड़ा लगता है? –

0

केवल जावा के लिए, आप BeautyJ उपयोग कर सकते हैं।

आप विकल्पों -xml साथ अपनी फ़ाइल के खिलाफ यह शुरू कर सकते हैं। *। उदाहरण के लिए:

java /your/dir/BeautyJ/lib/beautyj.jar beautyj -xml.out= -xml.doctype your_file.java 

... और आपको उस फ़ाइल का एक XML प्रतिनिधित्व (और शामिल किया गया) मिलता है।

BTW

: "-xml.out =" विकल्प कोई आउटपुट फ़ाइल निर्दिष्ट करें। इस तरह से प्रयुक्त "=" के साथ, यह आउटपुट को STDOUT तक उपयोग किया जाता है। यह कोई त्रुटि नहीं है।

0

srcml लाइन नंबर और स्तंभ संख्या का समर्थन करता है।

public class HelloWorld { 
    public static void main(String[] args) { 
     // Prints "Hello, World" to the terminal window. 
     System.out.println("Hello, World"); 
    } 
} 

फिर इस पर नज़र रखने के सक्षम करने के लिए आदेश के साथ srcml चलाएँ: यहाँ एक जावा input.java बुलाया फ़ाइल का उपयोग कर एक उदाहरण है जिसमें निम्न शामिल (मन srcml में रखने C/C++ सहित कई भाषाओं का समर्थन करता है) अतिरिक्त स्थिति की जानकारी:

srcml input.java --position 

यह लाइन नंबर और स्तंभ संख्या के साथ एक XML प्रारूप एम्बेडेड में निम्नलिखित एएसटी पैदा करता है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<unit xmlns="http://www.srcML.org/srcML/src" xmlns:pos="http://www.srcML.org/srcML/position" revision="0.9.5" language="Java" filename="input.java" pos:tabs="8"><class><specifier pos:line="1" pos:column="1">public<pos:position pos:line="1" pos:column="7"/></specifier> class <name pos:line="1" pos:column="14">HelloWorld<pos:position pos:line="1" pos:column="24"/></name> <block pos:line="1" pos:column="25">{ 
    <function><specifier pos:line="2" pos:column="5">public<pos:position pos:line="2" pos:column="11"/></specifier> <specifier pos:line="2" pos:column="12">static<pos:position pos:line="2" pos:column="18"/></specifier> <type><name pos:line="2" pos:column="19">void<pos:position pos:line="2" pos:column="23"/></name></type> <name pos:line="2" pos:column="24">main<pos:position pos:line="2" pos:column="28"/></name><parameter_list pos:line="2" pos:column="28">(<parameter><decl><type><name><name pos:line="2" pos:column="29">String<pos:position pos:line="2" pos:column="35"/></name><index pos:line="2" pos:column="35">[]<pos:position pos:line="2" pos:column="37"/></index></name></type> <name pos:line="2" pos:column="38">args<pos:position pos:line="2" pos:column="42"/></name></decl></parameter>)<pos:position pos:line="2" pos:column="43"/></parameter_list> <block pos:line="2" pos:column="44">{ 
    <comment type="line" pos:line="3" pos:column="9">// Prints "Hello, World" to the terminal window.</comment> 
    <expr_stmt><expr><call><name><name pos:line="4" pos:column="9">System<pos:position pos:line="4" pos:column="15"/></name><operator pos:line="4" pos:column="15">.<pos:position pos:line="4" pos:column="16"/></operator><name pos:line="4" pos:column="16">out<pos:position pos:line="4" pos:column="19"/></name><operator pos:line="4" pos:column="19">.<pos:position pos:line="4" pos:column="20"/></operator><name pos:line="4" pos:column="20">println<pos:position pos:line="4" pos:column="27"/></name></name><argument_list pos:line="4" pos:column="27">(<argument><expr><literal type="string" pos:line="4" pos:column="28">"Hello, World"<pos:position pos:line="4" pos:column="42"/></literal></expr></argument>)<pos:position pos:line="4" pos:column="43"/></argument_list></call></expr>;<pos:position pos:line="4" pos:column="44"/></expr_stmt> 
    }<pos:position pos:line="5" pos:column="6"/></block></function> 
}<pos:position pos:line="6" pos:column="2"/></block></class></unit> 

संदर्भ: srcml v0.9.5 (srcml --help देखें) के लिए प्रलेखन। मैं स्थिति जानकारी प्राप्त करने के लिए इस सुविधा सहित अक्सर srcml का भी उपयोग करता हूं।

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