diff options
| author | 2024-08-24 03:54:25 +0800 | |
|---|---|---|
| committer | 2024-08-24 03:54:25 +0800 | |
| commit | 16a20ee8b08df919e93ea1b878013f9a2ad709fa (patch) | |
| tree | 80d59e93c566ddba1e2116e8d64222b8036b216e /ast | |
| parent | Add tuples. (diff) | |
| download | orang-16a20ee8b08df919e93ea1b878013f9a2ad709fa.tar.gz orang-16a20ee8b08df919e93ea1b878013f9a2ad709fa.tar.xz orang-16a20ee8b08df919e93ea1b878013f9a2ad709fa.zip | |
Added fancier tuple argument specs.
Made ArgSpec use visitor pattern to avoid problems the best way.
Merged empty tuple and non-empty tuple classes.
Diffstat (limited to 'ast')
8 files changed, 54 insertions, 53 deletions
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java index 8fa52be..fd1c8f9 100644 --- a/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java | |||
| @@ -1,39 +1,7 @@ | |||
| 1 | package lv.enes.orang.ast; | 1 | package lv.enes.orang.ast; |
| 2 | 2 | ||
| 3 | public sealed interface ArgSpec { | 3 | import lv.enes.orang.core.OrangException; |
| 4 | enum Type { | ||
| 5 | IGNORED, | ||
| 6 | NOTHING, | ||
| 7 | NAMED, | ||
| 8 | } | ||
| 9 | 4 | ||
| 10 | Type getType(); | 5 | public interface ArgSpec { |
| 11 | 6 | <R, E extends OrangException> R accept(ArgSpecVisitor<R, E> visitor) throws E; | |
| 12 | static Ignored ignored() { | ||
| 13 | return Ignored.INSTANCE; | ||
| 14 | } | ||
| 15 | |||
| 16 | static Named named(String name) { | ||
| 17 | return new Named(name); | ||
| 18 | } | ||
| 19 | |||
| 20 | static Nothing nothing() { | ||
| 21 | return Nothing.INSTANCE; | ||
| 22 | } | ||
| 23 | |||
| 24 | final class Ignored implements ArgSpec { | ||
| 25 | public static final Ignored INSTANCE = new Ignored(); | ||
| 26 | private Ignored() {} | ||
| 27 | @Override public Type getType() { return Type.IGNORED; } | ||
| 28 | } | ||
| 29 | |||
| 30 | record Named(String name) implements ArgSpec { | ||
| 31 | @Override public Type getType() { return Type.NAMED; } | ||
| 32 | } | ||
| 33 | |||
| 34 | final class Nothing implements ArgSpec { | ||
| 35 | public static final Nothing INSTANCE = new Nothing(); | ||
| 36 | private Nothing() {} | ||
| 37 | @Override public Type getType() { return Type.NOTHING; } | ||
| 38 | } | ||
| 39 | } | 7 | } |
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java new file mode 100644 index 0000000..95ad114 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public final class ArgSpecIgnored implements ArgSpec { | ||
| 6 | public static final ArgSpecIgnored INSTANCE = new ArgSpecIgnored(); | ||
| 7 | private ArgSpecIgnored() {} | ||
| 8 | |||
| 9 | @Override | ||
| 10 | public <R, E extends OrangException> R accept(ArgSpecVisitor<R, E> visitor) throws E { | ||
| 11 | return visitor.visitIgnored(); | ||
| 12 | } | ||
| 13 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java new file mode 100644 index 0000000..7c83275 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public record ArgSpecNamed(String name) implements ArgSpec { | ||
| 6 | @Override | ||
| 7 | public <R, E extends OrangException> R accept(ArgSpecVisitor<R, E> visitor) throws E { | ||
| 8 | return visitor.visitNamed(this); | ||
| 9 | } | ||
| 10 | } | ||
| 11 | |||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java new file mode 100644 index 0000000..6703def --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.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 ArgSpecTuple(List<ArgSpec> children) implements ArgSpec { | ||
| 8 | @Override | ||
| 9 | public <R, E extends OrangException> R accept(ArgSpecVisitor<R, E> visitor) throws E { | ||
| 10 | return visitor.visitTuple(this); | ||
| 11 | } | ||
| 12 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java new file mode 100644 index 0000000..33cb6d6 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public interface ArgSpecVisitor<R, E extends OrangException> { | ||
| 6 | default R visit(ArgSpec argSpec) throws E { | ||
| 7 | return argSpec.accept(this); | ||
| 8 | } | ||
| 9 | |||
| 10 | R visitIgnored() throws E; | ||
| 11 | R visitNamed(ArgSpecNamed named) throws E; | ||
| 12 | R visitTuple(ArgSpecTuple tuple) throws E; | ||
| 13 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java b/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java deleted file mode 100644 index a96580f..0000000 --- a/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | package lv.enes.orang.ast; | ||
| 2 | |||
| 3 | import lv.enes.orang.core.OrangException; | ||
| 4 | |||
| 5 | public final class EmptyTupleLiteral implements Expression { | ||
| 6 | public static final EmptyTupleLiteral INSTANCE = new EmptyTupleLiteral(); | ||
| 7 | |||
| 8 | private EmptyTupleLiteral() {} | ||
| 9 | |||
| 10 | @Override | ||
| 11 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | ||
| 12 | return visitor.visitEmptyTupleExpression(); | ||
| 13 | } | ||
| 14 | } | ||
diff --git a/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java index c32b429..226b340 100644 --- a/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java +++ b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java | |||
| @@ -12,7 +12,6 @@ public interface ExpressionVisitor<R, E extends OrangException> { | |||
| 12 | R visitBinaryExpression(BinaryExpression expr) throws E; | 12 | R visitBinaryExpression(BinaryExpression expr) throws E; |
| 13 | R visitCallExpression(CallExpression expr) throws E; | 13 | R visitCallExpression(CallExpression expr) throws E; |
| 14 | R visitDoExpression(DoExpression expr) throws E; | 14 | R visitDoExpression(DoExpression expr) throws E; |
| 15 | R visitEmptyTupleExpression() throws E; | ||
| 16 | R visitFnExpression(FnExpression expr) throws E; | 15 | R visitFnExpression(FnExpression expr) throws E; |
| 17 | R visitIfElseExpression(IfElseExpression expr) throws E; | 16 | R visitIfElseExpression(IfElseExpression expr) throws E; |
| 18 | R visitIntLiteral(IntLiteral expr) throws E; | 17 | R visitIntLiteral(IntLiteral expr) throws E; |
diff --git a/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java b/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java index 9df418d..84f2ceb 100644 --- a/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java +++ b/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java | |||
| @@ -1,11 +1,10 @@ | |||
| 1 | package lv.enes.orang.ast; | 1 | package lv.enes.orang.ast; |
| 2 | 2 | ||
| 3 | import lv.enes.orang.core.OrangException; | 3 | import lv.enes.orang.core.OrangException; |
| 4 | import lv.enes.orang.utils.NonEmptyList; | ||
| 5 | 4 | ||
| 6 | public record TupleExpression(NonEmptyList<Expression> children) implements Expression { | 5 | import java.util.List; |
| 7 | // assert children.size() >= 2 | ||
| 8 | 6 | ||
| 7 | public record TupleExpression(List<Expression> children) implements Expression { | ||
| 9 | @Override | 8 | @Override |
| 10 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { | 9 | public <R, E extends OrangException> R accept(ExpressionVisitor<R, E> visitor) throws E { |
| 11 | return visitor.visitTupleExpression(this); | 10 | return visitor.visitTupleExpression(this); |