
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.)