Имам AST на езика WHILE (http://www.program-analysis.com/while.html), присъстващ в XML формат. В момента не обработвам извиквания на функции или рекурсия. Трябва да генерирам контролния поток за тази програма.
Примерна програма (числата след // показват етикети, генерирани от анализатора):
begin
x:=1; // 1
z:= 2+x; // 2
x := x+z; // 3
y:=z-x+z; // 4
w:=x+y+z; // 5
while(not (y<z)) { // 12
x:=x+1; // 6
if (w <=x) { // 9
w:= w-x; // 7
}
else {
w:=w+x; // 8
}
z:=z-1; // 10
y:=y+1; // 11
}
x:=z+y; // 13
w:=x; // 14
end
AST за гореспоменатата програма е представена като:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<program>
<assignment label="1" variable="x">
<value>
<number value="1"/>
</value>
</assignment>
<assignment label="2" variable="z">
<value>
<binary operator="+">
<left>
<number value="2"/>
</left>
<right>
<variable name="x"/>
</right>
</binary>
</value>
</assignment>
<assignment label="3" variable="x">
<value>
<binary operator="+">
<left>
<variable name="x"/>
</left>
<right>
<variable name="z"/>
</right>
</binary>
</value>
</assignment>
<assignment label="4" variable="y">
<value>
<binary operator="+">
<left>
<binary operator="-">
<left>
<variable name="z"/>
</left>
<right>
<variable name="x"/>
</right>
</binary>
</left>
<right>
<variable name="z"/>
</right>
</binary>
</value>
</assignment>
<assignment label="5" variable="w">
<value>
<binary operator="+">
<left>
<binary operator="+">
<left>
<variable name="x"/>
</left>
<right>
<variable name="y"/>
</right>
</binary>
</left>
<right>
<variable name="z"/>
</right>
</binary>
</value>
</assignment>
<while condition-label="12">
<condition>
<not>
<binary operator="<">
<left>
<variable name="y"/>
</left>
<right>
<variable name="z"/>
</right>
</binary>
</not>
</condition>
<body>
<assignment label="6" variable="x">
<value>
<binary operator="+">
<left>
<variable name="x"/>
</left>
<right>
<number value="1"/>
</right>
</binary>
</value>
</assignment>
<if condition-label="9">
<condition>
<binary operator="<=">
<left>
<variable name="w"/>
</left>
<right>
<variable name="x"/>
</right>
</binary>
</condition>
<true-branch>
<assignment label="7" variable="w">
<value>
<binary operator="-">
<left>
<variable name="w"/>
</left>
<right>
<variable name="x"/>
</right>
</binary>
</value>
</assignment>
</true-branch>
<false-branch>
<assignment label="8" variable="w">
<value>
<binary operator="+">
<left>
<variable name="w"/>
</left>
<right>
<variable name="x"/>
</right>
</binary>
</value>
</assignment>
</false-branch>
</if>
<assignment label="10" variable="z">
<value>
<binary operator="-">
<left>
<variable name="z"/>
</left>
<right>
<number value="1"/>
</right>
</binary>
</value>
</assignment>
<assignment label="11" variable="y">
<value>
<binary operator="+">
<left>
<variable name="y"/>
</left>
<right>
<number value="1"/>
</right>
</binary>
</value>
</assignment>
</body>
</while>
<assignment label="13" variable="x">
<value>
<binary operator="+">
<left>
<variable name="z"/>
</left>
<right>
<variable name="y"/>
</right>
</binary>
</value>
</assignment>
<assignment label="14" variable="w">
<value>
<variable name="x"/>
</value>
</assignment>
</program>
Трябва да генерирам контролния поток на програмата.
Контролният поток за гореспоменатата програма е следният:
1->2,
2->3,
3->4,
4->5,
5->12,
12->6,
12->13,
11->12,
6->9 ,
9->7,
9->8,
7->10,
8->10,
10->11,
13->14.
Забележка: докато може да има вложени изрази if и оператори while в него и обратно. За предпочитане търся общо решение в Python/Java/C.
Благодаря предварително, Рой