gpt4 book ai didi

rascal - 获得圈复杂度

转载 作者:行者123 更新时间:2023-12-03 19:53:46 24 4
gpt4 key购买 nike

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

一种方法是:

  • 从方法
  • 获取 AST
  • 在这棵树上使用访问模式
  • 检查以下所有将 CC 加一的关键字:case , catch , do , while , if , for , foreach

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

    最佳答案

    最简单的方法确实是计算 AST 上的 fork 节点。
    在我们的出版物中,explained SLOC and CC do not have a strong correlation to each other (preprint),我们还分享了计算 CC 的无赖代码(参见图 2)。
    这里是摘自文章的代码,先创建文件的AST with m3 , 并搜索文件中的所有方法/代码块。每个方法你调用这个访问 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 - 获得圈复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064886/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com