diff options
Diffstat (limited to 'evaluator/src/main')
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 | } |