C # कोड पार्स करने के लिए कौन से पार्सर उपलब्ध हैं?
मैं एक C # पार्सर की तलाश कर रहा हूं जिसका उपयोग C # में किया जा सकता है और मुझे विश्लेषण किए गए कोड के प्रत्येक आर्टिफैक्ट के बारे में लाइन और फाइल का उपयोग करने की अनुमति देता है।
C # कोड पार्स करने के लिए कौन से पार्सर उपलब्ध हैं?
मैं एक C # पार्सर की तलाश कर रहा हूं जिसका उपयोग C # में किया जा सकता है और मुझे विश्लेषण किए गए कोड के प्रत्येक आर्टिफैक्ट के बारे में लाइन और फाइल का उपयोग करने की अनुमति देता है।
जवाबों:
स्रोत कोड पर काम करता है:
विधानसभा पर काम करता है:
असेंबली "पार्सिंग" के साथ समस्या यह है कि हमारे पास लाइन और फ़ाइल के बारे में कम informations है (informations .pdb फ़ाइल पर आधारित है, और Pdb में केवल विधियों के लिए लाइनें शामिल हैं)
मैं व्यक्ति के लिए Mono.Cecil और NRefactory की सिफारिश करता हूं ।
यदि आप 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
CodeDomProvider.Parse()
विधि को देखें।
यदि आप ANTLR से परिचित हैं, तो आप Antlr C # व्याकरण का उपयोग कर सकते हैं ।
मैंने सिर्फ वही किया है जो आप पूछ रहे हैं (एएसटी पार्सिंग ऑफ सी # कोड) ओडब्ल्यूएएसपी ओ 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 का उपयोग करके मेरा पहला पास है, और मैं अभी भी अपना सिर इधर-उधर कर रहा हूं कि यह कैसे काम करता है):
हमने हाल ही में एक C # पार्सर जारी किया है, जो सभी C # 4.0 सुविधाओं को संभालता है और साथ ही नई async सुविधा: C # Parser और CodeDOM
यह लाइब्रेरी एक सिमेंटिक ऑब्जेक्ट मॉडल बनाती है जो टिप्पणियों और प्रारूपण की जानकारी को बनाए रखती है और इसे संशोधित और सहेजा जा सकता है। यह स्रोत कोड का विश्लेषण करने के लिए LINQ क्वेरी के उपयोग का भी समर्थन करता है।
SharpDevelop , एक खुला स्रोत IDE, एक आगंतुक-आधारित कोड पार्सर के साथ आता है जो वास्तव में अच्छी तरह से काम करता है। इसका उपयोग आईडीई के स्वतंत्र रूप से किया जा सकता है।
सी # कोड को सीधे पार्स करने के बजाय एक निर्मित बाइनरी पर प्रतिबिंब का उपयोग करने पर विचार करें। प्रतिबिंब एपीआई का उपयोग करना वास्तव में आसान है और शायद आप अपनी ज़रूरत की सभी जानकारी प्राप्त कर सकते हैं?
गोल्ड पार्सर पर एक नजर । इसमें एक बहुत ही सहज IU है जो आपको अंतःक्रियात्मक रूप से आपके व्याकरण का परीक्षण करने और C # कोड उत्पन्न करने देता है। इसके साथ बहुत सारे उदाहरण उपलब्ध हैं और यह पूरी तरह से स्वतंत्र है।
शायद आप irony.codeplex.com पर आयरनरी के साथ प्रयास कर सकते थे।
यह बहुत तेज़ है और एसी # व्याकरण पहले से मौजूद है।
व्याकरण में ही सीधे # बीएनएफ में सी # लिखा जाता है जैसे (कुछ ऑपरेटरों के अधिभार के साथ)
इसके साथ सबसे अच्छी बात यह है कि "व्याकरण" सीधे एएसटी का उत्पादन करता है।
कुछ है कि इस काम के लिए गति और बहुत उचित प्राप्त कर रहा है है Nemerle
आप देख सकते हैं कि एनडीसी से इन वीडियो में इसे कैसे हल किया जा सकता है:
C # में नहीं, बल्कि एक पूर्ण C # 2/3/4 पार्सर जो पूर्ण एएसटी बनाता है, हमारे डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट के साथ उपलब्ध है ।
डीएमएस पार्सिंग, ट्री बिल्डिंग, सिंबल टेबल के निर्माण और फ्लो एनालिसिस, सोर्स-टू-सोर्स ट्रांसफॉर्मेशन और (संशोधित) एएसटी से सोर्स कोड के पुनर्जनन के लिए एक विशाल आधारभूत संरचना प्रदान करता है। (यह सिर्फ C # के अलावा कई अन्य भाषाओं को भी हैंडल करता है।)
EDIT (सितंबर) 2013: यह उत्तर हाल ही में अपडेट नहीं किया गया है। डीएमएस ने लंबे समय तक सी # 5.0 को संभाला है