@@ -17,17 +17,51 @@ let bool_of_int i = i <> 0
17
17
Vihje: mod operaator.
18
18
Vihje: int_of_bool. *)
19
19
let 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)
21
32
22
33
(* * Väärtustab avaldise keskkonnas ja oraakliga.
23
34
NB! Väärtustamise järjekord on oluline.
24
35
Vihje: eval_binary. *)
25
36
let 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 , u ) -> oracle (l, u)
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
27
45
28
46
(* * Väärtustab lause keskkonnas ja oraakliga.
29
47
Vihje: Vea jaoks kasuta failwith funktsiooni.
30
48
Vihje: bool_of_int.
31
49
Vihje: While jaoks kasuta rekursiooni. *)
32
50
let rec eval_stmt (env : env ) (oracle : oracle ) (stmt : stmt ): env =
33
- failwith " TODO"
51
+ match stmt with
52
+ | Nop -> env
53
+ | Error -> failwith " eval_stmt: Error"
54
+ | Assign (x , e ) ->
55
+ Env. add x (eval_expr env oracle e) env
56
+ | Seq (a , b ) ->
57
+ eval_stmt (eval_stmt env oracle a) oracle b
58
+ | If (c , t , f ) ->
59
+ if bool_of_int (eval_expr env oracle c) then
60
+ eval_stmt env oracle t
61
+ else
62
+ eval_stmt env oracle f
63
+ | While (c , b ) ->
64
+ if bool_of_int (eval_expr env oracle c) then
65
+ eval_stmt (eval_stmt env oracle b) oracle stmt
66
+ else
67
+ env
0 commit comments