Skip to content

Commit 48869a4

Browse files
committed
Lahenda eval praktikumis
1 parent 2a94262 commit 48869a4

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/eval/concrete.ml

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,51 @@ let bool_of_int i = i <> 0
1717
Vihje: mod operaator.
1818
Vihje: int_of_bool. *)
1919
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)
2132

2233
(** Väärtustab avaldise keskkonnas ja oraakliga.
2334
NB! Väärtustamise järjekord on oluline.
2435
Vihje: eval_binary. *)
2536
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
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. *)
3250
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

Comments
 (0)