Let us consider a different kind of computer that uses an accumulator to compute values. The accumulator holds one of the operands of a computation, the other being given as a parameter of an instruction. The result is placed into the accumulator.
These are the instructions:
'action' ACCUPLUS(Variable) 'action' ACCUMINUS(Variable) 'action' LOADACCU(Variable) 'action' STOREACCU(Variable)ACCUPLUS(X) means Accu := Accu + X, ACCUMINUS(X) means Accu := Accu - X, LOADACCU(X) means Accu := X, STOREACCU(X) means X := Accu. Here is an incomplete specification of code generation:
'rule' Encode(assign(V,X)): AccuCode(X) STOREACCU(V) 'rule' AccuCode(plus(X, var(V))): AccuCode(X) ACCUPLUS(V) 'rule' AccuCode(minus(X, var(V))): AccuCode(X) ACCUMINUS(V) 'rule' AccuCode(var(V)): LOADACCU(V)(The specification is still incomplete because we only consider the case where the second operand of plus and minus is a variable. If it were be a more complex expression, we would have to introduce temporary variables.)