控制流程图的for循环

时间:2013-05-13 18:08:37

标签: python loops control-flow-graph

我正在开发一个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行的节点

0 个答案:

没有答案