繁体   English   中英

C#解析器

[英]Parser for C#

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

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

适用于源代码:

适用于组装:

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

我个人推荐Mono.CecilNRefactory

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

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

如果您熟悉ANTLR,则可以使用Antlr C#语法

我已经使用SharpDevelop AST API在OWASP O2平台项目上实现了您的要求(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查询来分析源代码。

由于MS刚刚在此处打开了(或即将打开)带有Apache 2许可证的代码,因此您绝对应该签出Roslyn。 您还可以从GitHub中查看使用此代码解析此信息的方法。

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

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

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

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

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

SharpDevelop是一个开放源代码的IDE,它带有一个基于访问者的代码解析器,该解析器非常有效。 可以独立于IDE使用。

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

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

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

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

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

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

如果您愿意编写自己的解析器(很有趣),则可能会使用GPPG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM