Skip to content

Commit e17f43a

Browse files
committed
Eksami alusosa harjutuse lahendus
1 parent b74bd8e commit e17f43a

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package proovieksam;
2+
3+
import proovieksam.ast.*;
4+
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.NoSuchElementException;
9+
10+
import static proovieksam.ast.EstologNode.*;
11+
12+
public class EstologEvaluator {
13+
private final Map<String, Boolean> env = new HashMap<>();
14+
15+
public static boolean eval(EstologProg prog) {
16+
EstologEvaluator estologEvaluator = new EstologEvaluator();
17+
return estologEvaluator.evalNode(prog);
18+
}
19+
20+
private boolean evalNode(EstologNode node) {
21+
return switch (node) {
22+
case EstologLiteraal(boolean value) -> value;
23+
case EstologMuutuja(String nimi) -> {
24+
Boolean value = env.get(nimi);
25+
if (value == null)
26+
throw new NoSuchElementException("Undefined variable " + nimi);
27+
else
28+
yield value;
29+
}
30+
case EstologJa(EstologNode left, EstologNode right) ->
31+
evalNode(left) && evalNode(right);
32+
case EstologVoi(EstologNode left, EstologNode right) ->
33+
evalNode(left) || evalNode(right);
34+
case EstologVordus(EstologNode left, EstologNode right) ->
35+
evalNode(left) == evalNode(right);
36+
case EstologKui(EstologNode kui, EstologNode siis, EstologNode muidu) -> {
37+
if (evalNode(kui)) {
38+
yield evalNode(siis);
39+
}
40+
else if (muidu != null) {
41+
yield evalNode(muidu);
42+
}
43+
else {
44+
yield true; // kui MUIDU avaldis on puudu, tagastame true
45+
}
46+
}
47+
case EstologDef(String nimi, EstologNode avaldis) -> {
48+
env.put(nimi, evalNode(avaldis));
49+
yield false; // ei kasutata
50+
}
51+
case EstologProg(EstologNode avaldis, List<EstologDef> defs) -> {
52+
for (EstologDef def : defs)
53+
evalNode(def);
54+
yield evalNode(avaldis);
55+
}
56+
};
57+
}
58+
59+
static void main() {
60+
EstologProg prog = prog(
61+
kui(vordus(var("x"), var("y")), var("a"), var("b")),
62+
63+
def("x", lit(false)),
64+
def("y", lit(true)),
65+
def("a", ja(var("x"), var("y"))),
66+
def("b", voi(var("x"), var("y")))
67+
);
68+
69+
System.out.println(prog);
70+
System.out.println(eval(prog));
71+
}
72+
}

0 commit comments

Comments
 (0)