gpt4 book ai didi

c++ - eclipse CDT : Get AST of a C++ project

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:43 25 4
gpt4 key购买 nike

ITranslationUnit 和 IASTTranslationUnit 接口(interface)分别表示单个 C/C++ 源文件的翻译单元和 AST。

有什么方法可以获取整个 C++ 项目的 AST,或者我是否需要从主文件的 AST 开始并浏览包含指令并为每个源单元生成一个单独的 AST?

谢谢。

最佳答案

CDT 的 AST 并不是为了扩展到整个项目而设计的。一旦开始进入 10000+ LOC 范围,它的性能可能会开始变得非常糟糕。

为了跨文件分析的目的,CDT 有一个索引器,它解析项目中的每个文件(一次一个),并建立一个项目中代码信息的数据库作为整体(称为索引)。索引通过接口(interface) IIndex 访问,其实例可以通过调用任何 AST 上的 IASTTranslationUnit.getIndex() 获得(例如)。

大多数代码分析和操作用例属于以下工作流程之一:

  • 只需使用索引。 IIndex 为您提供了很多工作,例如:

    • findBindings() 的各种重载以查找与名称或名称前缀匹配的绑定(bind)
    • findReferences(binding) 为您提供对绑定(bind)的所有引用
    • findDeclarations(binding) 为您提供绑定(bind)的所有声明


    和许多其他人。这就是 Open Declaration 和 Call Hierarchy 等编辑器导航功能的工作原理。

  • 使用索引来识别您需要 AST 的一小组源文件,然后解析这些文件。这就是重构的工作原理。例如,重命名重构使用索引来定位被重命名绑定(bind)的用途,然后为包含这些用途的文件创建 AST 以执行重构。

  • 如果以上都不够好,并且您确实需要项目中每个文件的 AST 级信息,请为项目中的每个文件创建一个 AST,一次一个,然后提取您需要的信息从每一个。这就是索引器本身的工作方式。 (请注意,如果您选择此选项,则无需导航包含以列出您需要解析的所有文件。相反,您可以枚举项目中的所有文件。请参阅 PDOMRebuildTask.createDelegate() 举个例子。)

如果您详细说明您的用例是什么,我或许可以提供更具体的建议。

关于c++ - eclipse CDT : Get AST of a C++ project,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com