哪些解析器可用于解析 C# 代码?
我正在寻找一个可以在 C# 中使用的 C# 解析器,并让我可以访问有关所分析代码的每个工件的行和文件信息。
适用于源代码:
组装工作:
程序集“解析”的问题在于我们对行和文件的信息较少(这些信息基于 .pdb 文件,而 Pdb 仅包含方法的行信息)
我个人推荐Mono.Cecil和NRefactory。
Mono(开源)包括 C# 编译器(当然还有解析器)
如果要将 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
如果您熟悉 ANTLR,则可以使用Antlr C# 语法。
我已经使用 SharpDevelop AST API在OWASP O2 平台项目中实现了您所要求的(C# 代码的 AST 解析) 。
为了更容易使用,我编写了一个快速 API,它公开了许多关键源代码元素(使用语句、类型、方法、属性、字段、注释),并且能够将原始 C# 代码重写为 C# 和 VBNET .
您可以在此 O2 XRule 脚本文件中查看此 API:ascx_View_SourceCode_AST.cs.o2。
例如,这是您处理 C# 源代码文本并填充许多 TreeView 和 TextBox 的方式:
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# Parser 和 CodeDOM
该库生成一个语义对象模型,该模型保留注释和格式信息,并且可以修改和保存。它还支持使用 LINQ 查询来分析源代码。
您绝对应该查看 Roslyn,因为 MS 刚刚在此处打开(或即将打开)带有 Apache 2 许可证的代码。您还可以从GitHub查看使用此代码解析此信息的方法。
SharpDevelop是一个开源 IDE,带有一个基于访问者的代码解析器,它运行得非常好。它可以独立于 IDE 使用。
考虑在构建的二进制文件上使用反射,而不是直接解析 C# 代码。反射 API 真的很容易使用,也许您可以获得您需要的所有信息?
看看黄金解析器。它有一个非常直观的 IU,可以让您交互式地测试您的语法并生成 C# 代码。它有很多可用的示例,而且它是完全免费的。
也许您可以在 irony.codeplex.com 上尝试 Irony。
它非常快,而且 ac# 语法已经存在。
语法本身是直接用 C# 以类似 BNF 的方式编写的(通过一些运算符重载实现)
最好的一点是“语法”直接生成 AST。
不是在 C# 中,而是在我们的DMS 软件再工程工具包中提供了一个完整的 C# 2/3/4 解析器,它构建了完整的 AST 。
DMS 为解析、树构建、符号表构建和流分析、源到源转换以及从(修改的)AST 重新生成源代码提供了庞大的基础设施。(它还处理许多其他语言,而不仅仅是 C#。)
编辑(九月)2013:这个答案最近没有更新。DMS 长期处理 C# 5.0
正在获得动力并且非常适合这项工作的东西是Nemerle
您可以在 NDC 的这些视频中看到它是如何解决它的:
如果您愿意编写自己的解析器(这很有趣),GPPG可能会有用。