Skip to content

Commit 7f1d99a

Browse files
committed
week4 alusosa lahendused
1 parent 8fca831 commit 7f1d99a

14 files changed

Lines changed: 1164 additions & 0 deletions
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package toylangs.bolog;
2+
3+
import toylangs.bolog.ast.*;
4+
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
public class BologEvaluator {
9+
private final Set<String> trueVars;
10+
11+
public BologEvaluator(Set<String> trueVars) {
12+
this.trueVars = trueVars;
13+
}
14+
15+
public static boolean eval(BologNode node, Set<String> trueVars) {
16+
BologEvaluator bologEvaluator = new BologEvaluator(trueVars);
17+
return bologEvaluator.eval(node);
18+
}
19+
20+
private boolean eval(BologNode node) {
21+
return switch (node) {
22+
case BologLit(boolean value) -> value;
23+
case BologVar(String name) -> trueVars.contains(name);
24+
case BologNand(BologNode left, BologNode right) -> !(eval(left) && eval(right));
25+
case BologImp(BologNode conclusion, List<BologNode> assumptions) ->
26+
eval(conclusion) || !assumptions.stream().allMatch(this::eval);
27+
};
28+
}
29+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package toylangs.dialoog;
2+
3+
import toylangs.dialoog.ast.*;
4+
5+
import java.util.*;
6+
7+
import static toylangs.dialoog.ast.DialoogNode.*;
8+
9+
public class DialoogEvaluator {
10+
11+
public static class UndeclaredVariableException extends RuntimeException {
12+
public UndeclaredVariableException(String variable) {
13+
super("Variable \"" + variable + "\" has not been declared.");
14+
}
15+
}
16+
17+
private final Map<String, Object> env;
18+
private final HashSet<Object> declarations = new HashSet<>();
19+
20+
public DialoogEvaluator(Map<String, Object> env) {
21+
this.env = env;
22+
}
23+
24+
public static Object eval(DialoogProg prog, Map<String, Object> env) {
25+
DialoogEvaluator dialoogEvaluator = new DialoogEvaluator(env);
26+
return dialoogEvaluator.eval(prog);
27+
}
28+
29+
private Object eval(DialoogNode node) {
30+
return switch (node) {
31+
case DialoogLitInt(int value) -> value;
32+
case DialoogLitBool(boolean value) -> value;
33+
case DialoogVar(String name) -> {
34+
if (declarations.contains(name)) yield env.get(name);
35+
throw new UndeclaredVariableException(name);
36+
}
37+
case DialoogDecl(String name, _) -> {
38+
declarations.add(name);
39+
yield null;
40+
}
41+
case DialoogUnary(DialoogUnary.UnOp op, DialoogNode expr) -> op.toJava().apply(eval(expr));
42+
case DialoogBinary(DialoogBinary.BinOp op, DialoogNode leftExpr, DialoogNode rightExpr) -> {
43+
Object v1 = eval(leftExpr);
44+
Object v2 = eval(rightExpr);
45+
yield op.toJava().apply(v1, v2);
46+
}
47+
case DialoogProg(List<DialoogDecl> decls, DialoogNode expr) -> {
48+
for (DialoogDecl decl : decls)
49+
eval(decl);
50+
yield eval(expr);
51+
}
52+
case DialoogTernary(DialoogNode guardExpr, DialoogNode trueExpr, DialoogNode falseExpr) -> {
53+
Object evaluatedGuardExpr = eval(guardExpr);
54+
assert evaluatedGuardExpr != null;
55+
boolean guard = (boolean) evaluatedGuardExpr;
56+
yield guard ? eval(trueExpr) : eval(falseExpr);
57+
}
58+
};
59+
}
60+
61+
static void main() {
62+
DialoogProg prog = prog(
63+
decls(iv("x"), bv("a")),
64+
ifte(var("a"), var("x"), il(0)));
65+
Map<String, Object> env = new HashMap<>();
66+
env.put("a", true);
67+
env.put("x", 7);
68+
System.out.println(eval(prog, env));
69+
}
70+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package toylangs.hulk;
2+
3+
import toylangs.hulk.ast.*;
4+
5+
import java.util.*;
6+
7+
import static toylangs.hulk.ast.HulkNode.*;
8+
9+
public class HulkEvaluator {
10+
private final Map<Character, Set<Character>> env;
11+
12+
public HulkEvaluator(Map<Character, Set<Character>> initialEnv) {
13+
this.env = new HashMap<>(initialEnv); // teeme koopia, sest initialEnv pole muudetav
14+
}
15+
16+
public static Map<Character, Set<Character>> eval(HulkProg prog, Map<Character, Set<Character>> initialEnv) {
17+
HulkEvaluator hulkEvaluator = new HulkEvaluator(initialEnv);
18+
hulkEvaluator.evalProg(prog);
19+
return hulkEvaluator.env;
20+
}
21+
22+
private void evalProg(HulkProg prog) {
23+
for (HulkStmt stmt : prog.statements()) {
24+
// evalCond haldab tingimuslauseid
25+
if (stmt.cond() == null || evalCond(stmt.cond())) {
26+
Set<Character> elements = evalExpr(stmt.expr());
27+
env.put(stmt.name(), elements);
28+
}
29+
}
30+
}
31+
32+
private Set<Character> evalExpr(HulkExpr node) {
33+
return switch (node) {
34+
case HulkLit(Set<Character> elements) -> elements;
35+
case HulkVar(Character name) -> {
36+
if (env.containsKey(name))
37+
yield env.get(name);
38+
else
39+
throw new NoSuchElementException(name.toString());
40+
}
41+
case HulkBinOp(Character op, HulkExpr left, HulkExpr right) -> {
42+
Set<Character> leftValue = evalExpr(left);
43+
Set<Character> rightValue = evalExpr(right);
44+
assert leftValue != null;
45+
assert rightValue != null;
46+
Set<Character> result = new HashSet<>(leftValue);
47+
switch (op) {
48+
case '+' -> result.addAll(rightValue);
49+
case '-' -> result.removeAll(rightValue);
50+
case '&' -> result.retainAll(rightValue);
51+
}
52+
yield result;
53+
}
54+
};
55+
}
56+
57+
private boolean evalCond(HulkCond cond) {
58+
Set<Character> subset = evalExpr(cond.subset());
59+
Set<Character> superset = evalExpr(cond.superset());
60+
assert superset != null;
61+
assert subset != null;
62+
return superset.containsAll(subset);
63+
}
64+
65+
static void main() {
66+
ArrayList<HulkStmt> laused = new ArrayList<>();
67+
laused.add(stmt('A', lit('a'), null)); // A := {a}
68+
laused.add(stmt('B', lit('b'), null)); // B := {b}
69+
laused.add(stmt('D', binop('+', var('A'), var('B')), null)); // D := (A+B)
70+
HulkProg s = prog(laused);
71+
System.out.println(s);
72+
System.out.println();
73+
74+
Map<Character, Set<Character>> env = new HashMap<>();
75+
eval(s, env);
76+
System.out.println(env); // {A=[a], B=[b], D=[a, b]}
77+
}
78+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package toylangs.imp;
2+
3+
import toylangs.imp.ast.*;
4+
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
public class ImpEvaluator {
10+
private final Map<Character, Integer> env = new HashMap<>();
11+
12+
public static int eval(ImpProg prog) {
13+
ImpEvaluator impEvaluator = new ImpEvaluator();
14+
return impEvaluator.evalNode(prog);
15+
}
16+
17+
private int evalNode(ImpNode node) {
18+
return switch (node) {
19+
case ImpNum(int value) -> value;
20+
case ImpNeg(ImpNode exp) -> -evalNode(exp);
21+
case ImpAdd(ImpNode left, ImpNode right) -> evalNode(left) + evalNode(right);
22+
case ImpDiv(ImpNode numerator, ImpNode denominator) -> evalNode(numerator) / evalNode(denominator);
23+
case ImpVar(char name) -> env.get(name);
24+
case ImpAssign(char name, ImpNode exp) -> {
25+
env.put(name, evalNode(exp));
26+
yield 0; // tegelikkuses pole tagastusväärtust
27+
}
28+
case ImpProg(ImpNode exp, List<ImpAssign> assigns) -> {
29+
for (ImpAssign assign : assigns) {
30+
evalNode(assign); // tagastusväärtust 0 ignoreeritakse
31+
}
32+
yield evalNode(exp);
33+
}
34+
};
35+
}
36+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package toylangs.modul;
2+
3+
import toylangs.modul.ast.*;
4+
5+
import java.util.Map;
6+
7+
public class ModulEvaluator {
8+
private final int m;
9+
private final Map<String, Integer> env;
10+
11+
protected ModulEvaluator(int m, Map<String, Integer> env) {
12+
this.m = m;
13+
this.env = env;
14+
}
15+
16+
public static int eval(ModulProg prog, Map<String, Integer> env) {
17+
ModulEvaluator modulEvaluator = new ModulEvaluator(prog.modulus(), env);
18+
return modulEvaluator.eval(prog.expr());
19+
}
20+
21+
protected int eval(ModulExpr expr) {
22+
int result = switch (expr) {
23+
case ModulNum(int value) -> value;
24+
case ModulVar(String name) -> {
25+
Integer value = env.get(name);
26+
if (value == null)
27+
throw new ModulException();
28+
else
29+
yield value;
30+
}
31+
case ModulNeg(ModulExpr subExpr) -> -eval(subExpr);
32+
case ModulAdd(ModulExpr left, ModulExpr right) -> eval(left) + eval(right);
33+
case ModulMul(ModulExpr left, ModulExpr right) -> eval(left) * eval(right);
34+
case ModulPow(ModulExpr base, int power) -> evalPow(base, power);
35+
};
36+
37+
return normalize(result); // ModulPow korral üleliigne
38+
}
39+
40+
// Eraldi meetod, et ModulMaster saaks taaskasutada.
41+
protected int evalPow(ModulExpr base, int power) {
42+
int baseValue = eval(base);
43+
int result = 1;
44+
for (int i = 0; i < power; i++) {
45+
result = normalize(result * baseValue);
46+
}
47+
return result;
48+
}
49+
50+
/**
51+
* Normaliseerib väärtuse poollõiku [0, m).
52+
*/
53+
protected int normalize(int value) {
54+
return ((value % m) + m) % m; // negatiivsete arvude jaoks keerulisem
55+
}
56+
}

0 commit comments

Comments
 (0)