@@ -17,17 +17,49 @@ let bool_of_int i = i <> 0
1717 Vihje: mod operaator.
1818 Vihje: int_of_bool. *)
1919let eval_binary (l : int ) (b : binary ) (r : int ): int =
20- failwith " TODO"
20+ match b with
21+ | Add -> l + r
22+ | Sub -> l - r
23+ | Mul -> l * r
24+ | Div -> l / r
25+ | Mod -> l mod r
26+ | Eq -> int_of_bool (l = r)
27+ | Ne -> int_of_bool (l <> r)
28+ | Lt -> int_of_bool (l < r)
29+ | Le -> int_of_bool (l < = r)
30+ | Gt -> int_of_bool (l > r)
31+ | Ge -> int_of_bool (l > = r)
2132
2233(* * Väärtustab avaldise keskkonnas ja oraakliga.
2334 NB! Väärtustamise järjekord on oluline.
2435 Vihje: eval_binary. *)
2536let rec eval_expr (env : env ) (oracle : oracle ) (expr : expr ): int =
26- failwith " TODO"
37+ match expr with
38+ | Num i -> i
39+ | Var x -> Env. find x env
40+ | Rand (l , r ) -> oracle (l, r)
41+ | Binary (l , b , r ) ->
42+ let li = eval_expr env oracle l in
43+ let ri = eval_expr env oracle r in
44+ eval_binary li b ri
2745
2846(* * Väärtustab lause keskkonnas ja oraakliga.
2947 Vihje: Vea jaoks kasuta failwith funktsiooni.
3048 Vihje: bool_of_int.
3149 Vihje: While jaoks kasuta rekursiooni. *)
3250let rec eval_stmt (env : env ) (oracle : oracle ) (stmt : stmt ): env =
33- failwith " TODO"
51+ match stmt with
52+ | Nop -> env
53+ | Assign (x , e ) -> Env. add x (eval_expr env oracle e) env
54+ | Error -> failwith " eval_stmt: Error"
55+ | Seq (a , b ) -> eval_stmt (eval_stmt env oracle a) oracle b
56+ | If (c , t , f ) ->
57+ if bool_of_int (eval_expr env oracle c) then
58+ eval_stmt env oracle t
59+ else
60+ eval_stmt env oracle f
61+ | While (c , b ) ->
62+ if bool_of_int (eval_expr env oracle c) then
63+ eval_stmt (eval_stmt env oracle b) oracle stmt
64+ else
65+ env
0 commit comments