summaryrefslogtreecommitdiff
path: root/ast/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'ast/src/main')
-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.java38
-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.java6
-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, 258 insertions, 0 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/ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java b/ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java
new file mode 100644
index 0000000..fb8bac5
--- /dev/null
+++ b/ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java
@@ -0,0 +1,38 @@
1package lv.enes.orang.ast;
2
3import lv.enes.orang.core.OrangException;
4
5public record BinaryExpression(Operator operator, Expression lhs, Expression rhs) implements Expression {
6 public enum Operator {
7 EQUALS,
8 NOT_EQUALS,
9 GT,
10 GTE,
11 LT,
12 LTE,
13 ADD,
14 SUBTRACT,
15 MULTIPLY,
16 DIVIDE,
17 ;
18
19 public boolean bindsStrongerThan(Operator other) {
20 return switch (this) {
21 case EQUALS, NOT_EQUALS, GT, GTE, LT, LTE -> false;
22 case ADD, SUBTRACT -> switch (other) {
23 case EQUALS, NOT_EQUALS, GT, GTE, LTE -> true;
24 default -> false;
25 };
26 case MULTIPLY, DIVIDE -> switch (other) {
27 case EQUALS, NOT_EQUALS, GT, GTE, LT, LTE, ADD, SUBTRACT -> true;
28 default -> false;
29 };
30 };
31 }
32 }
33
34 @Override
35 public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E {
36 return visitor.visitBinaryExpression(this);
37 }
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/ast/src/main/java/lv/enes/orang/ast/DefSpec.java b/ast/src/main/java/lv/enes/orang/ast/DefSpec.java
new file mode 100644
index 0000000..2233d3f
--- /dev/null
+++ b/ast/src/main/java/lv/enes/orang/ast/DefSpec.java
@@ -0,0 +1,6 @@
1package lv.enes.orang.ast;
2
3import java.util.List;
4
5public record DefSpec(String name, List<String> args) {
6}
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