将树转换为中间格式

时间:2016-10-20 06:44:30

标签: compiler-construction

我一直在从抽象语法树重写代码生成,但它仍然不正确。 : - (

首先,我只是从底部开始

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]

我想我需要一种不同的方法,有人能指出我正确的方向吗?

0 个答案:

没有答案