# 3827 Homework 3, problem 2, "eval"
#
# <your name here>, <your uni here>
#
# Invoke with, e.g., spim -file eval.s
#	
	.text
	# $a0 : pointer to an expression
eval:
	# Your solution here
	li	$v0, 0
	jr	$ra

######################################################################
#
# Test harness: extend to add tests
#		      
	.data

# Expression nodes take three forms:
# .word 0, 1	   	# Leaf: value
# .word '!', e10   	# Unary negation operator
# .word '+', e42, e17	# Binary operator: +, left is e42, right is e17

e1:	.word 0, 1
e0:	.word 0, 0
e4:	.word 0, 4
eadd:	.word '+', e0, e4
eadd2:	.word '+', e0, e1
eadd3:	.word '+', e1, e1
eadd4:	.word '+', e1, e4
e2:	.word 0, 2
e3:	.word 0, 3
eadd5:	.word '+', e2, e3
eadd6:	.word '+', eadd4, eadd2
e5:	.word 0, 7
emult1:	.word '*', e5, eadd3
exor1:	.word '^', e0, e0
exor2:	.word '^', e0, e1
exor3:	.word '^', e1, e1
exor4:	.word '^', eadd, eadd4
eneg1:	.word '!', e3
eneg2:	.word '!', exor4

	# Add more test expressions here
	
nl:	.asciiz "\n"
lparen:	.asciiz "("
onechar: .asciiz " "
rparen:	.asciiz ")"
equals:	.asciiz " = "	
	
	.text

	# Print an expression tree
	# $a0 : address of the root of the expression tree
print:
	lb	$t0, 0($a0)
	bne	$t0, $0, prbranch

	lw	$a0, 4($a0)	# leaf: print its value
	li	$v0, 1
	syscall
	jr	$ra

prbranch:
	addiu	$sp, $sp, -8	# Save $ra and $s0 on the stack
	sw	$ra, 0($sp)
	sw	$s0, 4($sp)

	move 	$s0, $a0	# Remember the tree node

	bne	$t0, '!', .L1

	la	$a0, onechar
	sb	$t0, 0($a0)
	li	$v0, 4
	syscall
	
	la	$a0, lparen	# print (
	li	$v0, 4
	syscall

	lw	$a0, 4($s0)	# print(left)
	jal	print

	b	.L2

.L1:	

	la	$a0, lparen	# print (
	li	$v0, 4
	syscall
	
	lw	$a0, 4($s0)	# print(left)
	jal	print

	lb	$t0, 0($s0)	# print(op)
	la	$a0, onechar
	sb	$t0, 0($a0)
	li	$v0, 4
	syscall

	lw	$a0, 8($s0)	# print(right)
	jal	print

.L2:
	la	$a0, rparen	# print )
	li	$v0, 4
	syscall
	
	lw	$ra, 0($sp)	# Restore $ra and $s0
	lw	$s0, 4($sp)
	addiu	$sp, $sp, 8
	jr	$ra

	# Print an expression tree, evaluate it, and print the result
	# $a0 : address of the root of the expression tree
preval:
	addiu	$sp, $sp, -8	# Save $ra and $s0
	sw	$ra, 0($sp)
	sw	$s0, 4($sp)

	move	$s0, $a0

	jal	print		# Print the expression

	la	$a0, equals	# Print " = "
	li	$v0, 4
	syscall

	move	$a0, $s0	# Call eval on the expression
	jal	eval

	move	$a0, $v0	# Print the (integer) result
	li	$v0, 1
	syscall

	la	$a0, nl		# Print a newline
	li	$v0, 4
	syscall
	
	lw	$ra, 0($sp)	# Restore $ra and $s0
	lw	$s0, 4($sp)
	addiu	$sp, $sp, 8
	jr	$ra
	
	.globl main

	# Run a number of tests
main:
	move	$s0, $ra

	la	$a0, e1		# preval(e1)
	jal	preval

	la	$a0, e0	
	jal	preval

	la	$a0, e4
	jal	preval

	la	$a0, eadd
	jal	preval
	
	la	$a0, eadd2
	jal	preval

	la	$a0, eadd3
	jal	preval

	la	$a0, eadd4
	jal	preval

	la	$a0, emult1
	jal 	preval

	la	$a0, eadd5
	jal	preval

	la	$a0, eadd6
	jal	preval

	la	$a0, eneg1
	jal	preval

	la	$a0, exor1
	jal	preval

	la	$a0, exor2
	jal	preval

	la	$a0, exor3
	jal	preval

	la	$a0, exor4
	jal	preval

	la	$a0, eneg2
	jal	preval

	
	# Add your own tests here

	move	$ra, $s0
	jr	$ra
