代码之家  ›  专栏  ›  技术社区  ›  Blindy

正在查找C代码分析器[已关闭]

  •  9
  • Blindy  · 技术社区  · 14 年前

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

    我觉得应该在.NET框架中,考虑到它们提供的所有反射功能,但是如果不是这样的话,一个开源的替代方案就足够了。

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

    我试着用谷歌搜索这个词,但我不确定这个词的正确术语是什么,所以我空了出来。

    编辑:因为我希望将它用于类似IntelliSense的处理,实际上编译代码是行不通的,因为它很可能是不完整的。对不起,我应该先提一下。

    6 回复  |  直到 13 年前
        1
  •  5
  •   Community c0D3l0g1c    7 年前

    .NET的codedom命名空间提供 basic API for code language parsers ,它们没有实现。Visual Studio通过自己的语言服务来实现这一点。这些在可再发行框架中不可用。

    你也可以…

    1. 编译代码,然后对生成的程序集使用反射
    2. 看看类似Mono C编译器的东西,它创建了这些语法树。它不会是像codedom这样的高级API,但也许您可以使用它。

    可能有 something on CodePlex 或者类似的地点。

    更新
    请参阅相关文章。 Parser for C#

        2
  •  2
  •   Dean Harding    14 年前

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

    有像resharper这样的工具可以进行自己的解析,但这很重要。你也许可以从Mono编译器开始,但根据我的经验,编写一个适用于不完整代码的解析器和编写一个只会在不完整代码上吐出错误的解析器是完全不同的。

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

        3
  •  2
  •   SK-logic    14 年前

    Mono项目GMCS编译器包含一个非常可重用的C_4.0解析器。而且,编写适合您特定需求的解析器相对容易。例如,您可以重新使用: http://antlrcsharp.codeplex.com/

        4
  •  1
  •   Igor Zevaka    14 年前

    看看 CSharpCodeCompiler 在里面 Microsoft.CSharp 命名空间。您可以使用 CSharpcode编译器 并使用访问结果程序集 CompilerResults.CompiledAssembly 。从该程序集中,您将能够获取类型,而从类型中,您可以使用反射获取所有属性和方法信息。

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

        5
  •  1
  •   jrista    14 年前

    你试过使用 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

        6
  •  1
  •   Ken Beckett    13 年前

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

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

    我真的认为很少有人知道解析C有多困难,尤其是当您需要正确地解析符号引用时(这通常是必需的,除非您只是在格式化)。只是 尝试 阅读并完全理解500多页语言规范的类型推断部分。然后,思考一下这样一个事实:规范实际上并不完全正确(正如EricLippert自己所提到的)。