-- =========================================================== --> CafeOBJ codes for lecture 5 -- =========================================================== -- -- See misc.mod, ast.mod, interpreter.mod, vm.mod -- and compiler.mod in the sub directory of /minila -- -- -- load necessary files. -- in minila/misc in minila/ast in minila/interpreter in minila/vm in minila/compiler -- -- Quick Reminder -- open INTERPRETER + COMPILER + VM op p1 : -> Stm . eq p1 = v(0) := 1 ; v(1) := 1 ; while v(1) << 10 || v(1) === 10 do v(0) := v(0) ** v(1) ; v(1) := v(1) ++ 1 ; od . red compile(p1) . "[-- (push(1) | (store(v(0)) | (push(1) | (store(v(1)) | (load(v(1)) | (push(10) | (lessThan | (load(v(1)) | (push(10) | (equal | (or | (jumpOnCond(2) | (jump(10) | (load(v(0)) | (load(v(1)) | (multiply | (store(v(0)) | (load(v(1)) | (push(1) | (add | (store(v(1)) | (bjump(17) | (quit | clnil))))))))))))))))))))))) --]" red vm(compile(p1)) . red interpret(p1) . red interpret(p1) == vm(compile(p1)) . close -- -- Compilation of Expressions -- open COMPILER red genForExp(3 ++ 4) . red genForExp(v(0) ++ 4) . red genForExp(3 ++ 4 ** 5) . red genForExp(v(0) ++ v(1) << 10 || v(0) ++ v(1) === 10) . close -- -- Compilation of Statements -- open COMPILER red generator(v(0) := 1 ;,clnil) . red generator(v(0) := v(0) ++ 4 ;,clnil) . red generator(v(0) := 3 ++ 4 ** 5 ;,clnil) . red generator(v(0) := v(0) ++ v(1) << 10 || v(0) ++ v(1) === 10 ;,clnil) . close open COMPILER red generator(if 1 then estm else estm fi,clnil) . red generator(if v(0) then v(0) := 0 ; else v(0) := 1 ; fi,clnil) . red generator(if v(0) << v(1) ++ 1 then v(0) := v(0) ++ 1 ; else estm fi,clnil) . close open COMPILER red generator(while 0 do estm od,clnil) . red generator(while v(0) << 10 do v(1) := v(1) ++ v(0) ; od,clnil) . red generator(while v(0) << 9 || v(0) === 10 do v(1) := v(1) ++ v(0) ; od,clnil) . close open COMPILER red generator(for v(0) 0 1 do estm od,clnil) . red generator(for v(0) 0 10 do v(1) := v(1) ++ v(0) ; od,clnil) . red generator(for v(0) v(1) (v(2) ++ v(1)) do v(3) := v(3) ** v(0) ; od, clnil) . close -- =========================================================== -- end end end -- ===========================================================