E → E1 + E2 # a typical binary operation ----------- E.place := makeNewTemp() E.code := [ E1.code ] [ E2.code ] emitCode( E.place, " := ", E1.place, " + ", E2.place ) E → - E1 # a typical unary operation -------- E.place := makeNewTemp() E.code := [ E1.code ] emitCode( E.place, " := negate ", E1.place ) E → id # base case with a location ------ E.place := id.place E.code := "" E → literal # base case without a location ----------- E.place := makeNewTemp() E.code := emitCode( E.place, " := ", literal )