我有XML格式的WHILE語言(http://www.program-analysis.com/while.html)。目前,我不處理函數調用或遞歸。我需要爲這個程序生成控制流程。如何使用Python生成AST(用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中尋找一個通用的解決方案。
由於提前, 羅伊
只是一個觀察:我不知道,你可以在一個更多樣化的語言都要求幫助...的Python:解釋和動態強類型,Java的編譯和靜態強類型,C編譯靜態但相對較弱的類型......完全不是批評;事實上這很好,因爲這意味着更多人可以提供幫助,但它確實讓我好奇你想要做什麼。 :) – Crisfole 2012-02-16 15:49:31
嗯... 的Java:因爲很多的開發商我知道被它 的Python發誓:因爲我覺得它很有趣,而且我敢肯定,那裏面寫丹相同片段會轉化爲大約100 +線的Java,包括對象和類。 C:因爲這是我很久以前學過的東西,而且比較容易閱讀。 您可以指出的其他語言,如計劃,Lisp語言,C#,但我認爲所有這些下跌的其中一個類別下。 – user916315 2012-02-16 16:36:18