सी # के लिए पार्सर


101

C # कोड पार्स करने के लिए कौन से पार्सर उपलब्ध हैं?

मैं एक C # पार्सर की तलाश कर रहा हूं जिसका उपयोग C # में किया जा सकता है और मुझे विश्लेषण किए गए कोड के प्रत्येक आर्टिफैक्ट के बारे में लाइन और फाइल का उपयोग करने की अनुमति देता है।

जवाबों:


118

स्रोत कोड पर काम करता है:

  • CSParser : C # 1.0 से 2.0 तक, ओपन-सोर्स
  • Metaspec C # Parser : C # 1.0 से 3.0 तक, वाणिज्यिक उत्पाद (लगभग 5000 डॉलर)
  • #पहचानना! : C # 1.0 से 3.0 तक, वाणिज्यिक उत्पाद (लगभग 900 €) ( SharpRecognize द्वारा उत्तर )
  • SharpDevelop Parser ( Akselsson द्वारा उत्तर )
  • NRefactory : C # 1.0 से 4.0 (+ async), Open-source, Parser में SharpDevelop का उपयोग किया गया। सिमेंटिक विश्लेषण शामिल है।
  • C # Parser और CodeDOM : एक पूरा C # 4.0 Parser, पहले से ही C # 5.0 async सुविधा का समर्थन करता है। वाणिज्यिक उत्पाद (49 डॉलर से 299 डॉलर) ( केन बेकेट द्वारा उत्तर )
  • Microsoft Roslyn CTP : कंपाइलर एक सेवा के रूप में।

विधानसभा पर काम करता है:

असेंबली "पार्सिंग" के साथ समस्या यह है कि हमारे पास लाइन और फ़ाइल के बारे में कम informations है (informations .pdb फ़ाइल पर आधारित है, और Pdb में केवल विधियों के लिए लाइनें शामिल हैं)

मैं व्यक्ति के लिए Mono.Cecil और NRefactory की सिफारिश करता हूं


1
CS- स्क्रिप्ट ( csscript.net ) - C # स्क्रिप्ट इंजन इस सूची को सूट कर सकता है। "Microsoft" रोसलिन "CTP" का परिचय बहुत कुछ सीएस-स्क्रिप्ट की तरह कर सकता है।
दज़मिट्री लाहौड़ा

1
जब आप लागतों का उल्लेख कर रहे हों, तो ध्यान दें कि रोजलिन को विजुअल स्टूडियो के कम से कम प्रो संस्करण की आवश्यकता है।
kristianp

7

मोनो (खुला स्रोत) में सी # संकलक (और निश्चित रूप से पार्सर) शामिल हैं


अन्य पार्सर पर मोनो का उपयोग करने का क्या फायदा है? क्या मैं विज़िटर का उपयोग करके C # प्रोग्राम के एएसटी की जानकारी प्राप्त कर सकता हूं? यदि हां, तो क्या आप मुझे उस पृष्ठ पर निर्देशित कर सकते हैं जो उस पृष्ठ को दिखाता है?
यीने

6

यदि आप C # v3.5 को .net असेंबली में संकलित करने जा रहे हैं:

var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx


1
विशेष रूप से CodeDomProvider.Parse()विधि को देखें।
डॉन किर्कबी

3
नहीं, CodeDomProvider.Parse () पद्धति को नहीं देखें, जो सार्वजनिक बिल्डों में NotImplemented अपवाद को फेंकता है! (विजुअल स्टूडियो एक मालिकाना आंतरिक पार्सर का उपयोग करता है)।
रॉबिन डेविस


4

मैंने सिर्फ वही किया है जो आप पूछ रहे हैं (एएसटी पार्सिंग ऑफ सी # कोड) ओडब्ल्यूएएसपी ओ 2 प्लेटफॉर्म प्रोजेक्ट पर शार्पवेदर एएसटी एपीआई का उपयोग कर।

उपभोग करने में आसान बनाने के लिए मैंने एक त्वरित एपीआई लिखा जो कई प्रमुख स्रोत कोड तत्वों (बयानों, प्रकारों, विधियों, गुणों, फ़ील्ड, टिप्पणियों का उपयोग करके) को उजागर करता है और मूल सी # कोड को C # और VBNET में फिर से लिखने में सक्षम है। ।

आप इस API को इस O2 XRule स्क्रिप्ट फ़ाइल पर कार्रवाई में देख सकते हैं: ascx_View_SourceCode_AST.cs.o2

उदाहरण के लिए यह है कि आप C # स्रोत कोड टेक्स्ट को कैसे संसाधित करते हैं और कई ट्री व्यू और टेक्स्टबॉक्स को पॉप्युलेट करते हैं:

    public void updateView(string sourceCode)
    {   
        var ast = new Ast_CSharp(sourceCode);
        ast_TreeView.show_Ast(ast);
        types_TreeView.show_List(ast.astDetails.Types, "Text");
        usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
        methods_TreeView.show_List(ast.astDetails.Methods,"Text");
        fields_TreeView.show_List(ast.astDetails.Fields,"Text");
        properties_TreeView.show_List(ast.astDetails.Properties,"Text");
        comments_TreeView.show_List(ast.astDetails.Comments,"Text");

        rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
        rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");                                
    }

Ascx_View_SourceCode_AST.cs.o2 पर उदाहरण यह भी दिखाता है कि आप स्रोत कोड, प्रकार, टिप्पणी, आदि का चयन करने के लिए एएसटी से एकत्रित जानकारी का उपयोग कैसे कर सकते हैं।

संदर्भ के लिए यहां एपीआई कोड लिखा है (ध्यान दें कि यह SharpDevelop's C # AST parser का उपयोग करके मेरा पहला पास है, और मैं अभी भी अपना सिर इधर-उधर कर रहा हूं कि यह कैसे काम करता है):


हां, जो मैंने देखा है, उसके आधार पर यह समाधान सबसे आसान लगता है। मैं एक अच्छे पार्सर की तलाश कर रहा था और इस ब्लॉग svengrand.blogspot.com/2010/10/… पर ठोकर खाई, जिसमें यह भी बताया गया कि SharpDevelop के C # parser का उपयोग कैसे किया जाए।
एलेक्स

3

हमने हाल ही में एक C # पार्सर जारी किया है, जो सभी C # 4.0 सुविधाओं को संभालता है और साथ ही नई async सुविधा: C # Parser और CodeDOM

यह लाइब्रेरी एक सिमेंटिक ऑब्जेक्ट मॉडल बनाती है जो टिप्पणियों और प्रारूपण की जानकारी को बनाए रखती है और इसे संशोधित और सहेजा जा सकता है। यह स्रोत कोड का विश्लेषण करने के लिए LINQ क्वेरी के उपयोग का भी समर्थन करता है।



2

SharpDevelop , एक खुला स्रोत IDE, एक आगंतुक-आधारित कोड पार्सर के साथ आता है जो वास्तव में अच्छी तरह से काम करता है। इसका उपयोग आईडीई के स्वतंत्र रूप से किया जा सकता है।


2

सी # कोड को सीधे पार्स करने के बजाय एक निर्मित बाइनरी पर प्रतिबिंब का उपयोग करने पर विचार करें। प्रतिबिंब एपीआई का उपयोग करना वास्तव में आसान है और शायद आप अपनी ज़रूरत की सभी जानकारी प्राप्त कर सकते हैं?


3
चिंतन स्थैतिक विश्लेषण करने का एक बुरा तरीका है; यह केवल जानकारी प्रदान करता है कि प्रतिबिंब-तर्क निकाल सकता है (उदाहरण के लिए, "कक्षा में विधियों के नाम"। यह विस्तार से जानकारी प्रदान नहीं करता है ("इस असाइनमेंट के दाहिने हाथ की तरफ क्या है?") और इसलिए गंभीर रूप से उस तरह की सीमा को सीमित करता है? विश्लेषण एक कर सकता है।
इरा बैक्सटर

@ इरा बैक्सटर कुछ सीमाएं हैं, लेकिन याद रखें कि आप प्रतिबिंब के माध्यम से आईएल कोड भी प्राप्त कर सकते हैं। इसका मतलब यह है कि आप समझ सकते हैं कि किस तरीके को कहा जाता है, किस चर को सौंपा जाता है, आदि मैं कई मामलों के बारे में नहीं सोच सकता जहां यह पर्याप्त नहीं है। जरा देखें कि सभी रिफ्लेक्टर प्लगइन्स क्या कर सकते हैं।
हॉलग्रिम

आप प्रतिबिंब के माध्यम से वास्तविक आईएल कोड कैसे प्राप्त करते हैं? जहाँ तक मुझे पता है परावर्तन यह प्रदान नहीं करता है और आपको सीसीआई का उपयोग करने की आवश्यकता है देखें: stackoverflow.com/questions/2824086/…
ऐश

2

गोल्ड पार्सर पर एक नजर । इसमें एक बहुत ही सहज IU है जो आपको अंतःक्रियात्मक रूप से आपके व्याकरण का परीक्षण करने और C # कोड उत्पन्न करने देता है। इसके साथ बहुत सारे उदाहरण उपलब्ध हैं और यह पूरी तरह से स्वतंत्र है।


2
ओपी ने उस चीज़ के लिए कहा जो C # को पार्सर कर सकती है, C # में कुछ नहीं जो कुछ और को पार्स कर सकती है।
ईरा बाक्सटर

2

शायद आप irony.codeplex.com पर आयरनरी के साथ प्रयास कर सकते थे।

यह बहुत तेज़ है और एसी # व्याकरण पहले से मौजूद है।

व्याकरण में ही सीधे # बीएनएफ में सी # लिखा जाता है जैसे (कुछ ऑपरेटरों के अधिभार के साथ)

इसके साथ सबसे अच्छी बात यह है कि "व्याकरण" सीधे एएसटी का उत्पादन करता है।


Irony.Samples / CSharp / CSharpGrammar.cs में टिप्पणी "नोट: यह व्याकरण सिर्फ एक डेमो है, और यह एक टूटा हुआ डेमो है"। इसलिए यह कम से कम पूर्ण कार्यान्वयन नहीं है।
vladich

2

एमएस के खुलने के बाद (या जल्द ही खुलेगा) कोड को अपाचे 2 लाइसेंस के साथ यहां से देखना चाहिए । आप GitHub से इस कोड के साथ इस जानकारी को पार्स करने का एक तरीका भी देख सकते हैं ।


1

कुछ है कि इस काम के लिए गति और बहुत उचित प्राप्त कर रहा है है Nemerle

आप देख सकते हैं कि एनडीसी से इन वीडियो में इसे कैसे हल किया जा सकता है:


नेमारल एक प्रोग्रामिंग लैंग्वेज है। एक अच्छी प्रोग्रामिंग भाषा, मैं सहमत हूँ, लेकिन सवाल यह था कि C # कोड को C # के अंदर पार्स कैसे किया जाए!
क्वर्टी

आप nemerle में नियम बनाते हैं, और इसे C # से उपयोग करते हैं, कुछ भी नहीं कहा गया है कि पार्सर को C # में होना चाहिए, लेकिन जो भी हो, नीचे की ओर।
स्टीफन

1

C # में नहीं, बल्कि एक पूर्ण C # 2/3/4 पार्सर जो पूर्ण एएसटी बनाता है, हमारे डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट के साथ उपलब्ध है ।

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

EDIT (सितंबर) 2013: यह उत्तर हाल ही में अपडेट नहीं किया गया है। डीएमएस ने लंबे समय तक सी # 5.0 को संभाला है


-1

GPPG उपयोग की हो सकती है, यदि आप अपना स्वयं का पार्सर (जो कि मजेदार है) लिखने के लिए तैयार हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.