哪些解析器可用于解析C#代码?
我正在寻找可在C#中使用的C#解析器,并允许我访问有关所分析代码的每个伪像的行和文件信息。
哪些解析器可用于解析C#代码?
我正在寻找可在C#中使用的C#解析器,并允许我访问有关所分析代码的每个伪像的行和文件信息。
Answers:
适用于源代码:
适用于组装:
程序集“解析”的问题在于,有关行和文件的信息较少(该信息基于.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/zh-CN/library/microsoft.csharp.csharpcodeprovider.aspx
CodeDomProvider.Parse()
方法。
如果您熟悉ANTLR,则可以使用Antlr C#语法。
我已经使用SharpDevelop AST API 在OWASP O2 Platform项目中实现了您的要求(C#代码的AST解析)。
为了更容易使用,我编写了一个快速API,该API公开了许多关键源代码元素(使用语句,类型,方法,属性,字段,注释),并且能够将原始C#代码重写为C#和VBNET。 。
您可以在此O2 XRule脚本文件ascx_View_SourceCode_AST.cs.o2上看到该API的运行。
例如,这是您处理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代码(请注意,这是我第一次使用SharpDevelop的C#AST解析器,而我仍然要了解它的工作原理):
我们最近发布了一个C#解析器,该解析器可以处理所有C#4.0功能以及新的异步功能: C#解析器和CodeDOM
该库生成一个语义对象模型,该模型保留注释和格式信息,并且可以进行修改和保存。它还支持使用LINQ查询来分析源代码。
SharpDevelop是一个开放源代码的IDE,它带有一个基于访问者的代码解析器,效果很好。可以独立于IDE使用。
考虑在构建的二进制文件上使用反射,而不是直接解析C#代码。反射API确实易于使用,也许您可以获得所需的所有信息?
看看Gold Parser。它具有非常直观的IU,可让您交互式地测试语法并生成C#代码。有很多可用的示例,它是完全免费的。
也许您可以在irony.codeplex.com上尝试Irony。
它非常快,并且已经存在ac#语法。
语法本身是以BNF之类的方式直接用c#编写的(某些运算符重载实现)
最好的是,“语法”直接产生AST。
DMS Software Reengineering Toolkit中提供了不在C#中但可以构建完整AST的完整C#2/3/4解析器。
DMS为解析,树构建,符号表和流分析的构建,源到源的转换以及从(经修改的)AST的源代码再生提供了广阔的基础架构。(除了C#,它还处理许多其他语言。)
编辑(2013年9月):该答案最近未更新。DMS已处理C#5.0