-- =========================================================== --> CafeOBJ codes for lecture 4 -- =========================================================== -- -- See misc.mod, ast.mod, interpreter.mod, vm.mod -- and compiler.mod in the sub directory of /minila -- -- -- loads necessary files -- in minila/misc in minila/ast in minila/interpreter in minila/vm -- -- Quick Reminder -- open INTERPRETER 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 interpret(p1) . close open VM op cl1 : -> CList . eq cl1 = push(1) | store(v(0)) | push(1) | store(v(1)) | load(v(1)) | push(10) | equal | load(v(1)) | push(10) | lessThan | or | jumpOnCond(2) | jump(10) | load(v(1)) | load(v(0)) | multiply | store(v(0)) | load(v(1)) | push(1) | add | store(v(1)) | bjump(17) | quit | clnil . red vm(cl1) . close -- -- Interpretation of Expressions -- open INTERPRETER op env : -> Env . eq env = update(v(1),8,update(v(0),3,empEnv)) . red evalExp(1,env) . red evalExp(v(0),env) . red evalExp(v(1),env) . red evalExp(v(2),env) . red evalExp(v(1) ++ v(0),env) . red evalExp(v(1) -- v(0),env) . red evalExp(v(1) ** v(0),env) . red evalExp(v(1) // v(0),env) . red evalExp(v(1) %% v(0),env) . red evalExp(v(1) === v(0),env) . red evalExp(v(1) !== v(0),env) . red evalExp(v(1) << v(0),env) . red evalExp(v(1) >> v(0),env) . red evalExp(v(1) >> v(0) && v(1) === v(0),env) . red evalExp(v(1) >> v(0) || v(1) === v(0),env) . close -- -- Interpretation of Statements -- open INTERPRETER op env : -> Env . eq env = update(v(1),8,update(v(0),3,empEnv)) . red eval(estm,env) . red eval(v(0) := 5 ;,env) . red eval(v(2) := 5 ;,env) . red eval(if v(0) === v(1) then v(0) := 0 ; else v(0) := v(1) ; fi,env) . -- red eval(if v(1) %% v(0) === 2 -- then v(0) := 0 ; else v(0) := v(1) ; fi,env) . red eval(v(3) := 0 ; v(2) := v(0) ; while v(2) << v(1) || v(2) === v(1) do v(3) := v(3) ++ v(2) ; v(2) := v(2) ++ 1 ; od, env) . -- red eval(v(3) := 0 ; <-- A space SHOULD be inserted between 0 and ;. -- for v(2) v(0) v(1) do -- v(3) := v(3) ++ v(2) ; -- od, env) . close -- -- Virtual Machine -- open VM op env : -> Env . eq env = update(v(1),8,update(v(0),3,empEnv)) . red exec(quit | clnil,0,empstk,env) . red exec(push(5) | store(v(0)) | quit | clnil,0,empstk,env) . red exec(push(5) | store(v(2)) | quit | clnil,0,empstk,env) . red exec(load(v(0)) | load(v(1)) | equal | jumpOnCond(2) | jump(4) | push(0) | store(v(0)) | jump(3) | load(v(1)) | store(v(0)) | quit | clnil ,0,empstk,env) . red exec(push(0) | store(v(3)) | load(v(0)) | store(v(2)) | load(v(2)) | load(v(1)) | lessThan | load(v(2)) | load(v(1)) | equal | or | jumpOnCond(2) | jump(10) | load(v(3)) | load(v(2)) | add | store(v(3)) | load(v(2)) | push(1) | add | store(v(2)) | bjump(17) | quit | clnil, 0,empstk,env) . close -- =========================================================== -- end end end -- ===========================================================