C# 正在寻找C代码解析器

C# 正在寻找C代码解析器,c#,dom,parsing,intellisense,C#,Dom,Parsing,Intellisense,我正在寻找一组类(最好是在.net framework中),这些类将解析C#代码,并返回一个包含参数的函数列表、类及其方法、属性等。理想情况下,它将提供构建我自己的intellisense所需的所有功能 考虑到.net框架提供的所有反射功能,我觉得这样的东西应该在.net框架中出现,但如果不是这样,那么开源替代方案就足够了 我试图构建的基本上类似于代码段编译器,但有一点扭曲。我想先弄清楚如何获得dom代码 我试着在谷歌上搜索这个,但我不确定这个词的正确名称,所以结果是空的 编辑:因为我希望将其用

我正在寻找一组类(最好是在.net framework中),这些类将解析C#代码,并返回一个包含参数的函数列表、类及其方法、属性等。理想情况下,它将提供构建我自己的intellisense所需的所有功能

考虑到.net框架提供的所有反射功能,我觉得这样的东西应该在.net框架中出现,但如果不是这样,那么开源替代方案就足够了

我试图构建的基本上类似于代码段编译器,但有一点扭曲。我想先弄清楚如何获得dom代码

我试着在谷歌上搜索这个,但我不确定这个词的正确名称,所以结果是空的


编辑:因为我希望将其用于类似intellisense的处理,所以实际上编译代码不会工作,因为它很可能是不完整的。很抱歉,我应该先提到这一点。

虽然.NET的CodeDom命名空间提供了,但它们没有实现。VisualStudio通过自己的语言服务实现这一点。这些在可再发行框架中不可用

你可以

  • 编译代码,然后对生成的程序集使用反射
  • 看看Mono C#编译器之类的东西,它创建了这些语法树。它不会像CodeDom那样是一个高级API,但也许您可以使用它
  • 可能有一个或一个类似的站点

    更新
    请参阅此相关帖子

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

    性能将相当一般,因为您将需要编译所有的源代码,每当有什么变化。我不知道有什么方法可以让您增量编译代码片段。

    您尝试过使用该类吗?这是一个支持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,但它可能还是值得的:

    如果您需要它来处理不完整的代码,或者其中有错误的代码,那么我相信您基本上只能靠自己(也就是说,您将无法使用
    CSharpCodeCompiler
    类或类似的东西)

    有像ReSharper这样的工具,它自己进行解析,但这是专有的。您可能可以从Mono编译器开始,但根据我的经验,编写一个处理不完整代码的解析器与编写一个只需在不完整代码上吐出错误的解析器是完全不同的


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

    Mono project GMCS编译器包含一个非常可重用的C#4.0解析器。而且,编写适合您特定需求的解析器相对容易。例如,您可以重用它:

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

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


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

    它必须处理不完整的代码还是有错误的代码(即不能用普通编译器编译的代码?),这是IntelliSense风格解析器的典型要求。是的,它应该处理不完整的代码。我正在寻找动态的东西。这不是由任何代码dom提供程序实现的,并抛出NotImplementedException。@Josh:看来你是对的。我刚试过,但确实失败了。真是太糟糕了。我开始考虑用手来解析它了。不过,不确定这对于泛型会有多困难。+1也用于更新-它包含可行的解决方案这些已经制作好的解析器的问题是,它们无法处理不完整(因此无效)的代码。它们的目的是创建足够详细的语法树来生成代码,而不是为intellisense.Yep提供数据。但是,由于它们是可重用的,因此可以很容易地对它们进行调整。ANTLR可用于部分解析。但当然,最通用的选项是PEG,因此如果您能够为.NET获得一个合适的PEG实现,并且可以移植现有的ANTLR解析器,那么您将得到一个快速而简单的通用解决方案。例如,来自的Packrat解析器能够使用任何通用语法为文本编辑器生成语法突出显示模式,并且可以很好地处理不完整或无效的输入。