-
Notifications
You must be signed in to change notification settings - Fork 0
/
codeTograph.py
108 lines (95 loc) · 3.66 KB
/
codeTograph.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from hello import FuncStructObj, IfBlockCode, OnelineCode, LinesCode
from graphviz import Digraph
import os
os.environ["PATH"] += os.pathsep + r"C:\Program Files (x86)\Graphviz2.38\bin"
y_res, n_res = [], []
def linde_code_process(item, index):
node_name = index
dot.node(node_name, item.__str__())
def Ifblock_code_process(item, index):
global y_res, n_res
node_name = index
dot.node(node_name, item.condition, {'shape': "diamond"})
if item.if_true:
if type(item.if_true) == IfBlockCode:
Ifblock_code_process(item.if_true, node_name + 'if_sub')
dot.edge(node_name, node_name + 'if_sub', label="Y")
elif type(item.if_true) in (OnelineCode, LinesCode):
node_name_true = node_name + 'if_true'
dot.node(node_name_true, item.if_true.__str__())
dot.edge(node_name, node_name_true, label="Y")
y_res.append((node_name_true, True))
else:
pass
else:
y_res.append((node_name, False))
if item.if_false:
if type(item.if_false) == IfBlockCode:
Ifblock_code_process(item.if_false, node_name + 'if_sub')
dot.edge(node_name, node_name + 'if_sub', label="N")
elif type(item.if_false) in (OnelineCode, LinesCode):
node_name_false = node_name + 'if_false'
dot.node(node_name_false, item.if_false.__str__())
dot.edge(node_name, node_name_false, label="N")
n_res.append((node_name_false, True))
else:
pass
else:
n_res.append((node_name, False))
dot = Digraph(comment=FuncStructObj.name, engine='dot')
dot.edge_attr = {'comment': "Wildcard edge",
'fontname': "sans-serif",
'fontsize': '10',
'colorscheme': "blues3",
'color': '2',
'fontcolor': '3'}
dot.node_attr = {'fontname': "serif",
'colorscheme': "blues4",
'color': "2",
'style': "filled",
'shape': "rectangle",
'fontsize': '13',
'fillcolor': "1",
'fontcolor': "4"}
# Add nodes and edges:
items = FuncStructObj.items
# 处理每个item,并获取每个item首尾nodes
for i in items:
index = str(items.index(i))
if type(i) == IfBlockCode:
Ifblock_code_process(i, index)
i.y_res, i.n_res = y_res.copy(), n_res.copy()
y_res, n_res = [], []
elif type(i) in (OnelineCode, LinesCode):
linde_code_process(i, index)
else:
pass
# 将每个item首尾nodes串起来
for i in items:
index = items.index(i)
if index > 0:
last_item = items[index - 1]
this_item_head = str(index)
if type(last_item) == IfBlockCode:
for member in last_item.y_res:
if member[1]:
dot.edge(member[0], this_item_head)
else:
dot.edge(member[0], this_item_head, label="Y")
for member in last_item.n_res:
if member[1]:
dot.edge(member[0], this_item_head)
else:
dot.edge(member[0], this_item_head, label="N")
elif type(last_item) in (OnelineCode, LinesCode):
dot.edge(str(index - 1), this_item_head)
else:
pass
# Check the generated source code:
print(dot.source)
# Save and render the source code, optionally view the result:
# dot.render(FuncStructObj.name + '.gv', view=True) # doctest: +SKIP
if os.path.exists(FuncStructObj.name + '.gv'):
os.remove(FuncStructObj.name + '.gv')
os.remove(FuncStructObj.name + '.gv' + '.pdf')
dot.view(FuncStructObj.name + '.gv')