# McCabe's cyclomatic complexity

rascal-0.34.0

McCabe Complexity (also Cyclomatic Complexity) is a measure for source code complexity, see http://en.wikipedia.org/wiki/Cyclomatic_complexity or McCabe's original article:

T.J. McCabe, A Complexity Measure, IEEE Transactions on Software Engineering, Vol. 2, No. 4, p. 308 (1976)

It is defined as a metric on the control flow graph: `number_of_edges - number_of_nodes + 2`

If you have computed a control flow graph and represented it as a binary reflexive relation in Rascal, then this simple function computes its CC:

``import analysis::graphs::Graph;import Set;import Relation;int cyclomaticComplexity(Graph[&T] CFG){    return size(CFG) - size(carrier(CFG)) + 2;}``

Let's take that for a spin:

``Graph[int] G1 = {<1,2>, <2,3>};Graph[int] G3 = {<1,2>, <1,3>, <2,6>, <3,4>, <3,5>, <4,7>, <5,8>, <6,7>, <7,8>};Graph[int] G5 = {<1,2>, <2,3>, <2,4>, <3,6>, <4,2>, <4,5>, <5, 10>, <6, 7>,                  <7, 8>, <7,9>, <8,9>, <9, 7>, <9,10>};test bool tstCyclomaticComplexity1() = cyclomaticComplexity(G1) == 1;test bool tstCyclomaticComplexity2() = cyclomaticComplexity(G3) == 3;test bool tstCyclomaticComplexity3() = cyclomaticComplexity(G5) == 5;``
``rascal>:testbool: true``

Of course there are other ways of computing the Cyclomatic Complexity for code units, namely based on the abstract syntax tree. That is for another time.