From e897791330f0b36d61cd85ab5a1015d6194a35de Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sat, 24 Aug 2024 04:18:28 +0800 Subject: Added array access. --- evaluator/src/main/java/lv/enes/orang/evaluator/Array.java | 12 ++++++++++++ .../src/main/java/lv/enes/orang/evaluator/Evaluator.java | 7 +++++++ evaluator/src/main/java/lv/enes/orang/evaluator/Value.java | 5 +++++ 3 files changed, 24 insertions(+) (limited to 'evaluator/src') 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 @@ -50,6 +50,18 @@ public record Array(List items) implements Value { } } + @Override + public Value arrayAccess(Value idx) throws OrangRuntimeException { + if (idx instanceof OrangInteger(var i)) { + if (i < 0 || i >= items.size()) { + throw new OrangRuntimeException(STR."Index out of bounds: \{i} not in [0;\{items.size()})"); + } + return items.get(i); + } else { + throw new OrangRuntimeException(STR."array access not implemented for Array and \{idx.typeName()}"); + } + } + @Override public Value multiply(Value rhs) throws OrangRuntimeException { if (rhs instanceof OrangInteger(var 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 @@ -23,6 +23,13 @@ public record Evaluator(Map scope, Value lastResult) implements E return new Array(Collections.unmodifiableList(values)); } + @Override + public Value visitArrayAccess(ArrayAccessExpression arrayAccess) throws OrangRuntimeException { + var array = visit(arrayAccess.array()); + var index = visit(arrayAccess.index()); + return array.arrayAccess(index); + } + @Override public Value visitBinaryExpression(BinaryExpression expr) throws OrangRuntimeException { var lhs = visit(expr.lhs()); 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 } + default Value arrayAccess(Value idx) throws OrangRuntimeException { + throw new OrangRuntimeException(STR."array access is not implemented for \{typeName()}"); + } + + default Value negate() throws OrangRuntimeException { throw new OrangRuntimeException(STR."negate is not implemented for \{typeName()}"); } -- cgit v1.2.3