diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-09-29 20:14:34 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-09-29 20:14:34 +0100 |
| commit | ccac9247fe4663874be8026ab9cc968ecec7157b (patch) | |
| tree | 6e15ebf9eb130034c45f84372ce4d3776f401328 /src/main/java/org/zwobble/couscous/ast | |
Initial commit
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
14 files changed, 180 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/Assignment.java b/src/main/java/org/zwobble/couscous/ast/Assignment.java new file mode 100644 index 0000000..aa7f89b --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/Assignment.java @@ -0,0 +1,16 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; + +import lombok.Value; + +@Value +public class Assignment implements ExpressionNode { + VariableReferenceNode target; + ExpressionNode value; + + @Override + public <T> T accept(ExpressionNodeVisitor<T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/CallNode.java b/src/main/java/org/zwobble/couscous/ast/CallNode.java new file mode 100644 index 0000000..d71c891 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/CallNode.java @@ -0,0 +1,5 @@ +package org.zwobble.couscous.ast; + +public class CallNode { + +} diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java new file mode 100644 index 0000000..ffa5165 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java @@ -0,0 +1,14 @@ +package org.zwobble.couscous.ast; + +import java.util.List; + +import lombok.Builder; +import lombok.Singular; +import lombok.Value; + +@Builder +@Value +public class ClassNode { + @Singular + List<MethodNode> methods; +} diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java new file mode 100644 index 0000000..097377a --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java @@ -0,0 +1,7 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; + +public interface ExpressionNode { + <T> T accept(ExpressionNodeVisitor<T> visitor); +} diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java new file mode 100644 index 0000000..ec04663 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java @@ -0,0 +1,15 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.StatementNodeVisitor; + +import lombok.Value; + +@Value +public class ExpressionStatementNode implements StatementNode { + ExpressionNode expression; + + @Override + public <T> T accept(StatementNodeVisitor<T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java new file mode 100644 index 0000000..da3a838 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java @@ -0,0 +1,9 @@ +package org.zwobble.couscous.ast; + +import lombok.Value; + +@Value +public class FormalArgumentNode implements VariableNode { + int id; + String name; +} diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java new file mode 100644 index 0000000..38688d8 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -0,0 +1,26 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; +import org.zwobble.couscous.values.IntegerValue; +import org.zwobble.couscous.values.InterpreterValue; +import org.zwobble.couscous.values.StringValue; + +import lombok.Value; + +@Value +public class LiteralNode implements ExpressionNode { + public static LiteralNode of(String value) { + return new LiteralNode(new StringValue(value)); + } + + public static LiteralNode of(int value) { + return new LiteralNode(new IntegerValue(value)); + } + + InterpreterValue value; + + @Override + public <T> T accept(ExpressionNodeVisitor<T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java new file mode 100644 index 0000000..91acbd5 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -0,0 +1,22 @@ +package org.zwobble.couscous.ast; + +import java.util.List; + +import lombok.Builder; +import lombok.Singular; +import lombok.Value; + +@Builder +@Value +public class MethodNode { + public static MethodNodeBuilder staticMethod(String name) { + return builder().isStatic(true).name(name); + } + + boolean isStatic; + String name; + @Singular + List<FormalArgumentNode> arguments; + @Singular("statement") + List<StatementNode> body; +} diff --git a/src/main/java/org/zwobble/couscous/ast/ReturnNode.java b/src/main/java/org/zwobble/couscous/ast/ReturnNode.java new file mode 100644 index 0000000..529dbb5 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/ReturnNode.java @@ -0,0 +1,15 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.StatementNodeVisitor; + +import lombok.Value; + +@Value +public class ReturnNode implements StatementNode { + ExpressionNode value; + + @Override + public <T> T accept(StatementNodeVisitor<T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/StatementNode.java b/src/main/java/org/zwobble/couscous/ast/StatementNode.java new file mode 100644 index 0000000..773420e --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/StatementNode.java @@ -0,0 +1,7 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.StatementNodeVisitor; + +public interface StatementNode { + <T> T accept(StatementNodeVisitor<T> visitor); +} diff --git a/src/main/java/org/zwobble/couscous/ast/VariableNode.java b/src/main/java/org/zwobble/couscous/ast/VariableNode.java new file mode 100644 index 0000000..4c689c5 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/VariableNode.java @@ -0,0 +1,5 @@ +package org.zwobble.couscous.ast; + +public interface VariableNode { + int getId(); +} diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java new file mode 100644 index 0000000..536a7c3 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java @@ -0,0 +1,19 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; + +import lombok.Value; + +@Value +public class VariableReferenceNode implements ExpressionNode { + public static VariableReferenceNode reference(VariableNode variable) { + return new VariableReferenceNode(variable.getId()); + } + + int referentId; + + @Override + public <T> T accept(ExpressionNodeVisitor<T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java new file mode 100644 index 0000000..0167abc --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java @@ -0,0 +1,11 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.Assignment; +import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.VariableReferenceNode; + +public interface ExpressionNodeVisitor<T> { + T visit(LiteralNode literal); + T visit(VariableReferenceNode variableReference); + T visit(Assignment assignment); +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java new file mode 100644 index 0000000..6cec404 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java @@ -0,0 +1,9 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.ExpressionStatementNode; +import org.zwobble.couscous.ast.ReturnNode; + +public interface StatementNodeVisitor<T> { + T visit(ReturnNode returnNode); + T visit(ExpressionStatementNode expressionStatement); +} |
