summaryrefslogtreecommitdiff
path: root/ast/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/ArrayExpression.java12
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java (renamed from src/main/java/lv/enes/orang/ast/BinaryExpression.java)21
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/BooleanLiteral.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/CallExpression.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/DefSpec.java (renamed from src/main/java/lv/enes/orang/ast/DefSpec.java)0
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/Definition.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/DoExpression.java14
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/Expression.java7
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/ExpressionStatement.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java22
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/FnExpression.java11
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/IfElseExpression.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/IntLiteral.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/LetInExpression.java14
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/Program.java12
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/Statement.java7
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/StatementVisitor.java13
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/StringLiteral.java10
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/UnaryExpression.java16
-rw-r--r--ast/src/main/java/lv/enes/orang/ast/VariableExpression.java10
-rw-r--r--ast/src/main/java/module-info.java6
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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5import java.util.List;
6
7public 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 @@
1package lv.enes.orang.ast; 1package lv.enes.orang.ast;
2 2
3import lv.enes.orang.OrangRuntimeException; 3import lv.enes.orang.core.OrangException;
4import lv.enes.orang.Scope;
5import lv.enes.orang.value.Value;
6 4
7public record BinaryExpression(Operator operator, Expression lhs, Expression rhs) implements Expression { 5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5import java.util.List;
6
7public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.utils.NonEmptyList;
4import lv.enes.orang.core.OrangException;
5
6public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5import java.util.List;
6
7public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5import java.util.List;
6
7public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public 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 @@
1module 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