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.Cecil和NRefactory 。
单声道 (开源)包括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可能是有用的。