“CSharpCodeProvider.Parse”的替代方案

时间:2010-09-02 23:00:34

标签: c# codedom

我正在为CSharpCodeProvider.Parse寻找替代方案。该方法应该解析[C#]代码源并返回CompileUnit对象。但是,该方法未在任何.Net框架中实现。

我的目的是能够导航C#CodeDOM而无需编译它。我正在编写一个执行某些代码分析的应用程序,但我不一定会拥有所有外部引用,这意味着我无法编译它。

4 个答案:

答案 0 :(得分:2)

SharpDevelop(通常用于Mono的开源IDE)有一个名为NRefactory的库,它允许您解析C#代码并将其转换为AST:http://wiki.sharpdevelop.net/NRefactory.ashx(摘自该链接):

using (IParser parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, new StringReader(sourceCode))) 
{
    parser.Parse();
    // this allows retrieving comments, preprocessor directives, etc. (stuff that isn't part of the syntax)
    specials = parser.Lexer.SpecialTracker.RetrieveSpecials();
    // this retrieves the root node of the result AST
    result = parser.CompilationUnit;
    if (parser.Errors.Count > 0) {
        MessageBox.Show(parser.Errors.ErrorOutput, "Parse errors");
    }
}

答案 1 :(得分:0)

有许多free C# parsers,最受欢迎的显然是:

答案 2 :(得分:0)

实际(2017-2018)信息:

  1. https://github.com/icsharpcode/SharpDevelop/wiki/NRefactory

  2. 提供更多信息
  3. 下载nuget包:“ICSharpCode.NRefactory”

  4. 以下是代码段:

    using ICSharpCode.NRefactory.CSharp;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace Ns1
    {
        public class Foo
        {
            public void Go()
            {       
                CSharpParser parser = new CSharpParser();
                string text = File.ReadAllText("myProgram.cs");
                SyntaxTree syntaxTree = parser.Parse(text);
            }
        }
    }
    

答案 3 :(得分:-1)

我们的DMS Software Reengineering Toolkit是一种用于构建任意语言分析工具的工具。 DMS提供通用解析,AST导航和修改,从修改树中重新生成源,符号表支持和各种分析支持,以及编写源到源转换的能力,这些转换直接根据表面修改AST语法。

它的C# Front End提供了一个完整的C#4.0解析器(包括LINQ),它构建了一个完整的抽象语法树,其中包含源文本的每个项目,包括在注释装饰的源树节点上作为注释捕获的注释。 p>