| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- --C COMPILER
- int biggerIsOdd(int x, int y){
- if(x>y){
- return isOdd(x);
- } else {
- return isOdd(y);
- }
- }
- int isOdd(int x){
- if(x == 1){
- return 1;
- } else {
- if(isOdd(x-1) == 1){
- return 0;
- } else {
- return 1;
- }
- }
- }
- int main() {
- int x = 5;
- int y = 7;
- if(biggerIsOdd(x,y) == 1){
- return 400;
- }
- return 66;
-
- }
- parse finished
- ~
- ~
- D
- d
- int
- F
- biggerIsOdd
- ,
- ~
- int
- x
- ~
- int
- y
- if
- >
- x
- y
- else
- return
- apply
- isOdd
- x
- return
- apply
- isOdd
- y
- D
- d
- int
- F
- isOdd
- ~
- int
- x
- if
- ==
- x
- 1
- else
- return
- 1
- if
- ==
- apply
- isOdd
- -
- x
- 1
- 1
- else
- return
- 0
- return
- 1
- D
- d
- int
- F
- main
- ;
- ;
- ~
- int
- =
- x
- 5
- ~
- int
- =
- y
- 7
- ;
- if
- ==
- apply
- biggerIsOdd
- ,
- x
- y
- 1
- return
- 400
- return
- 66
- func biggerIsOdd
- param x
- param y
- if x <= y then L0
- arg x
- call isOdd, $t0
- ret $t0
- goto L1
- L0
- arg y
- call isOdd, $t1
- ret $t1
- L1
- end biggerIsOdd
- func isOdd
- param x
- if x != 1 then L2
- ret 1
- goto L3
- L2
- $t3 := x - 1
- arg $t3
- call isOdd, $t2
- if $t2 != 1 then L4
- ret 0
- goto L5
- L4
- ret 1
- L5
- L3
- end isOdd
- func main
- x := 5
- y := 7
- arg x
- arg y
- call biggerIsOdd, $t4
- if $t4 != 1 then L6
- ret 400
- L6
- ret 66
- end main
- =====
- li $a0, 68
- li $v0, 9
- syscall
- or $fp, $0, $v0
- la $t0, main
- sw $t0, 0($fp)
- sw $0, 4($fp)
- jal main
- j done
- #func biggerIsOdd
- biggerIsOdd:
- li $a0, 68
- li $v0, 9
- syscall
- sw $fp, 4($v0)
- or $fp, $0, $v0
- la $t0, biggerIsOdd
- sw $t0, 0($fp)
- sw $ra, 64($fp)
- #param x
- or $16, $0, $5
- #param y
- or $17, $0, $6
- #if x <= y then L0
- ble $16, $17, L0
- #arg x
- or $5, $0, $16
- #call isOdd, $t0
- jal isOdd
- lw $fp, 4($fp)
- lw $ra, 64($fp)
- lw $16, 8($fp)
- lw $17, 12($fp)
- or $8, $0, $v1
- #ret $t0
- or $v1, $0, $8
- jr $31
- #goto L1
- j L1
- #L0
- L0:
- #arg y
- or $5, $0, $17
- #call isOdd, $t1
- jal isOdd
- lw $fp, 4($fp)
- lw $ra, 64($fp)
- lw $16, 8($fp)
- lw $17, 12($fp)
- or $9, $0, $v1
- #ret $t1
- or $v1, $0, $9
- jr $31
- #L1
- L1:
- #end biggerIsOdd
- #func isOdd
- isOdd:
- li $a0, 68
- li $v0, 9
- syscall
- sw $fp, 4($v0)
- or $fp, $0, $v0
- la $t0, isOdd
- sw $t0, 0($fp)
- sw $ra, 64($fp)
- #param x
- or $16, $0, $5
- #if x != 1 then L2
- li $10, 1
- bne $16, $10, L2
- #ret 1
- li $11, 1
- or $v1, $0, $11
- jr $31
- #goto L3
- j L3
- #L2
- L2:
- #$t3 := x - 1
- li $13, 1
- sub $12, $16, $13
- #arg $t3
- or $5, $0, $12
- #call isOdd, $t2
- jal isOdd
- lw $fp, 4($fp)
- lw $ra, 64($fp)
- lw $16, 8($fp)
- or $14, $0, $v1
- #if $t2 != 1 then L4
- li $15, 1
- bne $14, $15, L4
- #ret 0
- or $v1, $0, $0
- jr $31
- #goto L5
- j L5
- #L4
- L4:
- #ret 1
- li $24, 1
- or $v1, $0, $24
- jr $31
- #L5
- L5:
- #L3
- L3:
- #end isOdd
- #func main
- main:
- li $a0, 68
- li $v0, 9
- syscall
- sw $fp, 4($v0)
- or $fp, $0, $v0
- la $t0, main
- sw $t0, 0($fp)
- sw $ra, 64($fp)
- #x := 5
- li $25, 5
- or $16, $0, $25
- #y := 7
- li $8, 7
- or $17, $0, $8
- #arg x
- or $5, $0, $16
- #arg y
- or $6, $0, $17
- #call biggerIsOdd, $t4
- jal biggerIsOdd
- lw $fp, 4($fp)
- lw $ra, 64($fp)
- lw $16, 8($fp)
- lw $17, 12($fp)
- or $9, $0, $v1
- #if $t4 != 1 then L6
- li $10, 1
- bne $9, $10, L6
- #ret 400
- li $11, 400
- or $v1, $0, $11
- jr $31
- #L6
- L6:
- #ret 66
- li $12, 66
- or $v1, $0, $12
- jr $31
- #end main
- done:
- ori $v0, $0, 10
- syscall
|