Iam扩展了软件工具以计算软件项目的指标。 然后将这些度量用于进行静态代码分析。 我的任务是为c和c ++项目实现指标的计算。
在开发过程中,我遇到了一些问题,这些问题导致重置并使用其他工具或编程语言重新开始。 我将按时间顺序并尽可能地陈述我尝试解决的过程,问题和事情。
一些指标:
由于c ++是一种难以解析的语言,并且我自己编写c ++解析器的规模过大,因此我倾向于使用现有的c ++解析器。 因此,我开始使用 LLVM项目中的库来收集有关源文件的语法和语义信息。
LLVM工具链接:https://clang.llvm.org/docs/Tooling.html
首先我从用c ++编写的LibTooling开始,因为它向我保证了对抽象语法树(AST)的“完全控制”。 我尝试了RecursiveASTVistor和Matchfinder方法,但没有成功。
因此LibTooling被解雇了,因为我无法检索有关AST中节点周围的上下文信息。 当访问AST中的特定节点时,我只能对回调做出反应。但是我不知道我现在是什么情况。 例如。当我访问C ++ RecordDeclaration(类,结构,联合)时,我不知道它是否是嵌套记录。 但是,这些信息对于计算单个类的代码行是必需的。
第二方法是通过Python绑定使用LibClang接口。 使用LibClang接口,我能够递归地遍历AST节点并将所需的上下文信息存储在堆栈中。 在这里,我遇到了LibClang的一个普遍问题:
在为文件创建AST之前,将启动预处理器并解析所有预处理器指令。就像他应该做的一样。
使用Antlr生成的c ++解析器提供了c++14 grammar,这导致了第三以及当前尝试。
在解析器之前不执行任何预处理器。 这样很好,因为会解析完整的源代码,并且会忽略预处理程序指令。 不好的是,解析器似乎并不那么难。它在可编译的代码上失败,导致AST损坏。因此,这种解决方案还不够。
我的问题是:
如果您认为这不是问此类问题的合适地点,请随时将我重定向到另一个地方。
答案 0 :(得分:0)
要回答您的最后一个问题,
由于iam用尽了所有选项。还有哪些其他方法可能值得 在考虑何时分析/解析c / c ++源代码?
另一种方法是将源代码解析为仅是文本。这避免了预处理源以及引入复杂的解析器的需要。请参阅本文的示例/简介:“类的概念凝聚力”,作者:Andrian Marcus,Denys Poshyvanyk。您仍然可以通过这种方法收集LOC和方法数量之类的信息,而无需完整的解析器。
这种方法有缺点(与其他任何方法一样):