fun transExp (venv,tenv) = let fun trexp (A.NilExp) = E.NIL | trexp (A.IntExp i) = E.INT | trexp (A.StringExp(s,pos)) = E.STRING (* | trexp (A.VarExp var) = trvar (var)*) | trexp (A.OpExp{left,oper=A.PlusOp,right,pos}) = let val tyleft = trexp(left) val tyright = trexp(right) in case tyleft of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); case tyright of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); E.INT end | trexp (A.OpExp{left,oper=A.MinusOp,right,pos}) = let val tyleft = trexp(left) val tyright = trexp(right) in case tyleft of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); case tyright of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); E.INT end | trexp (A.OpExp{left,oper=A.TimesOp,right,pos}) = let val tyleft = trexp(left) val tyright = trexp(right) in case tyleft of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); case tyright of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); E.INT end | trexp (A.OpExp{left,oper=A.DivideOp,right,pos}) = let val tyleft = trexp(left) val tyright = trexp(right) in case tyleft of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); case tyright of E.INT => E.INT | _ => ((error pos "INT required"); E.ERROR); E.INT end | trexp (A.OpExp{left,oper=A.LtOp,right,pos}) = let val tyleft = trexp(left) val tyright = trexp(right) in if tyeq(tyleft,tyright) = true then (case tyleft of E.INT => E.INT | E.STRING => E.INT | _ => ((err pos "INT or STRING required"); E.ERROR);) else E.ERROR end in trexp end