datatype instruction = PUSH of result | TIMES_OP | DIV_OP | PLUS_OP | SUB_OP ; fun genCode Empty = ([], []) | genCode (EXP(termTree, exp1Tree)) = let val (tFirst, tRest) = genCode termTree in let val (eFirst, eRest) = genCode exp1Tree in ((tFirst @ tRest), (eFirst @ eRest)) end end | genCode (EXP1(OP(PLUS), expTree)) = let val (first, Rest) = genCode expTree in ((first @ [PLUS_OP]), Rest) end | genCode (EXP1(OP(SUB), expTree)) = let val (first, Rest) = genCode expTree in ((first @ [SUB_OP]), Rest) end | genCode (TERM(factorTree, term1Tree)) = (* note that the factor could in fact be an expression in brackets. In this case we need to collect first, too *) let val (fFirst,fRest) = genCode factorTree in let val (tFirst, tRest) = genCode term1Tree in ((fFirst @ fRest), (tFirst @ tRest)) end end | genCode (TERM1(OP(DIV), termTree)) = let val (first, rest) = genCode termTree in ((first @ [DIV_OP]), rest) end | genCode (TERM1(OP(TIMES), termTree)) = let val (first, rest) = genCode termTree in ((first @ [TIMES_OP]), rest) end | genCode (FACTOR(X)) = ([], [PUSH(X)]); fun translate () = let val (expFirst, expRest) = genCode(parse()) in (expFirst @ expRest) end fun translate1 x = let val (expFirst, expRest) = genCode(x) in (expFirst @ expRest) end;