Year 2 compilers coureswork

test26.tac 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. --C COMPILER
  2. int biggerIsOdd(int x, int y){
  3. if(x>y){
  4. return isOdd(x);
  5. } else {
  6. return isOdd(y);
  7. }
  8. }
  9. int isOdd(int x){
  10. if(x == 1){
  11. return 1;
  12. } else {
  13. if(isOdd(x-1) == 1){
  14. return 0;
  15. } else {
  16. return 1;
  17. }
  18. }
  19. }
  20. int main() {
  21. int x = 5;
  22. int y = 7;
  23. if(biggerIsOdd(x,y) == 1){
  24. return 400;
  25. }
  26. return 66;
  27. }
  28. parse finished
  29. ~
  30. ~
  31. D
  32. d
  33. int
  34. F
  35. biggerIsOdd
  36. ,
  37. ~
  38. int
  39. x
  40. ~
  41. int
  42. y
  43. if
  44. >
  45. x
  46. y
  47. else
  48. return
  49. apply
  50. isOdd
  51. x
  52. return
  53. apply
  54. isOdd
  55. y
  56. D
  57. d
  58. int
  59. F
  60. isOdd
  61. ~
  62. int
  63. x
  64. if
  65. ==
  66. x
  67. 1
  68. else
  69. return
  70. 1
  71. if
  72. ==
  73. apply
  74. isOdd
  75. -
  76. x
  77. 1
  78. 1
  79. else
  80. return
  81. 0
  82. return
  83. 1
  84. D
  85. d
  86. int
  87. F
  88. main
  89. ;
  90. ;
  91. ~
  92. int
  93. =
  94. x
  95. 5
  96. ~
  97. int
  98. =
  99. y
  100. 7
  101. ;
  102. if
  103. ==
  104. apply
  105. biggerIsOdd
  106. ,
  107. x
  108. y
  109. 1
  110. return
  111. 400
  112. return
  113. 66
  114. func biggerIsOdd
  115. param x
  116. param y
  117. if x <= y then L0
  118. arg x
  119. call isOdd, $t0
  120. ret $t0
  121. goto L1
  122. L0
  123. arg y
  124. call isOdd, $t1
  125. ret $t1
  126. L1
  127. end biggerIsOdd
  128. func isOdd
  129. param x
  130. if x != 1 then L2
  131. ret 1
  132. goto L3
  133. L2
  134. $t3 := x - 1
  135. arg $t3
  136. call isOdd, $t2
  137. if $t2 != 1 then L4
  138. ret 0
  139. goto L5
  140. L4
  141. ret 1
  142. L5
  143. L3
  144. end isOdd
  145. func main
  146. x := 5
  147. y := 7
  148. arg x
  149. arg y
  150. call biggerIsOdd, $t4
  151. if $t4 != 1 then L6
  152. ret 400
  153. L6
  154. ret 66
  155. end main
  156. =====
  157. li $a0, 68
  158. li $v0, 9
  159. syscall
  160. or $fp, $0, $v0
  161. la $t0, main
  162. sw $t0, 0($fp)
  163. sw $0, 4($fp)
  164. jal main
  165. j done
  166. #func biggerIsOdd
  167. biggerIsOdd:
  168. li $a0, 68
  169. li $v0, 9
  170. syscall
  171. sw $fp, 4($v0)
  172. or $fp, $0, $v0
  173. la $t0, biggerIsOdd
  174. sw $t0, 0($fp)
  175. sw $ra, 64($fp)
  176. #param x
  177. or $16, $0, $5
  178. #param y
  179. or $17, $0, $6
  180. #if x <= y then L0
  181. ble $16, $17, L0
  182. #arg x
  183. or $5, $0, $16
  184. #call isOdd, $t0
  185. jal isOdd
  186. lw $fp, 4($fp)
  187. lw $ra, 64($fp)
  188. lw $16, 8($fp)
  189. lw $17, 12($fp)
  190. or $8, $0, $v1
  191. #ret $t0
  192. or $v1, $0, $8
  193. jr $31
  194. #goto L1
  195. j L1
  196. #L0
  197. L0:
  198. #arg y
  199. or $5, $0, $17
  200. #call isOdd, $t1
  201. jal isOdd
  202. lw $fp, 4($fp)
  203. lw $ra, 64($fp)
  204. lw $16, 8($fp)
  205. lw $17, 12($fp)
  206. or $9, $0, $v1
  207. #ret $t1
  208. or $v1, $0, $9
  209. jr $31
  210. #L1
  211. L1:
  212. #end biggerIsOdd
  213. #func isOdd
  214. isOdd:
  215. li $a0, 68
  216. li $v0, 9
  217. syscall
  218. sw $fp, 4($v0)
  219. or $fp, $0, $v0
  220. la $t0, isOdd
  221. sw $t0, 0($fp)
  222. sw $ra, 64($fp)
  223. #param x
  224. or $16, $0, $5
  225. #if x != 1 then L2
  226. li $10, 1
  227. bne $16, $10, L2
  228. #ret 1
  229. li $11, 1
  230. or $v1, $0, $11
  231. jr $31
  232. #goto L3
  233. j L3
  234. #L2
  235. L2:
  236. #$t3 := x - 1
  237. li $13, 1
  238. sub $12, $16, $13
  239. #arg $t3
  240. or $5, $0, $12
  241. #call isOdd, $t2
  242. jal isOdd
  243. lw $fp, 4($fp)
  244. lw $ra, 64($fp)
  245. lw $16, 8($fp)
  246. or $14, $0, $v1
  247. #if $t2 != 1 then L4
  248. li $15, 1
  249. bne $14, $15, L4
  250. #ret 0
  251. or $v1, $0, $0
  252. jr $31
  253. #goto L5
  254. j L5
  255. #L4
  256. L4:
  257. #ret 1
  258. li $24, 1
  259. or $v1, $0, $24
  260. jr $31
  261. #L5
  262. L5:
  263. #L3
  264. L3:
  265. #end isOdd
  266. #func main
  267. main:
  268. li $a0, 68
  269. li $v0, 9
  270. syscall
  271. sw $fp, 4($v0)
  272. or $fp, $0, $v0
  273. la $t0, main
  274. sw $t0, 0($fp)
  275. sw $ra, 64($fp)
  276. #x := 5
  277. li $25, 5
  278. or $16, $0, $25
  279. #y := 7
  280. li $8, 7
  281. or $17, $0, $8
  282. #arg x
  283. or $5, $0, $16
  284. #arg y
  285. or $6, $0, $17
  286. #call biggerIsOdd, $t4
  287. jal biggerIsOdd
  288. lw $fp, 4($fp)
  289. lw $ra, 64($fp)
  290. lw $16, 8($fp)
  291. lw $17, 12($fp)
  292. or $9, $0, $v1
  293. #if $t4 != 1 then L6
  294. li $10, 1
  295. bne $9, $10, L6
  296. #ret 400
  297. li $11, 400
  298. or $v1, $0, $11
  299. jr $31
  300. #L6
  301. L6:
  302. #ret 66
  303. li $12, 66
  304. or $v1, $0, $12
  305. jr $31
  306. #end main
  307. done:
  308. ori $v0, $0, 10
  309. syscall