-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReiInterpreter.java
More file actions
83 lines (71 loc) · 2.11 KB
/
ReiInterpreter.java
File metadata and controls
83 lines (71 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package rei;
import java.util.HashMap;
import java.util.Map;
public class ReiInterpreter implements Expr.Visitor<Integer>, Stmt.Visitor<Void> {
private final Map<String, Integer> environment = new HashMap<>();
public void execute(Stmt stmt) {
stmt.accept(this);
}
@Override
public Void visitPrintStmt(Stmt.Print stmt) {
int value = evaluate(stmt.expression);
System.out.println(value);
return null;
}
@Override
public Void visitAssignStmt(Stmt.Assign stmt) {
int value = evaluate(stmt.value);
environment.put(stmt.name.lexeme, value);
return null;
}
@Override
public Void visitIfStmt(Stmt.If stmt) {
int condition = evaluate(stmt.condition);
if (condition != 0) {
execute(stmt.thenBranch);
} else if (stmt.elseBranch != null) {
execute(stmt.elseBranch);
}
return null;
}
@Override
public Void visitBlockStmt(Stmt.Block stmt) {
for (Stmt s : stmt.statements) {
execute(s);
}
return null;
}
private int evaluate(Expr expr) {
return expr.accept(this);
}
@Override
public Integer visitBinaryExpr(Expr.Binary expr) {
int left = evaluate(expr.left);
int right = evaluate(expr.right);
return switch (expr.operator) {
case "+" -> left + right;
case "-" -> left - right;
case "*" -> left * right;
case "/" -> left / right;
case ">" -> (left > right) ? 1 : 0;
case "<" -> (left < right) ? 1 : 0;
default -> 0;
};
}
@Override
public Integer visitLiteralExpr(Expr.Literal expr) {
return expr.value;
}
@Override
public Integer visitVariableExpr(Expr.Variable expr) {
return environment.getOrDefault(expr.name.lexeme, 0);
}
@Override
public Integer visitUnaryExpr(Expr.Unary expr) {
int right = evaluate(expr.right);
return switch (expr.operator.type) {
case MINUS -> -right;
default -> right;
};
}
}