diff options
Diffstat (limited to '')
21 files changed, 217 insertions, 18 deletions
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArrayExpression.java b/ast/src/main/java/lv/enes/orang/ast/ArrayExpression.java new file mode 100644 index 0000000..acd1a36 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArrayExpression.java | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | import java.util.List; | ||
| 6 | |||
| 7 | public record ArrayExpression(List<Expression> items) implements Expression { | ||
| 8 | @Override | ||
| 9 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 10 | return visitor.visitArray(this); | ||
| 11 | } | ||
| 12 | } | ||
diff --git a/src/main/java/lv/enes/orang/ast/BinaryExpression.java b/ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java index c0b988c..fb8bac5 100644 --- a/src/main/java/lv/enes/orang/ast/BinaryExpression.java +++ b/ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | package lv.enes.orang.ast; | 1 | package lv.enes.orang.ast; |
| 2 | 2 | ||
| 3 | import lv.enes.orang.OrangRuntimeException; | 3 | import lv.enes.orang.core.OrangException; |
| 4 | import lv.enes.orang.Scope; | ||
| 5 | import lv.enes.orang.value.Value; | ||
| 6 | 4 | ||
| 7 | public record BinaryExpression(Operator operator, Expression lhs, Expression rhs) implements Expression { | 5 | public record BinaryExpression(Operator operator, Expression lhs, Expression rhs) implements Expression { |
| 8 | public enum Operator { | 6 | public enum Operator { |
| @@ -34,20 +32,7 @@ public record BinaryExpression(Operator operator, Expression lhs, Expression rhs | |||
| 34 | } | 32 | } |
| 35 | 33 | ||
| 36 | @Override | 34 | @Override |
| 37 | public Value evaluateExpression(Scope scope) throws OrangRuntimeException { | 35 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { |
| 38 | var lhs = lhs().evaluateExpression(scope); | 36 | return visitor.visitBinaryExpression(this); |
| 39 | var rhs = rhs().evaluateExpression(scope); | ||
| 40 | return switch (operator) { | ||
| 41 | case EQUALS -> lhs.orangEquals(rhs); | ||
| 42 | case NOT_EQUALS -> lhs.notEquals(rhs); | ||
| 43 | case GT -> lhs.greaterThan(rhs); | ||
| 44 | case GTE -> lhs.greaterThanOrEqual(rhs); | ||
| 45 | case LT -> lhs.lessThan(rhs); | ||
| 46 | case LTE -> lhs.lessThanOrEqual(rhs); | ||
| 47 | case ADD -> lhs.add(rhs); | ||
| 48 | case SUBTRACT -> lhs.subtract(rhs); | ||
| 49 | case MULTIPLY -> lhs.multiply(rhs); | ||
| 50 | case DIVIDE -> lhs.divide(rhs); | ||
| 51 | }; | ||
| 52 | } | 37 | } |
| 53 | } | 38 | } |
diff --git a/ast/src/main/java/lv/enes/orang/ast/BooleanLiteral.java b/ast/src/main/java/lv/enes/orang/ast/BooleanLiteral.java new file mode 100644 index 0000000..16bf176 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/BooleanLiteral.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record BooleanLiteral(boolean value) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitBoolean(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/CallExpression.java b/ast/src/main/java/lv/enes/orang/ast/CallExpression.java new file mode 100644 index 0000000..38ff7bd --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/CallExpression.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record CallExpression(Expression callee, Expression arg) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitCallExpression(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/src/main/java/lv/enes/orang/ast/DefSpec.java b/ast/src/main/java/lv/enes/orang/ast/DefSpec.java index 2233d3f..2233d3f 100644 --- a/src/main/java/lv/enes/orang/ast/DefSpec.java +++ b/ast/src/main/java/lv/enes/orang/ast/DefSpec.java | |||
diff --git a/ast/src/main/java/lv/enes/orang/ast/Definition.java b/ast/src/main/java/lv/enes/orang/ast/Definition.java new file mode 100644 index 0000000..b41cb1f --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/Definition.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record Definition(String name, Expression body) implements Statement { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(StatementVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitDefinition(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/DoExpression.java b/ast/src/main/java/lv/enes/orang/ast/DoExpression.java new file mode 100644 index 0000000..47eaddd --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/DoExpression.java | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | import java.util.List; | ||
| 6 | |||
| 7 | public record DoExpression(List<Expression> body) implements Expression { | ||
| 8 | // assert body.!isEmpty() | ||
| 9 | |||
| 10 | @Override | ||
| 11 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 12 | return visitor.visitDoExpression(this); | ||
| 13 | } | ||
| 14 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/Expression.java b/ast/src/main/java/lv/enes/orang/ast/Expression.java new file mode 100644 index 0000000..a3e2acc --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/Expression.java | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public interface Expression { | ||
| 6 | <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E; | ||
| 7 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ExpressionStatement.java b/ast/src/main/java/lv/enes/orang/ast/ExpressionStatement.java new file mode 100644 index 0000000..2a9dae1 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ExpressionStatement.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record ExpressionStatement(Expression expr) implements Statement { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(StatementVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitExpression(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java new file mode 100644 index 0000000..ddb1157 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public interface ExpressionVisitor<R, E extends OrangException> { | ||
| 6 | default R visit(Expression expression) throws E { | ||
| 7 | return expression.accept(this); | ||
| 8 | } | ||
| 9 | |||
| 10 | R visitArray(ArrayExpression array) throws E; | ||
| 11 | R visitBoolean(BooleanLiteral expr) throws E; | ||
| 12 | R visitBinaryExpression(BinaryExpression expr) throws E; | ||
| 13 | R visitCallExpression(CallExpression expr) throws E; | ||
| 14 | R visitDoExpression(DoExpression expr) throws E; | ||
| 15 | R visitFnExpression(FnExpression expr) throws E; | ||
| 16 | R visitIfElseExpression(IfElseExpression expr) throws E; | ||
| 17 | R visitIntLiteral(IntLiteral expr) throws E; | ||
| 18 | R visitLetInExpression(LetInExpression expr) throws E; | ||
| 19 | R visitStringLiteral(StringLiteral expr) throws E; | ||
| 20 | R visitUnaryExpression(UnaryExpression expr) throws E; | ||
| 21 | R visitVariable(VariableExpression expr) throws E; | ||
| 22 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/FnExpression.java b/ast/src/main/java/lv/enes/orang/ast/FnExpression.java new file mode 100644 index 0000000..68f43af --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/FnExpression.java | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.utils.NonEmptyList; | ||
| 4 | import lv.enes.orang.core.OrangException; | ||
| 5 | |||
| 6 | public record FnExpression(NonEmptyList<String> args, Expression body) implements Expression { | ||
| 7 | @Override | ||
| 8 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 9 | return visitor.visitFnExpression(this); | ||
| 10 | } | ||
| 11 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/IfElseExpression.java b/ast/src/main/java/lv/enes/orang/ast/IfElseExpression.java new file mode 100644 index 0000000..86e48d4 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/IfElseExpression.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record IfElseExpression(Expression condition, Expression trueBranch, Expression falseBranch) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitIfElseExpression(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/IntLiteral.java b/ast/src/main/java/lv/enes/orang/ast/IntLiteral.java new file mode 100644 index 0000000..12333c9 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/IntLiteral.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record IntLiteral(int value) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitIntLiteral(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/LetInExpression.java b/ast/src/main/java/lv/enes/orang/ast/LetInExpression.java new file mode 100644 index 0000000..b292f08 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/LetInExpression.java | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | import java.util.List; | ||
| 6 | |||
| 7 | public record LetInExpression(List<Binding> bindings, Expression body) implements Expression { | ||
| 8 | @Override | ||
| 9 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 10 | return visitor.visitLetInExpression(this); | ||
| 11 | } | ||
| 12 | |||
| 13 | public record Binding(String name, Expression value) {} | ||
| 14 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/Program.java b/ast/src/main/java/lv/enes/orang/ast/Program.java new file mode 100644 index 0000000..9b38f3b --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/Program.java | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | import java.util.List; | ||
| 6 | |||
| 7 | public record Program(List<Statement> statements) implements Statement { | ||
| 8 | @Override | ||
| 9 | public <R, E extends OrangException> R accept(StatementVisitor<R, E> visitor) throws E { | ||
| 10 | return visitor.visitProgram(this); | ||
| 11 | } | ||
| 12 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/Statement.java b/ast/src/main/java/lv/enes/orang/ast/Statement.java new file mode 100644 index 0000000..283fd40 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/Statement.java | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public interface Statement { | ||
| 6 | <R, E extends OrangException> R accept(StatementVisitor<R, E> visitor) throws E; | ||
| 7 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/StatementVisitor.java b/ast/src/main/java/lv/enes/orang/ast/StatementVisitor.java new file mode 100644 index 0000000..fa3b2f6 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/StatementVisitor.java | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public interface StatementVisitor<R, E extends OrangException> { | ||
| 6 | default R visit(Statement stmt) throws E { | ||
| 7 | return stmt.accept(this); | ||
| 8 | } | ||
| 9 | |||
| 10 | R visitDefinition(Definition def) throws E; | ||
| 11 | R visitExpression(ExpressionStatement expr) throws E; | ||
| 12 | R visitProgram(Program program) throws E; | ||
| 13 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/StringLiteral.java b/ast/src/main/java/lv/enes/orang/ast/StringLiteral.java new file mode 100644 index 0000000..5c47b7e --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/StringLiteral.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record StringLiteral(String value) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitStringLiteral(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/UnaryExpression.java b/ast/src/main/java/lv/enes/orang/ast/UnaryExpression.java new file mode 100644 index 0000000..d96ae6d --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/UnaryExpression.java | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record UnaryExpression(Operator operator, Expression child) implements Expression { | ||
| 6 | public enum Operator { | ||
| 7 | PLUS, | ||
| 8 | NEGATE, | ||
| 9 | NOT, | ||
| 10 | } | ||
| 11 | |||
| 12 | @Override | ||
| 13 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 14 | return visitor.visitUnaryExpression(this); | ||
| 15 | } | ||
| 16 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/VariableExpression.java b/ast/src/main/java/lv/enes/orang/ast/VariableExpression.java new file mode 100644 index 0000000..615857b --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/VariableExpression.java | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record VariableExpression(String name) implements Expression { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitVariable(this); | ||
| 9 | } | ||
| 10 | } | ||
diff --git a/ast/src/main/java/module-info.java b/ast/src/main/java/module-info.java new file mode 100644 index 0000000..7ebe37b --- /dev/null +++ b/ast/src/main/java/module-info.java | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | module lv.enes.orang.ast { | ||
| 2 | exports lv.enes.orang.ast; | ||
| 3 | |||
| 4 | requires lv.enes.orang.core; | ||
| 5 | requires lv.enes.orang.utils; | ||
| 6 | } \ No newline at end of file | ||