-- =========================================================== --> CafeOBJ codes for lecture 3 -- =========================================================== -- -- See misc.mod, ast.mod, interpreter.mod, vm.mod -- and compiler.mod in the sub directory of /minila -- -- -- loads the necessary file. -- in minila/misc -- -- Abstract Syntax for Minila -- -- -- Expressions -- mod! EXP { pr(NAT) pr(VAR) [Nat Var < Exp] op _**_ : Exp Exp -> Exp {constr l-assoc prec: 29} op _//_ : Exp Exp -> Exp {constr l-assoc prec: 29} op _%%_ : Exp Exp -> Exp {constr l-assoc prec: 29} op _++_ : Exp Exp -> Exp {constr l-assoc prec: 30} op _--_ : Exp Exp -> Exp {constr l-assoc prec: 30} op _===_ : Exp Exp -> Exp {constr prec: 40} op _!==_ : Exp Exp -> Exp {constr prec: 40} op _<<_ : Exp Exp -> Exp {constr prec: 40} op _>>_ : Exp Exp -> Exp {constr prec: 40} op _&&_ : Exp Exp -> Exp {constr l-assoc prec: 50} op _||_ : Exp Exp -> Exp {constr l-assoc prec: 50} } open EXP red 3 ++ 4 ** 5 . red v(0) ++ v(1) // 2 . red v(0) -- v(1) %% 2 << 10 || v(0) -- v(1) %% 2 === 10 . close -- -- Statements -- mod! STM { pr(EXP) [Stm] op estm : -> Stm {constr} op _:=_; : Var Exp -> Stm {constr} op if_then_else_fi : Exp Stm Stm -> Stm {constr} op while_do_od : Exp Stm -> Stm {constr} op for_ _ _do_od : Var Exp Exp Stm -> Stm {constr} op _ _ : Stm Stm -> Stm {constr r-assoc prec: 45 id: estm} } open STM 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 p1 . op p2 : -> Stm . eq p2 = v(0) := 1 ; for v(1) 1 10 do v(0) := v(1) ** v(0) ; od . red p2 . op p3 : -> Stm . eq p3 = v(0) := 24 ; v(1) := 30 ; while v(1) !== 0 do v(2) := v(0) %% v(1) ; v(0) := v(1) ; v(1) := v(2) ; od . red p3 . op p4 : -> Stm . eq p4 = v(0) := 200000000 ; v(1) := 0 ; v(2) := v(0) ; while v(1) !== v(2) do if ((v(2) -- v(1)) %% 2) === 0 then v(3) := v(1) ++ (v(2) -- v(1)) // 2 ; else v(3) := v(1) ++ ((v(2) -- v(1)) // 2) ++ 1 ; fi if v(3) ** v(3) >> v(0) then v(2) := v(3) -- 1 ; else v(1) := v(3) ; fi od . red p4 . -- loop invariant of p4: -- ( v(1) << v(2) || v(1) === v(2) ) && -- ( v(1) ** v(1) << v(0) || v(1) ** v(1) === v(0) ) && -- ( v(0) << (v(2) ++ 1) ** (v(2) ++ 1) ) close -- -- Outline of Interpreter -- in minila/misc in minila/ast in minila/interpreter in minila/vm in minila/compiler 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) . op p2 : -> Stm . eq p2 = v(0) := 9999 ; v(1) := 5 ; while v(1) >> 0 do v(0) := v(0) // (v(1) -- 1) ; v(1) := v(1) -- 1 ; od . red interpret(p2) . close -- -- Outline of Compiler -- open COMPILER 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) . op p2 : -> Stm . eq p2 = v(0) := 9999 ; v(1) := 5 ; while v(1) >> 0 do v(0) := v(0) // (v(1) -- 1) ; v(1) := v(1) -- 1 ; od . red compile(p2) . close -- -- Outline of Virtual Machine -- 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) . op cl2 : -> CList . eq cl2 = push(9999) | store(v(0)) | push(5) | store(v(1)) | load(v(1)) | push(0) | greaterThan | jumpOnCond(2) | jump(12) | load(v(0)) | load(v(1)) | push(1) | minus | divide | store(v(0)) | load(v(1)) | push(1) | minus | store(v(1)) | bjump(15) | quit | clnil . red vm(cl2) . close -- =========================================================== -- end end end -- ===========================================================