Eclipse CDT:获取C++项目的AST

4

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

有没有方法可以获取整个C++项目的AST,还是我需要从主文件的AST开始,通过包含指令导航并为每个源单元生成单独的AST?

谢谢。

1个回答

6
CDT的AST不适用于整个项目的扩展。一旦进入10000+ LOC范围,性能可能会开始表现得非常糟糕。
为了进行跨文件分析,CDT有一个索引器,它逐个解析项目中的每个文件,并构建关于整个项目中代码的信息数据库(称为索引)。可以通过接口IIndex访问索引,可以通过在任何AST上调用IASTTranslationUnit.getIndex()来获取其实例。
大多数代码分析和操作用例都属于以下工作流之一:
- 仅使用索引。IIndex提供了很多可用的内容,例如: - 各种重载的findBindings(),以查找与名称或名称前缀匹配的绑定 - findReferences(binding),以提供所有对绑定的引用 - findDeclarations(binding),以提供绑定的所有声明
等等。这就是编辑器导航功能如打开声明和调用层次结构的工作方式。
- 使用索引识别需要AST的少量源文件,然后解析这些文件。这是重构的工作方式。例如,重命名重构使用索引来定位正在重命名的绑定的用法,然后创建包含这些用法的文件的AST来执行重构。
- 如果以上两种方法都不够好,并且您确实需要整个项目每个文件的AST级别信息,请逐个为项目中的每个文件创建AST,并从每个文件中提取所需的信息。这就是索引器本身的工作方式。(请注意,如果选择此选项,则无需导航包含以列出需要解析的所有文件。相反,您可以枚举项目中的所有文件。有关示例,请参见PDOMRebuildTask.createDelegate())。
如果您能更详细地说明您的用例,我可能能够提供更具体的建议。

我认为你是在说CDT自然地解析了单个源文件但没有包含文件。那么如果必要的声明信息在一个包含文件中,CDT如何解析“最令人烦恼的解析”(或任何其他语法上有歧义的结构)?请参见https://dev59.com/omQm5IYBdhLWcg3wug4u#17393852 - Ira Baxter
@IraBaxter:索引器按照依赖顺序解析文件,并从索引中查找先前解析的文件的信息。 - HighCommander4
在某些关于预处理器条件变量状态恒定的假设下?(可以想象一个CU定义了# define FLAG TRUE,另一个CU定义了# define FLAG FALSE,然后它们都包含一个检查该标志的头文件) - Ira Baxter
@IraBaxter: 某些宏被识别为“重要”,在适当的情况下,头文件将为每个重要宏组合索引一次。请参见https://bugs.eclipse.org/bugs/show_bug.cgi?id=197989了解详细信息。该系统并不完美-如果你足够努力,仍然可能会混淆它-但它足以处理实际中的Boost库等问题。 - HighCommander4
@searchengine27 我不会假装这些东西特别好文档化,但至少公共API有Javadocs托管在这里(例如IIndex)。 - HighCommander4
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接