功能的中间代码生成

时间:2018-07-21 05:00:17

标签: compiler-construction intermediate-language

我正在跟踪编译器设计,发现了以下问题。

int fact(int n){
   if(n==0) return 1;
   else return (n*fact(n-l))
}

对于以上代码,以下为中间代码

1. func begin fact
2. if (n==0) goto L1
3. T1 = n-1
4. param T1
5. refparam result
6. call fact, 2
7. T3 = n*result
8. return T3
9. L1: return 1
10. func end

以上中间代码正确吗?如果是这样,为什么在第6行调用需要2个参数,而原始函数需要1个参数。那么param和refparam有什么区别。

请在上面澄清一下。

1 个答案:

答案 0 :(得分:3)

设计中间语言的方式有很多种,但是您所寻找的并不是直接表示将函数调用的返回值存储在call语法中的一部分(也就是说,不会说result = call fact, 1或类似的内容。

应该将返回值的存储位置作为另一个参数传递。这就是为什么有两个而不是一个的原因。这就是为什么它为refparam使用param而不是result的原因:我们要传递result的地址,而不是它的值(它甚至没有那个值)点),因此返回值可以存储在此处。