寻找一个C#代码解析器

时间:2010-03-15 04:59:28

标签: c# dom parsing intellisense

我正在寻找一组类(最好在.net框架中),它将解析C#代码并返回带有参数,类及其方法,属性等的函数列表。理想情况下,它将提供所需的全部内容。建立我自己的intellisense。

我觉得这样的东西应该在.net框架中,考虑到它们提供的所有反射内容,但如果没有,那么开源替代方案就足够了。

我正在尝试构建的内容基本上类似于Snippet Compiler,但有一点扭曲。我想弄清楚如何首先获得代码dom。

我尝试使用谷歌搜索,但我不确定这个的正确用语是什么,所以我空了。

编辑:由于我希望将其用于类似intellisense的处理,实际编译代码将无法正常工作,因为它很可能是不完整的。对不起,我应该先提一下。

6 个答案:

答案 0 :(得分:5)

虽然.NET的CodeDom命名空间提供basic API for code language parsers,但它们未实现。 Visual Studio通过自己的语言服务完成此操作。这些在可再发行框架中不可用。

你可以......

  1. 编译代码,然后在生成的程序集上使用反射
  2. 查看Mono C#编译器,它会创建这些语法树。它不是像CodeDom这样的高级API,但也许你可以使用它。
  3. 可能有something on CodePlex或类似网站。

    <强>更新
    看到这篇相关的帖子。 Parser for C#

答案 1 :(得分:2)

如果你需要它来处理不完整的代码或代码中有错误的代码,那么我相信你几乎是你自己(也就是说,你将无法使用CSharpCodeCompiler类或类似的东西。)

像ReSharper这样的工具可以自己解析,但这是prorietary。你可能可以从Mono编译器开始,但根据我的经验,编写一个可用于不完整代码的解析器是一个完全不同的游戏,可以编写一个应该在不完整代码上吐出错误的游戏。

如果您只需要类和方法的名称(基本上是元数据),那么您可以“手动”进行解析,但我想这取决于您需要的结果准确度。

答案 2 :(得分:2)

Mono项目GMCS编译器包含一个非常可重用的C#4.0解析器。而且,编写自己的解析器相对容易,它将满足您的特定需求。例如,您可以重复使用:http://antlrcsharp.codeplex.com/

答案 3 :(得分:1)

查看Microsoft.CSharp命名空间中的CSharpCodeCompiler。您可以使用CSharpCodeCompiler进行编译,并使用CompilerResults.CompiledAssembly访问结果程序集。关闭该装配,您将能够获得类型和类型,您可以使用反射获得所有属性和方法信息。

性能将非常平均,因为只要有变化,您就需要编译所有源代码。我不知道有任何方法可以让你逐步编译代码片段。

答案 4 :(得分:1)

您是否尝试过使用Microsoft.CSharp.CSharpCodeProvider课程?这是一个支持CodeDom的完整C#代码提供程序。您只需要在文本流上调用.Parse(),然后返回CodeCompileUnit。

<击>
var codeStream = new StringReader(code);
var codeProvider = new CSharpCodeProvider();

var compileUnit = codeProvider.Parse(codeStream);

// compileUnit contains your code dom

<击>

好吧,看到上面的内容不起作用(我刚测试过),下面的文章可能会引起人们的兴趣。很久以前我给它添加了书签,所以我相信它只支持C#2.0,但它可能还是值得的:

Generate Code-DOMs directly from C# or VB.NET

答案 5 :(得分:1)

对于Blindy来说可能有点晚了,但我最近发布了一个C#解析器,它非常适合这类事情,因为它设计用于处理代码片段并保留注释: C# Parser and CodeDOM

它处理C#4.0以及新的“异步”功能。它是商业化的,但只是其他商业编译器成本的一小部分。

我真的认为很少有人意识到解析C#会变得多么困难,特别是如果你需要正确解析符号引用(这通常是必需的,除非你只是在做格式化)。只需尝试即可阅读并完全理解500多页语言规范的类型推断部分。然后,冥想规范实际上并不完全正确(正如Eric Lippert本人所提到的那样)。