C#解析器


101

哪些解析器可用于解析C#代码?

我正在寻找可在C#中使用的C#解析器,并允许我访问有关所分析代码的每个伪像的行和文件信息。

Answers:


118

适用于源代码:

适用于组装:

程序集“解析”的问题在于,有关行和文件的信息较少(该信息基于.pdb文件,而Pdb仅包含方法的行信息)

我个人推荐Mono.CecilNRefactory


1
CS-Script(csscript.net)-C#脚本引擎可以适合此列表。“介绍Microsoft“ Roslyn” CTP”的示例非常像CS脚本可以做到的。
2011年

1
在提到成本时,请注意Roslyn至少需要Pro版本的Visual Studio。
kristianp 2012年

7

Mono(开源)包括C#编译器(当然还有解析器)


与其他解析器相比,使用Mono有什么优势?我可以使用访问者获取C#程序的AST信息吗?如果是这样,您能引导我进入显示该页面的页面吗?

6

如果要将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


1
特别看一下CodeDomProvider.Parse()方法。
唐·柯比

3
不,不要看在公共构建中抛出NotImplemented异常的CodeDomProvider.Parse()方法!(Visual Studio使用专有的内部解析器)。
罗宾·戴维斯


4

我已经使用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解析器,而我仍然要了解它的工作原理):


是的,至少根据我所见,这似乎是最简单的解决方案。我一直在寻找一个不错的解析器,却偶然发现了这个博客svengrand.blogspot.com/2010/10/…,其中还详细介绍了如何使用SharpDevelop的C#解析器。
亚历克斯

3

我们最近发布了一个C#解析器,该解析器可以处理所有C#4.0功能以及新的异步功能: C#解析器和CodeDOM

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




2

考虑在构建的二进制文件上使用反射,而不是直接解析C#代码。反射API确实易于使用,也许您可​​以获得所需的所有信息?


3
反射是进行静态分析的一种不好方法。它仅提供反射逻辑可以提取的信息(例如,“类中的方法的名称”。它不提供详细信息(“此分配的右边是什么?”)),因此严重限制了这种静态分析是可以做到的
伊拉克·巴克斯特

@Ira Baxter有一些限制,但是请记住,您也可以通过反射来获取IL代码。这意味着您可以理解调用了什么方法,将什么分配给了变量等。在许多情况下,我想不到这还不够。只要看看所有Reflector插件能做什么。
Hallgrim

您如何通过反射获得实际的IL代码?据我所知,Reflection不提供此功能,您需要使用CCI参见:stackoverflow.com/questions/2824086/…–
Ash Ash

2

看看Gold Parser。它具有非常直观的IU,可让您交互式地测试语法并生成C#代码。有很多可用的示例,它是完全免费的。


2
OP要求提供可以解析C#的内容,而不是C#中可以解析其他内容的内容。
伊拉·巴克斯特

2

也许您可以在irony.codeplex.com上尝试Irony。

它非常快,并且已经存在ac#语法。

语法本身是以BNF之类的方式直接用c#编写的(某些运算符重载实现)

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


Irony.Samples / CSharp / CSharpGrammar.cs中的评论说:“注意:此语法只是一个演示,而它是一个破碎的演示”。因此,至少它不是一个完整的实现。
vladich 2014年

2

你一定要与Apache 2许可证退房罗斯林由于MS刚打开(或即将开业)的代码在这里。您还可以从GitHub签出使用此代码解析此信息的方法。


1

Nemerle正在获得动力,并且非常适合这份工作

您可以在NDC的以下视频中看到如何解决该问题:


Nemerle是一种编程语言。我同意,这是一种不错的编程语言,但是问题是如何在C#中解析C#代码!
Qwertie 2014年

您可以在nemerle中创建规则,并在C#中使用它,没有什么可以说解析器必须在C#中使用,但是无论如何,都请投票否决。
2014年

1

DMS Software Reengineering Toolkit中提供了不在C#中但可以构建完整AST的完整C#2/3/4解析器。

DMS为解析,树构建,符号表和流分析的构建,源到源的转换以及从(经修改的)AST的源代码再生提供了广阔的基础架构。(除了C#,它还处理许多其他语言。)

编辑(2013年9月):该答案最近未更新。DMS已处理C#5.0


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.