มีตัวแยกวิเคราะห์ใดบ้างสำหรับการแยกวิเคราะห์รหัส C #
ฉันกำลังมองหาตัวแยกวิเคราะห์ C # ที่สามารถใช้ใน C # และให้ฉันเข้าถึงข้อมูลบรรทัดและไฟล์เกี่ยวกับสิ่งประดิษฐ์แต่ละชิ้นของรหัสที่วิเคราะห์ได้
มีตัวแยกวิเคราะห์ใดบ้างสำหรับการแยกวิเคราะห์รหัส C #
ฉันกำลังมองหาตัวแยกวิเคราะห์ C # ที่สามารถใช้ใน C # และให้ฉันเข้าถึงข้อมูลบรรทัดและไฟล์เกี่ยวกับสิ่งประดิษฐ์แต่ละชิ้นของรหัสที่วิเคราะห์ได้
คำตอบ:
ทำงานกับซอร์สโค้ด:
ทำงานในการประกอบ:
ปัญหาเกี่ยวกับแอสเซมบลี "การแยกวิเคราะห์" คือเรามีข้อมูลเกี่ยวกับบรรทัดและไฟล์น้อยลง (ข้อมูลอ้างอิงจากไฟล์. pdb และ Pdb มีข้อมูลบรรทัดสำหรับวิธีการเท่านั้น)
ผมขอแนะนำให้ personnaly 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 #ได้
ฉันได้ใช้สิ่งที่คุณต้องการ (การแยกวิเคราะห์ 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 และฉันยังคงเข้าใจว่ามันทำงานอย่างไร):
เมื่อเร็ว ๆ นี้เราได้เปิดตัวโปรแกรมแยกวิเคราะห์ C # ที่จัดการกับคุณสมบัติ C # 4.0 ทั้งหมดพร้อมกับคุณสมบัติใหม่ของ async: C # Parser และ CodeDOM
ไลบรารีนี้สร้างแบบจำลองอ็อบเจ็กต์เชิงความหมายซึ่งเก็บข้อคิดเห็นและข้อมูลการจัดรูปแบบและสามารถแก้ไขและบันทึกได้ นอกจากนี้ยังสนับสนุนการใช้แบบสอบถาม LINQ เพื่อวิเคราะห์ซอร์สโค้ด
SharpDevelopซึ่งเป็น IDE แบบโอเพนซอร์สมาพร้อมกับตัวแยกวิเคราะห์รหัสตามผู้เยี่ยมชมซึ่งใช้งานได้ดีจริงๆ สามารถใช้งานได้โดยไม่ขึ้นกับ IDE
พิจารณาใช้การสะท้อนบนไบนารีที่สร้างขึ้นแทนการแยกวิเคราะห์รหัส C # โดยตรง API การสะท้อนนั้นใช้งานง่ายมากและบางทีคุณอาจได้รับข้อมูลทั้งหมดที่ต้องการ?
มีลักษณะที่โกลด์ Parser มี IU ที่ใช้งานง่ายมากที่ให้คุณทดสอบไวยากรณ์แบบโต้ตอบและสร้างรหัส C # มีตัวอย่างมากมายให้เลือกใช้และฟรี
บางทีคุณอาจลองใช้ Irony บน irony.codeplex.com
มันเร็วมากและมีไวยากรณ์ ac # อยู่แล้ว
ไวยากรณ์นั้นเขียนโดยตรงใน c # ในรูปแบบ BNF เช่นเดียวกับ (ได้รับจากตัวดำเนินการบางตัวที่มากเกินไป)
สิ่งที่ดีที่สุดคือ "ไวยากรณ์" สร้าง AST โดยตรง
สิ่งที่ได้รับแรงผลักดันและเหมาะสมกับงานนี้คือNemerle
คุณสามารถดูวิธีแก้ปัญหาได้ในวิดีโอเหล่านี้จาก NDC:
ไม่ได้อยู่ใน C # แต่ตัวแยกวิเคราะห์ C # 2/3/4 แบบเต็มที่สร้าง AST แบบเต็มนั้นสามารถใช้ได้กับDMS Software Reengineering Toolkit ของเรา
DMS จัดเตรียมโครงสร้างพื้นฐานขนาดใหญ่สำหรับการแยกวิเคราะห์การสร้างต้นไม้การสร้างตารางสัญลักษณ์และการวิเคราะห์โฟลว์การแปลงซอร์สไปยังซอร์สและการสร้างซอร์สโค้ดใหม่จาก AST (แก้ไข) (นอกจากนี้ยังรองรับภาษาอื่น ๆ อีกมากมายนอกเหนือจากภาษา C #)
แก้ไข (กันยายน) 2013: คำตอบนี้ไม่ได้รับการอัปเดตเมื่อเร็ว ๆ นี้ DMS จัดการ C # 5.0 ได้นานแล้ว
GPPGอาจใช้งานได้หากคุณเต็มใจที่จะเขียนโปรแกรมแยกวิเคราะห์ของคุณเอง (ซึ่งเป็นเรื่องสนุก)