From 0aeff1a757908bdc8972bca20330752858cbb903 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Fri, 16 Aug 2024 23:29:12 +0300 Subject: Big Refactoring, added support for comments --- .../java/lv/enes/orang/ast/ArrayExpression.java | 12 +++++++ .../java/lv/enes/orang/ast/BinaryExpression.java | 38 ++++++++++++++++++++++ .../java/lv/enes/orang/ast/BooleanLiteral.java | 10 ++++++ .../java/lv/enes/orang/ast/CallExpression.java | 10 ++++++ ast/src/main/java/lv/enes/orang/ast/DefSpec.java | 6 ++++ .../main/java/lv/enes/orang/ast/Definition.java | 10 ++++++ .../main/java/lv/enes/orang/ast/DoExpression.java | 14 ++++++++ .../main/java/lv/enes/orang/ast/Expression.java | 7 ++++ .../lv/enes/orang/ast/ExpressionStatement.java | 10 ++++++ .../java/lv/enes/orang/ast/ExpressionVisitor.java | 22 +++++++++++++ .../main/java/lv/enes/orang/ast/FnExpression.java | 11 +++++++ .../java/lv/enes/orang/ast/IfElseExpression.java | 10 ++++++ .../main/java/lv/enes/orang/ast/IntLiteral.java | 10 ++++++ .../java/lv/enes/orang/ast/LetInExpression.java | 14 ++++++++ ast/src/main/java/lv/enes/orang/ast/Program.java | 12 +++++++ ast/src/main/java/lv/enes/orang/ast/Statement.java | 7 ++++ .../java/lv/enes/orang/ast/StatementVisitor.java | 13 ++++++++ .../main/java/lv/enes/orang/ast/StringLiteral.java | 10 ++++++ .../java/lv/enes/orang/ast/UnaryExpression.java | 16 +++++++++ .../java/lv/enes/orang/ast/VariableExpression.java | 10 ++++++ ast/src/main/java/module-info.java | 6 ++++ 21 files changed, 258 insertions(+) create mode 100644 ast/src/main/java/lv/enes/orang/ast/ArrayExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/BinaryExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/BooleanLiteral.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/CallExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/DefSpec.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/Definition.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/DoExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/Expression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/ExpressionStatement.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/FnExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/IfElseExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/IntLiteral.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/LetInExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/Program.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/Statement.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/StatementVisitor.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/StringLiteral.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/UnaryExpression.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/VariableExpression.java create mode 100644 ast/src/main/java/module-info.java (limited to 'ast/src/main/java') 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +import java.util.List; + +public record ArrayExpression(List items) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitArray(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record BinaryExpression(Operator operator, Expression lhs, Expression rhs) implements Expression { + public enum Operator { + EQUALS, + NOT_EQUALS, + GT, + GTE, + LT, + LTE, + ADD, + SUBTRACT, + MULTIPLY, + DIVIDE, + ; + + public boolean bindsStrongerThan(Operator other) { + return switch (this) { + case EQUALS, NOT_EQUALS, GT, GTE, LT, LTE -> false; + case ADD, SUBTRACT -> switch (other) { + case EQUALS, NOT_EQUALS, GT, GTE, LTE -> true; + default -> false; + }; + case MULTIPLY, DIVIDE -> switch (other) { + case EQUALS, NOT_EQUALS, GT, GTE, LT, LTE, ADD, SUBTRACT -> true; + default -> false; + }; + }; + } + } + + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitBinaryExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record BooleanLiteral(boolean value) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitBoolean(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record CallExpression(Expression callee, Expression arg) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitCallExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import java.util.List; + +public record DefSpec(String name, List args) { +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record Definition(String name, Expression body) implements Statement { + @Override + public R accept(StatementVisitor visitor) throws E { + return visitor.visitDefinition(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +import java.util.List; + +public record DoExpression(List body) implements Expression { + // assert body.!isEmpty() + + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitDoExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public interface Expression { + R accept(ExpressionVisitor visitor) throws E; +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record ExpressionStatement(Expression expr) implements Statement { + @Override + public R accept(StatementVisitor visitor) throws E { + return visitor.visitExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public interface ExpressionVisitor { + default R visit(Expression expression) throws E { + return expression.accept(this); + } + + R visitArray(ArrayExpression array) throws E; + R visitBoolean(BooleanLiteral expr) throws E; + R visitBinaryExpression(BinaryExpression expr) throws E; + R visitCallExpression(CallExpression expr) throws E; + R visitDoExpression(DoExpression expr) throws E; + R visitFnExpression(FnExpression expr) throws E; + R visitIfElseExpression(IfElseExpression expr) throws E; + R visitIntLiteral(IntLiteral expr) throws E; + R visitLetInExpression(LetInExpression expr) throws E; + R visitStringLiteral(StringLiteral expr) throws E; + R visitUnaryExpression(UnaryExpression expr) throws E; + R visitVariable(VariableExpression expr) throws E; +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.utils.NonEmptyList; +import lv.enes.orang.core.OrangException; + +public record FnExpression(NonEmptyList args, Expression body) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitFnExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record IfElseExpression(Expression condition, Expression trueBranch, Expression falseBranch) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitIfElseExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record IntLiteral(int value) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitIntLiteral(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +import java.util.List; + +public record LetInExpression(List bindings, Expression body) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitLetInExpression(this); + } + + public record Binding(String name, Expression value) {} +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +import java.util.List; + +public record Program(List statements) implements Statement { + @Override + public R accept(StatementVisitor visitor) throws E { + return visitor.visitProgram(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public interface Statement { + R accept(StatementVisitor visitor) throws E; +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public interface StatementVisitor { + default R visit(Statement stmt) throws E { + return stmt.accept(this); + } + + R visitDefinition(Definition def) throws E; + R visitExpression(ExpressionStatement expr) throws E; + R visitProgram(Program program) throws E; +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record StringLiteral(String value) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitStringLiteral(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record UnaryExpression(Operator operator, Expression child) implements Expression { + public enum Operator { + PLUS, + NEGATE, + NOT, + } + + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitUnaryExpression(this); + } +} 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 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record VariableExpression(String name) implements Expression { + @Override + public R accept(ExpressionVisitor visitor) throws E { + return visitor.visitVariable(this); + } +} 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 @@ +module lv.enes.orang.ast { + exports lv.enes.orang.ast; + + requires lv.enes.orang.core; + requires lv.enes.orang.utils; +} \ No newline at end of file -- cgit v1.2.3