summaryrefslogtreecommitdiff
path: root/evaluator/src/main
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-08-24 04:18:28 +0800
committerGravatar Uko Kokņevičs2024-08-24 04:18:28 +0800
commite897791330f0b36d61cd85ab5a1015d6194a35de (patch)
tree8faa8ea7f4c9bcadbccc5af9e6f19ab0b2b1621c /evaluator/src/main
parentAdded fancier tuple argument specs. (diff)
downloadorang-e897791330f0b36d61cd85ab5a1015d6194a35de.tar.gz
orang-e897791330f0b36d61cd85ab5a1015d6194a35de.tar.xz
orang-e897791330f0b36d61cd85ab5a1015d6194a35de.zip
Added array access.
Diffstat (limited to 'evaluator/src/main')
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Array.java12
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java7
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Value.java5
3 files changed, 24 insertions, 0 deletions
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Array.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Array.java
index 4c76eff..ab0d896 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Array.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Array.java
@@ -51,6 +51,18 @@ public record Array(List<Value> items) implements Value {
51 } 51 }
52 52
53 @Override 53 @Override
54 public Value arrayAccess(Value idx) throws OrangRuntimeException {
55 if (idx instanceof OrangInteger(var i)) {
56 if (i < 0 || i >= items.size()) {
57 throw new OrangRuntimeException(STR."Index out of bounds: \{i} not in [0;\{items.size()})");
58 }
59 return items.get(i);
60 } else {
61 throw new OrangRuntimeException(STR."array access not implemented for Array and \{idx.typeName()}");
62 }
63 }
64
65 @Override
54 public Value multiply(Value rhs) throws OrangRuntimeException { 66 public Value multiply(Value rhs) throws OrangRuntimeException {
55 if (rhs instanceof OrangInteger(var repeat)) { 67 if (rhs instanceof OrangInteger(var repeat)) {
56 var newItems = new ArrayList<Value>(items.size() * repeat); 68 var newItems = new ArrayList<Value>(items.size() * repeat);
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
index 1f51b9d..69c03e8 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
@@ -24,6 +24,13 @@ public record Evaluator(Map<String, Value> scope, Value lastResult) implements E
24 } 24 }
25 25
26 @Override 26 @Override
27 public Value visitArrayAccess(ArrayAccessExpression arrayAccess) throws OrangRuntimeException {
28 var array = visit(arrayAccess.array());
29 var index = visit(arrayAccess.index());
30 return array.arrayAccess(index);
31 }
32
33 @Override
27 public Value visitBinaryExpression(BinaryExpression expr) throws OrangRuntimeException { 34 public Value visitBinaryExpression(BinaryExpression expr) throws OrangRuntimeException {
28 var lhs = visit(expr.lhs()); 35 var lhs = visit(expr.lhs());
29 var rhs = visit(expr.rhs()); 36 var rhs = visit(expr.rhs());
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
index 1a1aad6..35af35b 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
@@ -13,6 +13,11 @@ public sealed interface Value
13 } 13 }
14 14
15 15
16 default Value arrayAccess(Value idx) throws OrangRuntimeException {
17 throw new OrangRuntimeException(STR."array access is not implemented for \{typeName()}");
18 }
19
20
16 default Value negate() throws OrangRuntimeException { 21 default Value negate() throws OrangRuntimeException {
17 throw new OrangRuntimeException(STR."negate is not implemented for \{typeName()}"); 22 throw new OrangRuntimeException(STR."negate is not implemented for \{typeName()}");
18 } 23 }