Modifying the Control Flow Graph

The Control Flow graph can be customized using the Perl API.  Start by downloading the Perl Flowchart from the Custom Graphs page – save it to the scitools\conf\plugin\users\Graph directory so it doesn’t get overridden by the next upgrade. Then open it in your code editor.

That logical control flow structure is obtained by calling $entity->freetext(“CGraph”). That command returns a series of numbers representing the different nodes of the graph. Each node is delimited by a semicolon and the series of numbers inside of those semicolons describe the node. These numbers can be seen in the regular graph by right clicking on an empty area and enabling debug. Note that some of the nodes are hidden by default so disable the filter option to see them.

The numbers can be interpreted as follows: The first number is the node ID. The second line contains the serialized representation of the node: The Node Kind(see the array @names for a list of all of the kinds, or see the table below), Start Line, Start Column, End Line, End Column. The sixth number, if non-empty, is the End Structure Node. All remaining numbers are the successors (or children) of the node.

 

Normal Graph

Normal graph

Same nodes with debug options and unfiltered

Same graph with debug options and unfiltered

 

 

Node Kinds

0 do-while
1 end-do-while
2 case
3 case-when
4 end-case
5 if
6 elsif
7 else
8 end-if
9 loop
10 while-for
11 while
12 for
13 exit
14 exit-when
15 end-loop
16 select
17 select-or
18 select-else
19 select-then-abort
20 end-select
21 switch
22 switch-case
23 switch-default
24 end-switch
25 question-begin
26 question-colon
27 end-question
28 goto
29 raise
30 return
31 terminate
32 break
33 continue
34 throw
35 passive
36 passive-implicit
37 java-block-begin
38 end-java-block
39 ada-block-begin
40 ada-accept-block-begin
41 exception-when
42 end-ada-block
43 try
44 try-catch
45 end-try
46 fortran-arith-if
47 fortran-select-case
48 fortran-case
49 fortran-case-default
50 fortran-end-select
51 fortran-where
52 fortran-else-where
53 fortran-end-where
54 fortran-do
55 fortran-do-infinite
56 fortran-do-while
57 fortran-end-do
58 fortran-until
59 fortran-loop-expr
60 fortran-assigned-goto
61 fortran-computed-goto
62 fortran-cycle
63 fortran-stop
64 fortran-exit-do
65 fortran-exit-for
66 fortran-exit-if
67 fortran-exit-loop
68 fortran-exit-while
69 fortran-exit-do-if
70 fortran-exit-for-if
71 fortran-exit-if-if
72 fortran-exit-loop-if
73 fortran-exit-while-if
74 end-routine
75 repeat-until
76 end-repeat-until
77 try-finally
78 deferred-break
79 deferred-continue
80 deferred-goto
81 deferred-return
82 deferred-throw
83 with-do
84 end-with-do
85 fortran-else-where-cond
86 while-for-else
87 try-else
88 fortran-io-control
89 next
90 next-when
91 case-fallthru
92 jovial3-goto
93 basic-do
94 basic-do-until
95 basic-do-while
96 basic-end-do-loop
97 basic-end-do-loop-until
98 basic-end-do-loop-while
99 basic-exit-do
100 basic-exit-for
101 basic-exit-select
102 basic-exit-try
103 basic-exit-while
104 basic-continue-do
105 basic-continue-for
106 basic-continue-while
107 fortran-call-alt-return
108 conditional-goto