我正在研究使用Rascal来计算java方法的圈复杂度。
一种方法是:
case
,catch
,do
,while
,if
,{{1} },for
另一个是使用图论并使用公式e-n + 2。
使用流氓功能可以很容易地获得e和n。我的问题是如何构建控制流图,我找到了以下模块:
foreach
这似乎是朝着正确方向迈出的一步,但我完全迷失在哪里。
答案 0 :(得分:1)
最简单的方法是计算AST上的分叉节点。
在explained SLOC and CC do not have a strong correlation to each other(preprint)的出版物中,我们还分享了我们的无赖代码来计算CC(参见图2)。
以下是从文章中提取的代码,首先创建文件AST with m3,然后搜索文件中的所有方法/代码块。您可以使用Per方法调用此rascal函数来访问AST并计算某些节点。
int calcCC(Statement impl) {
int result = 1;
visit (impl) {
case \if(_,_) : result += 1;
case \if(_,_,_) : result += 1;
case \case(_) : result += 1;
case \do(_,_) : result += 1;
case \while(_,_) : result += 1;
case \for(_,_,_) : result += 1;
case \for(_,_,_,_) : result += 1;
case foreach(_,_,_) : result += 1;
case \catch(_,_): result += 1;
case \conditional(_,_,_): result += 1;
case infix(_,"&&",_) : result += 1;
case infix(_,"||",_) : result += 1;
}
return result;
}
答案 1 :(得分:0)
对于Rascal中的构造控制流程图,有一篇论文解释了如何在纯Rascal中完成它以及如何使用名为DCFlow的声明性语言来提高抽象级别:http://link.springer.com/chapter/10.1007%2F978-3-319-11245-9_18