diff options
Diffstat (limited to 'ast/src/main/java')
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 @@ | |||
| 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/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 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 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/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 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import java.util.List; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 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 | ||