获得圈复杂度
Obtaining Cyclomatic Complexity
我正在研究使用 Rascal 计算 java 方法的圈复杂度。
一种方法是:
- 从方法中获取 AST
- 在此树上使用访问模式
- 检查以下关键字都将 CC 加一:
case
、catch
、do
、while
、if
、for
, foreach
另一个是使用图论并使用公式 e-n+2。
使用 rascal 功能可以很容易地获得 e 和 n。我的问题是如何构建控制流图,我发现了以下模块:
analysis::flow::ControlFlow
这似乎是朝着正确方向迈出的一步,但我完全不知道从那里去哪里。
最简单的方法确实是计算 AST 上的分叉节点。
在我们发布的 explained SLOC and CC do not have a strong correlation to each other (preprint) 中,我们还分享了计算 CC 的流氓代码(见图 2)。
这里是从文章中摘录的代码,首先创建文件的AST with m3,然后在文件中搜索所有methods/code块。根据你调用这个访问 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;
}
对于在 Rascal 中构建控制流图,有一篇论文解释了如何在纯 Rascal 中进行构建以及如何使用称为 DCFlow 的声明性语言提高抽象级别:http://link.springer.com/chapter/10.1007%2F978-3-319-11245-9_18
我正在研究使用 Rascal 计算 java 方法的圈复杂度。
一种方法是:
- 从方法中获取 AST
- 在此树上使用访问模式
- 检查以下关键字都将 CC 加一:
case
、catch
、do
、while
、if
、for
,foreach
另一个是使用图论并使用公式 e-n+2。
使用 rascal 功能可以很容易地获得 e 和 n。我的问题是如何构建控制流图,我发现了以下模块:
analysis::flow::ControlFlow
这似乎是朝着正确方向迈出的一步,但我完全不知道从那里去哪里。
最简单的方法确实是计算 AST 上的分叉节点。
在我们发布的 explained SLOC and CC do not have a strong correlation to each other (preprint) 中,我们还分享了计算 CC 的流氓代码(见图 2)。
这里是从文章中摘录的代码,首先创建文件的AST with m3,然后在文件中搜索所有methods/code块。根据你调用这个访问 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;
}
对于在 Rascal 中构建控制流图,有一篇论文解释了如何在纯 Rascal 中进行构建以及如何使用称为 DCFlow 的声明性语言提高抽象级别:http://link.springer.com/chapter/10.1007%2F978-3-319-11245-9_18