获得循环复杂性

时间:2016-10-15 22:28:36

标签: rascal cyclomatic-complexity

我正在研究使用Rascal来计算java方法的圈复杂度。

一种方法是:

  • 从方法中获取AST
  • 在此树上使用访问模式
  • 检查以下关键字,这些关键字都会增加CC:casecatchdowhileif,{{1} },for

另一个是使用图论并使用公式e-n + 2。 使用流氓功能可以很容易地获得e和n。我的问题是如何构建控制流图,我找到了以下模块:  foreach这似乎是朝着正确方向迈出的一步,但我完全迷失在哪里。

2 个答案:

答案 0 :(得分:1)

最简单的方法是计算AST上的分叉节点。

explained SLOC and CC do not have a strong correlation to each otherpreprint)的出版物中,我们还分享了我们的无赖代码来计算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