C#parsing器

哪些parsing器可用于parsingC#代码?

我正在寻找一个可以在C#中使用的C#parsing器,并且让我可以访问关于分析代码的每个artefact的行和文件信息。

适用于源代码:

  • CSParser :从C#1.0到2.0,开源
  • Metaspec C#parsing器 :从C#1.0到3.0,商业产品(约5000 $)
  • #认识! :从C#1.0到3.0,商业产品(约900€)(由SharpRecognize回答)
  • SharpDevelop Parser (由Akselsson回答)
  • NRefactory :从SharpDevelop中使用的C#1.0到4.0(+asynchronous),开放源码parsing器。 包括语义分析。
  • C#parsing器和CodeDOM :一个完整​​的C#4.0parsing器,已经支持C#5.0的asynchronousfunction。 商业产品(49 $到299 $)( Ken Beckett的答案)
  • Microsoft Roslyn CTP :编译器即服务。

在assembly上工作:

  • 的System.Reflection
  • Microsoft Common Compiler基础结构 :从C#1.0到3.0,Microsoft公用许可证。 由Fxcop和Spec#使用
  • Mono.Cecil :从C#1.0到3.0,开源

程序集“parsing”的问题是,我们有关于行和文件的信息较less(信息是基于.pdb文件的,Pdb只包含方法的行信息)

personnaly推荐Mono.CecilNRefactory

单声道 (开源)包括C#编译器(当然还有parsing器)

如果您要将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平台项目中实现了您所要求的内容(ASTparsingC#代码)。

为了使它更易于使用,我写了一个快速的API,公开了一些关键的源代码元素(使用语句,types,方法,属性,字段,注释),并能够将原始C#代码重写为C#和VBNET 。

你可以在这个O2 XRule脚本文件中看到这个API: ascx_View_SourceCode_AST.cs.o2 。

例如,这是如何处理C#源代码文本,并填充一些TreeViews和文本框:

  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收集的信息在源代码上selecttypes,方法,注释等。

这里的参考是编写的API代码(注意,这是我使用SharpDevelop的C#ASTparsing器的第一步,而且我仍然对它的工作原理感到满意):

  • AstDetails.cs
  • AstTreeView.cs
  • AstValue.cs
  • Ast_CSharp.cs

我们最近发布了一个C#parsing器,它可以处理所有的C#4.0特性以及新的asynchronous特性: C#Parser和CodeDOM

该库生成一个保留注释和格式信息的语义对象模型,可以修改和保存。 它还支持使用LINQ查询来分析源代码。

SharpDevelop是一个开放源代码的IDE,它带有一个基于访问者的代码分析器,它工作得非常好。 它可以独立于IDE使用。

考虑在构build的二进制文件上使用reflection,而不是直接parsingC#代码。 reflectionAPI真的很容易使用,也许你可以得到所有你需要的信息?

看看金parsing器 。 它有一个非常直观的IU,可以让你交互地testing你的语法并生成C#代码。 有很多可用的例子,它是完全免费的。

也许你可以尝试在irony.codeplex.com上使用Irony。

这是非常快的,交stream#语法已经存在。

语法本身直接写在一个BNF类似的方式(用一些运营商重载c#编写)

最好的事情是“语法”直接产生AST。

因为MS刚刚打开(或即将打开)带有Apache 2许可证的代码,所以你一定要检查一下Roslyn。 您也可以使用GitHub中的代码检查一下parsing这些信息的方法。

Nemerle是一个正在获得动力并且非常适合这项工作的人

你可以看到它是如何在NDC的这些video中解决的:

  • Igor Tkachev – 与Nemerle进行元编程
  • Igor Tkachev – Nemerle编程语言

不是用C#,但是我们的DMS Software Reengineering Toolkit提供了一个完整的C#2/3/4parsing器来构build完整的AST。

DMS为parsing,构build树,构build符号表和stream分析,源到源转换,以及(修改后的)AST中源代码的再生提供了巨大的基础设施。 (它也处理许多其他语言,而不仅仅是C#)。

编辑(九月)2013:这个答案最近没有更新。 DMS长期处理C#5.0

如果你愿意编写你自己的parsing器(这很有趣), GPPG可能是有用的。