我一直在从抽象语法树重写代码生成,但它仍然不正确。 : - (
首先,我只是从底部开始
1 2
\ /
mul 5
\ /
add
|
如果我从添加开始 - >在所有输入上递归调用codegen - > mul并添加它们,我得到预期的
a = mul 1 2
b = add a 5
问题是,如果我两次引用同一个节点,例如:
1 2
\ /
mul 5
| \ /
| sub
| /
add
|
这会打电话给" mul 1 2"两次,并生成:
a = mul 1 2
b = sub a 5
c = mul 1 2
d = add c a
现在,我可以解决这个问题,如果节点只是在第一次调用它时才会生成代码,它只会返回结果变量,在本例中为a。
不幸的是,如果我想生成分支,这将停止工作。 codegen将在第一次调用时插入行(在分支内),如果在分支外使用,则不存在对变量的引用。例如:
1 2
\ /
5 mul 3
\ / \ /
sub add
\ /
true - if
这将使用我目前拥有的算法生成:
branch true : label1
jump label2:
label1:
a = mul 1 2 <-- inserts code
b = sub 5 a
jump end:
label2:
c = add a 3 <--- references a, which is not valid here
jump end:
end:
result = PHI [b, label1], [c, label2]
我想我需要一种不同的方法,有人能指出我正确的方向吗?