Parser สำหรับ C #


101

มีตัวแยกวิเคราะห์ใดบ้างสำหรับการแยกวิเคราะห์รหัส C #

ฉันกำลังมองหาตัวแยกวิเคราะห์ C # ที่สามารถใช้ใน C # และให้ฉันเข้าถึงข้อมูลบรรทัดและไฟล์เกี่ยวกับสิ่งประดิษฐ์แต่ละชิ้นของรหัสที่วิเคราะห์ได้

คำตอบ:


118

ทำงานกับซอร์สโค้ด:

  • CSParser : จาก C # 1.0 ถึง 2.0 โอเพ่นซอร์ส
  • Metaspec C # Parser : ตั้งแต่ C # 1.0 ถึง 3.0 ผลิตภัณฑ์เชิงพาณิชย์ (ประมาณ 5,000 $)
  • # รับรู้! : ตั้งแต่ C # 1.0 ถึง 3.0 ผลิตภัณฑ์เชิงพาณิชย์ (ประมาณ 900 €) (ตอบโดยSharpRecognize )
  • SharpDevelop Parser (ตอบโดยAkselsson )
  • NRefactory : จาก C # 1.0 ถึง 4.0 (+ async), โอเพ่นซอร์ส, ตัวแยกวิเคราะห์ที่ใช้ใน SharpDevelop รวมถึงการวิเคราะห์ความหมาย
  • C # Parser และ CodeDOM : ตัวแยกวิเคราะห์ C # 4.0 ที่สมบูรณ์รองรับฟีเจอร์ async C # 5.0 อยู่แล้ว ผลิตภัณฑ์เชิงพาณิชย์ (49 $ ถึง 299 $) (คำตอบโดยKen Beckett )
  • Microsoft Roslyn CTP : คอมไพเลอร์เป็นบริการ

ทำงานในการประกอบ:

ปัญหาเกี่ยวกับแอสเซมบลี "การแยกวิเคราะห์" คือเรามีข้อมูลเกี่ยวกับบรรทัดและไฟล์น้อยลง (ข้อมูลอ้างอิงจากไฟล์. pdb และ Pdb มีข้อมูลบรรทัดสำหรับวิธีการเท่านั้น)

ผมขอแนะนำให้ personnaly Mono.CecilและNRefactory


1
CS-Script ( csscript.net ) - C # Script Engine อาจรวมรายการนี้ ตัวอย่างของ "การแนะนำ Microsoft" Roslyn "CTP" นั้นเหมือนกับที่สคริปต์ CS สามารถทำได้
Dzmitry Lahoda

1
ในขณะที่คุณกำลังพูดถึงค่าใช้จ่ายโปรดทราบว่า Roslyn ต้องการ Visual Studio เวอร์ชัน Pro เป็นอย่างน้อย
kristianp

7

โมโน (โอเพนซอร์ส) ประกอบด้วยคอมไพเลอร์ C # (และแน่นอนตัวแยกวิเคราะห์)


ข้อดีของการใช้ Mono กับ parser อื่น ๆ คืออะไร? ฉันสามารถรับข้อมูล AST ของโปรแกรม C # โดยใช้ผู้เยี่ยมชมได้หรือไม่? ถ้าเป็นเช่นนั้นคุณช่วยนำทางฉันไปยังหน้าที่แสดงหน้านั้นได้ไหม
yeeen

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()วิธีการ
Don Kirkby

3
ไม่อย่าดูที่วิธี CodeDomProvider.Parse () ซึ่งแสดงข้อยกเว้น NotImplemented ในงานสร้างสาธารณะ! (Visual Studio ใช้ตัวแยกวิเคราะห์ภายในที่เป็นกรรมสิทธิ์)
Robin Davies


4

ฉันได้ใช้สิ่งที่คุณต้องการ (การแยกวิเคราะห์ AST ของรหัส C #) ที่โครงการOWASP O2 Platformโดยใช้ SharpDevelop AST APIs

เพื่อให้ง่ายต่อการบริโภคฉันได้เขียน API ด่วนที่แสดงองค์ประกอบรหัสแหล่งที่มาหลักจำนวนหนึ่ง (โดยใช้คำสั่งประเภทวิธีการคุณสมบัติฟิลด์ความคิดเห็น) และสามารถเขียนโค้ด C # เดิมลงใน C # และลงใน VBNET ได้ .

ท่านสามารถเข้าดู API นี้ในการดำเนินการเกี่ยวกับไฟล์นี้สคริปต์ O2 XRule: ascx_View_SourceCode_AST.cs.o2

ตัวอย่างเช่นนี่คือวิธีที่คุณประมวลผลข้อความซอร์สโค้ด C # และเติม TreeViews & TextBoxes จำนวนมาก:

    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ยังแสดงวิธีที่คุณสามารถใช้ข้อมูลที่รวบรวมจาก AST เพื่อเลือกซอร์สโค้ดประเภทวิธีการข้อคิดเห็น ฯลฯ

สำหรับการอ้างอิงที่นี่คือรหัส API ที่เขียน (โปรดทราบว่านี่เป็นรหัสผ่านแรกของฉันในการใช้ตัวแยกวิเคราะห์ C # AST ของ SharpDevelop และฉันยังคงเข้าใจว่ามันทำงานอย่างไร):


ใช่นี่ดูเหมือนจะเป็นวิธีแก้ปัญหาที่ง่ายที่สุดอย่างน้อยก็ขึ้นอยู่กับสิ่งที่ฉันได้เห็น ฉันกำลังมองหาตัวแยกวิเคราะห์ที่เหมาะสมและพบกับบล็อกนี้svengrand.blogspot.com/2010/10/…ซึ่งมีรายละเอียดวิธีการใช้ตัวแยกวิเคราะห์ C # ของ SharpDevelop
Alex

3

เมื่อเร็ว ๆ นี้เราได้เปิดตัวโปรแกรมแยกวิเคราะห์ C # ที่จัดการกับคุณสมบัติ C # 4.0 ทั้งหมดพร้อมกับคุณสมบัติใหม่ของ async: C # Parser และ CodeDOM

ไลบรารีนี้สร้างแบบจำลองอ็อบเจ็กต์เชิงความหมายซึ่งเก็บข้อคิดเห็นและข้อมูลการจัดรูปแบบและสามารถแก้ไขและบันทึกได้ นอกจากนี้ยังสนับสนุนการใช้แบบสอบถาม LINQ เพื่อวิเคราะห์ซอร์สโค้ด



2

SharpDevelopซึ่งเป็น IDE แบบโอเพนซอร์สมาพร้อมกับตัวแยกวิเคราะห์รหัสตามผู้เยี่ยมชมซึ่งใช้งานได้ดีจริงๆ สามารถใช้งานได้โดยไม่ขึ้นกับ IDE


2

พิจารณาใช้การสะท้อนบนไบนารีที่สร้างขึ้นแทนการแยกวิเคราะห์รหัส C # โดยตรง API การสะท้อนนั้นใช้งานง่ายมากและบางทีคุณอาจได้รับข้อมูลทั้งหมดที่ต้องการ?


3
การสะท้อนกลับเป็นวิธีที่ไม่ดีในการวิเคราะห์แบบคงที่ มันให้เฉพาะข้อมูลที่ตรรกะการสะท้อนสามารถดึงออกมาได้ (เช่น "ชื่อของวิธีการในคลาส" มันไม่ได้ให้ข้อมูลรายละเอียด ("ด้านขวามือของงานนี้คืออะไร") และ จำกัด การคงที่แบบนั้นอย่างรุนแรง การวิเคราะห์ก็ทำได้
Ira Baxter

@Ira Baxter มีข้อ จำกัด บางประการ แต่อย่าลืมว่าคุณสามารถรับรหัส IL ผ่านการสะท้อนกลับได้เช่นกัน ซึ่งหมายความว่าคุณสามารถเข้าใจว่าวิธีการใดที่เรียกว่าสิ่งที่กำหนดให้กับตัวแปรใด ฯลฯ ฉันไม่สามารถนึกถึงหลาย ๆ กรณีที่มันไม่เพียงพอ เพียงแค่ดูว่าปลั๊กอินตัวสะท้อนแสงสามารถทำอะไรได้บ้าง
Hallgrim

คุณจะได้รับรหัส IL จริงผ่าน Reflection ได้อย่างไร? เท่าที่ฉันทราบว่า Reflection ไม่ได้ให้สิ่งนี้และคุณต้องใช้ CCI See: stackoverflow.com/questions/2824086/…
Ash

2

มีลักษณะที่โกลด์ Parser มี IU ที่ใช้งานง่ายมากที่ให้คุณทดสอบไวยากรณ์แบบโต้ตอบและสร้างรหัส C # มีตัวอย่างมากมายให้เลือกใช้และฟรี


2
OP ขอสิ่งที่สามารถแยกวิเคราะห์ C # ไม่ใช่บางอย่างใน C # ที่แยกวิเคราะห์อย่างอื่น
Ira Baxter

2

บางทีคุณอาจลองใช้ Irony บน irony.codeplex.com

มันเร็วมากและมีไวยากรณ์ ac # อยู่แล้ว

ไวยากรณ์นั้นเขียนโดยตรงใน c # ในรูปแบบ BNF เช่นเดียวกับ (ได้รับจากตัวดำเนินการบางตัวที่มากเกินไป)

สิ่งที่ดีที่สุดคือ "ไวยากรณ์" สร้าง AST โดยตรง


ความคิดเห็นใน Irony.Samples / CSharp / CSharpGrammar.cs ระบุว่า "หมายเหตุ: ไวยากรณ์นี้เป็นเพียงการสาธิตและเป็นการสาธิตที่ไม่สมบูรณ์" ดังนั้นจึงไม่ใช่การนำไปใช้งานที่สมบูรณ์อย่างน้อยที่สุด
vladich

2

แน่นอนคุณควรตรวจสอบโรสลินตั้งแต่ MS เพิ่งเปิด (หรือเร็ว ๆ นี้จะเปิด) รหัสด้วย Apache 2 ใบอนุญาตที่นี่ นอกจากนี้คุณยังสามารถตรวจสอบวิธีการที่จะแยกข้อมูลนี้กับรหัสนี้จากGitHub


1

สิ่งที่ได้รับแรงผลักดันและเหมาะสมกับงานนี้คือNemerle

คุณสามารถดูวิธีแก้ปัญหาได้ในวิดีโอเหล่านี้จาก NDC:


Nemerle เป็นภาษาโปรแกรม ฉันเห็นด้วยภาษาโปรแกรมที่ดี แต่คำถามคือวิธีแยกวิเคราะห์รหัส C # ภายใน C #!
Qwertie

คุณสร้างกฎใน nemerle และใช้มันจาก C # ไม่มีอะไรบอกว่า parser ต้องอยู่ใน C # แต่ไม่ว่าอะไรก็ตามให้โหวตลงไป
Stéphane

1

ไม่ได้อยู่ใน C # แต่ตัวแยกวิเคราะห์ C # 2/3/4 แบบเต็มที่สร้าง AST แบบเต็มนั้นสามารถใช้ได้กับDMS Software Reengineering Toolkit ของเรา

DMS จัดเตรียมโครงสร้างพื้นฐานขนาดใหญ่สำหรับการแยกวิเคราะห์การสร้างต้นไม้การสร้างตารางสัญลักษณ์และการวิเคราะห์โฟลว์การแปลงซอร์สไปยังซอร์สและการสร้างซอร์สโค้ดใหม่จาก AST (แก้ไข) (นอกจากนี้ยังรองรับภาษาอื่น ๆ อีกมากมายนอกเหนือจากภาษา C #)

แก้ไข (กันยายน) 2013: คำตอบนี้ไม่ได้รับการอัปเดตเมื่อเร็ว ๆ นี้ DMS จัดการ C # 5.0 ได้นานแล้ว


-1

GPPGอาจใช้งานได้หากคุณเต็มใจที่จะเขียนโปรแกรมแยกวิเคราะห์ของคุณเอง (ซึ่งเป็นเรื่องสนุก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.