Year 2 compilers coureswork

finaltest1.tac 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. --C COMPILER
  2. int inner_fact(int n, int a) {
  3. if (n==0) {
  4. return a;
  5. }
  6. return inner_fact(n-1,a*n);
  7. }
  8. int fact(int n) {
  9. return inner_fact(n,1);
  10. }
  11. int main(){
  12. return fact(6);
  13. }
  14. parse finished
  15. ~
  16. ~
  17. D
  18. d
  19. int
  20. F
  21. inner_fact
  22. ,
  23. ~
  24. int
  25. n
  26. ~
  27. int
  28. a
  29. ;
  30. if
  31. ==
  32. n
  33. 0
  34. return
  35. a
  36. return
  37. apply
  38. inner_fact
  39. ,
  40. -
  41. n
  42. 1
  43. *
  44. a
  45. n
  46. D
  47. d
  48. int
  49. F
  50. fact
  51. ~
  52. int
  53. n
  54. return
  55. apply
  56. inner_fact
  57. ,
  58. n
  59. 1
  60. D
  61. d
  62. int
  63. F
  64. main
  65. return
  66. apply
  67. fact
  68. 6
  69. func inner_fact
  70. param n
  71. param a
  72. if n != 0 then L0
  73. ret a
  74. L0
  75. $t1 := n - 1
  76. $t2 := a * n
  77. arg $t1
  78. arg $t2
  79. call inner_fact, $t0
  80. ret $t0
  81. end inner_fact
  82. func fact
  83. param n
  84. arg n
  85. arg 1
  86. call inner_fact, $t3
  87. ret $t3
  88. end fact
  89. func main
  90. arg 6
  91. call fact, $t4
  92. ret $t4
  93. end main
  94. =====
  95. li $a0, 68
  96. li $v0, 9
  97. syscall
  98. or $fp, $0, $v0
  99. la $t0, main
  100. sw $t0, 0($fp)
  101. sw $0, 4($fp)
  102. jal main
  103. j done
  104. #func inner_fact
  105. inner_fact:
  106. li $a0, 68
  107. li $v0, 9
  108. syscall
  109. sw $fp, 4($v0)
  110. or $fp, $0, $v0
  111. la $t0, inner_fact
  112. sw $t0, 0($fp)
  113. sw $ra, 64($fp)
  114. #param n
  115. or $16, $0, $5
  116. #param a
  117. or $17, $0, $6
  118. #if n != 0 then L0
  119. bne $16, $0, L0
  120. #ret a
  121. or $v1, $0, $17
  122. jr $31
  123. #L0
  124. L0:
  125. #$t1 := n - 1
  126. li $9, 1
  127. sub $8, $16, $9
  128. #$t2 := a * n
  129. mult $17, $16
  130. mflo $10
  131. #arg $t1
  132. or $5, $0, $8
  133. #arg $t2
  134. or $6, $0, $10
  135. #call inner_fact, $t0
  136. jal inner_fact
  137. lw $fp, 4($fp)
  138. lw $ra, 64($fp)
  139. lw $16, 8($fp)
  140. lw $17, 12($fp)
  141. or $11, $0, $v1
  142. #ret $t0
  143. or $v1, $0, $11
  144. jr $31
  145. #end inner_fact
  146. #func fact
  147. fact:
  148. li $a0, 68
  149. li $v0, 9
  150. syscall
  151. sw $fp, 4($v0)
  152. or $fp, $0, $v0
  153. la $t0, fact
  154. sw $t0, 0($fp)
  155. sw $ra, 64($fp)
  156. #param n
  157. or $16, $0, $5
  158. #arg n
  159. or $5, $0, $16
  160. #arg 1
  161. li $12, 1
  162. or $6, $0, $12
  163. #call inner_fact, $t3
  164. jal inner_fact
  165. lw $fp, 4($fp)
  166. lw $ra, 64($fp)
  167. lw $16, 8($fp)
  168. or $13, $0, $v1
  169. #ret $t3
  170. or $v1, $0, $13
  171. jr $31
  172. #end fact
  173. #func main
  174. main:
  175. li $a0, 68
  176. li $v0, 9
  177. syscall
  178. sw $fp, 4($v0)
  179. or $fp, $0, $v0
  180. la $t0, main
  181. sw $t0, 0($fp)
  182. sw $ra, 64($fp)
  183. #arg 6
  184. li $14, 6
  185. or $5, $0, $14
  186. #call fact, $t4
  187. jal fact
  188. lw $fp, 4($fp)
  189. lw $ra, 64($fp)
  190. or $15, $0, $v1
  191. #ret $t4
  192. or $v1, $0, $15
  193. jr $31
  194. #end main
  195. done:
  196. ori $v0, $0, 10
  197. syscall