Compiler Generation Using Denotational Semantics