我正在开发一个python库,它将python源代码转换为控制流图(CFG)。作为中间步骤,我已将源代码转换为xml表示。
例如,以下源代码:
def bar(): # line 32
a += 1 # line 33
for x in [1,2]: # line 34
print x # line 35
if x%2: # line 36
print x**2 # line 37
break # line 38
else: # line 39
print x**3 # line 40
else: # line 41
print "wpp" # line 42
print "done" # line 43
转换为以下xml:
<?xml version="1.0" ?>
<module>
: 0
: <functiondef>
: : 32
: : <augassign>
: : : 33
: : : <name>33</name>
: : : <add>add</add>
: : : <num>33</num>
: : </augassign>
: : <for>
: : : 34
: : : <print>
: : : : 35
: : : : <name>35</name>
: : : </print>
: : : <if>
: : : : 36
: : : : <binop>
: : : : : 36
: : : : : <name>36</name>
: : : : : <mod>mod</mod>
: : : : : <num>36</num>
: : : : </binop>
: : : : <print>
: : : : : 37
: : : : : <binop>
: : : : : : 37
: : : : : : <name>37</name>
: : : : : : <pow>pow</pow>
: : : : : : <num>37</num>
: : : : : </binop>
: : : : </print>
: : : : <break>38</break>
: : : : <else>
: : : : : 39
: : : : : <print>
: : : : : : 40
: : : : : : <binop>
: : : : : : : 40
: : : : : : : <name>40</name>
: : : : : : : <pow>pow</pow>
: : : : : : : <num>40</num>
: : : : : : </binop>
: : : : : </print>
: : : : </else>
: : : </if>
: : : <else>
: : : : 41
: : : : <print>
: : : : : 42
: : : : : <str>42</str>
: : : : </print>
: : : </else>
: : </for>
: : <print>
: : : 43
: : : <str>43</str>
: : </print>
: </functiondef>
</module>
现在,我需要做的是将此xml转换为CFG,表示如下:
0 [32]
32 [33]
33 [34]
34 [35, 42]
35 [36]
36 [37, 40]
37 [38]
38 [43]
40 [34]
42 [43]
43 []
现在,我处理了迄今为止我见过的大部分案件。但是,我在将for循环的正确末端连接到for循环的顶部/定义时遇到了一些麻烦(第34行)
我非常感谢能够帮助我弄清楚如何找出for循环中哪些节点连接回for循环顶部的人。在这个例子中,只有一个这样的节点,即第40行的节点