2008-10-17 29 views
15

क्या वर्तमान में सी # कोड को एक सार सिंटेक्स ट्री में अनुवाद करना संभव है?सी # कोड एएसटी में अनुवाद करें?

संपादित करें: कुछ स्पष्टीकरण; मुझे जरूरी नहीं है कि संकलक मेरे लिए एएसटी उत्पन्न करे - एक पार्सर ठीक होगा, हालांकि मैं कुछ "आधिकारिक" का उपयोग करना चाहता हूं। दुर्भाग्य से लैम्ब्डा अभिव्यक्ति पर्याप्त नहीं होने के कारण वे मुझे बयान निकायों का उपयोग करने की अनुमति नहीं देते हैं, जो मैं ढूंढ रहा हूं।

+0

आश्चर्य है कि सी # कोड को एएसटी में अनुवाद करने का आपका प्रयास कैसा चल रहा है? – yeeen

+0

मैंने प्रोजेक्ट को पकड़ में रखा है। –

+4

लंबी अवधि की पकड़ ... लॉल –

उत्तर

17

Roslyn प्रोजेक्ट विजुअल स्टूडियो 2010 में है और आपको अन्य चीजों के साथ Syntax Tree पर प्रोग्रामेटिक पहुंच प्रदान करता है।

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here "); 
var root = (CompilationUnitSyntax)tree.Root; 
+0

मैं इसे अपने स्वयं के प्रश्न के उत्तर के रूप में पोस्ट करने जा रहा था, लेकिन आपने मुझे इसे हराया। =) –

6

.NET CodeDom समर्थन देखें। C# CodeDOM parser के लिए कोड प्रोजेक्ट पर एक पुराना आलेख है, लेकिन यह नई भाषा सुविधाओं का समर्थन नहीं करेगा।

इस posting के अनुसार सी # स्रोत कोड से कोडडॉम पेड़ उत्पन्न करने के लिए #develop में समर्थन होना चाहिए।

0

कृपया आर # प्रोजेक्ट देखें (क्षमा करें रूसी में रूसी हैं, लेकिन कुछ कोड उदाहरण हैं)। यह सी # कोड पर एएसटी मैनिप्लेशंस की अनुमति देता है।

इसके अलावा, कृपया Nemerle भाषा देखना (यूआरएल अद्यतन, धन्यवाद, derigel):

http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml

परियोजना की SVN here है। यह मेटाप्रोग्रामिंग के लिए मजबूत समर्थन के साथ एक नेट भाषा है।

+0

रिपोजिटरी अब http://svn.rsdn.ru/svn/RSharp/ – derigel

12

क्या वर्तमान में सी # कोड को एक सार सिंटेक्स ट्री में अनुवाद करना संभव है?

हाँ, तुच्छता से विशेष परिस्थितियों में (= का उपयोग कर नए Expressions framework):

// Requires 'using System.Linq.Expressions;' 
Expression<Func<int, int>> f = x => x * 2; 

यह लैम्ब्डा के लिए एक अभिव्यक्ति पेड़ है, यानी एक समारोह एक int लेने और डबल लौटने बनाता है। आप भाव फ्रेमवर्क (कि नाम स्थान में से = वर्ग) का उपयोग करके अभिव्यक्ति पेड़ को संशोधित करें और रन-टाइम में यह संकलन कर सकते हैं:

var newBody = Expression.Add(f.Body, Expression.Constant(1)); 
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters); 
var compiled = f.Compile(); 
Console.WriteLine(compiled(5)); // Result: 11 

ताकि वे द्वारा नए सिरे से बनाया जाना है सूचना है कि सभी भाव अपरिवर्तनीय हैं रचना। इस मामले में, मैंने 1

का एक उदाहरण प्रस्तुत किया है कि ये अभिव्यक्ति पेड़ केवल वास्तविक अभिव्यक्तियों पर काम करते हैं यानी सी # फ़ंक्शन में मिली सामग्री। आप इस तरह के वर्गों जैसे उच्च संरचनाओं के लिए वाक्यविन्यास पेड़ नहीं प्राप्त कर सकते हैं। इनके लिए CodeDom ढांचे का उपयोग करें।

+0

पर है एरिक ने इसे स्वीकार किया? यह बहुत लम्बा रूपों का उपयोग करता है जिसे उन्होंने कहा था कि वह नहीं चाहते थे। –

+1

ईरा: आपको चर्चा के विकास पर ध्यान देना चाहिए। इस प्रविष्टि को * एरिक के संपादन/स्पष्टीकरण से पहले * पोस्ट किया गया था। जाहिर है, उस समय अन्य उत्तरों में से कोई भी बेहतर नहीं था * (नोटिस: * एक साल पहले! *) इसलिए उसने एक और जवाब स्वीकार नहीं किया। आपका जवाब शायद वह चाहता था जो वह चाहता था। –

2

ऐसा लगता है कि इस प्रकार की कार्यक्षमता को Anders Hejlsberg's 'Future of C#' PDC video के अनुसार सी # 4 के बाद जो कुछ भी आता है, उसके साथ शामिल किया जाएगा।

+0

यह देखने में मददगार है कि सी # एपीआई में हेरफेर करने के लिए सी # पुस्तकालय क्यों नहीं पेश करता है। यह इसके संकलक के कारण एक शास्त्रीय है, एक काला बॉक्स है! – yeeen

2

ANTLR Parser Generator में सी # 3.0 के लिए व्याकरण है जो LINQ वाक्यविन्यास को छोड़कर सब कुछ शामिल करता है।

+0

मैंने अतीत में एएनटीएलआर का उपयोग किया है, और यह काफी अच्छा है। मैंने सी # व्याकरण का उपयोग नहीं किया है, लेकिन अधिकांश योगदानकर्ता बहुत सुन्दर हैं। – Travis

1

हमारे C# front end for DMS LINQ सहित पूर्ण सी # 3.0 पार्स और एएसटी का उत्पादन करता है। वास्तव में डीएमएस फ्रंट-एंड प्रदान किए गए लैंगुग के लिए एएसटी का उपयोग करके स्रोत कोड का विश्लेषण/परिवर्तन करने के लिए एक पारिस्थितिक तंत्र है।

संपादित करें 2010/03/10: ... अब संभालती पूर्ण सी # 4.0

संपादित करें: 2014/06/27: काफी कुछ समय के बाद से सी # 5.0 संभालती है।

संपादित करें: 6/15/2016: हैंडल सी # 6.0। एक नमूना एएसटी के लिए https://stackoverflow.com/a/37847714/120163 देखें।

+0

2004? मैं अनुमान लगा रहा हूं 2010. – Cheeso

+0

@ चेसियो: हम्म, 2004 का मतलब होगा कि हमने एमएस को स्कूप्ड किया था। खैर, यह सुझाव देने के लिए कभी नहीं करता है, इसलिए मैंने इसे 2010 में संशोधित किया। फिक्स्ड। –

1

एएनटीएलआर बहुत उपयोगी नहीं है। LINQ वह नहीं है जो आप चाहते हैं।

मोनो का प्रयास करें। सेसिल! http://www.mono-project.com/Cecil

इसका उपयोग एनडीपेन्स समेत कई परियोजनाओं में किया जाता है! http://www.ndepend.com/

4

करने के लिए एक एपीआई लागू किया StackOverflow पर यहाँ एक और धागा पर उत्तर दिया है वहाँ आर # परियोजना की तुलना में बहुत शक्तिशाली है। Nemerle.Peg:

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/

और यह सी # पार्सर जो सभी सी # कोड पारसर्स और AST को इसकी अनुवाद है!

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/

आप यहाँ इंस्टॉलर डाउनलोड कर सकते हैं: https://code.google.com/p/nemerle/

+0

इसके अलावा। Nemerle Nemerle संकलक का उपयोग कर सी # स्रोत संकलित कर सकते हैं! :) –

1

यह है कि कोई भी मौजूदा मोनो सी # संकलक हैकिंग सुझाव दिया अजीब है।

3

व्यक्तिगत रूप से, मैं NRefactory है, जो मुक्त, खुला स्रोत और लाभ लोकप्रियता है का प्रयोग करेंगे।

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