aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Assignment.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java3
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java13
5 files changed, 21 insertions, 9 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/Assignment.java b/src/main/java/org/zwobble/couscous/ast/Assignment.java
index aa7f89b..d8bdaaf 100644
--- a/src/main/java/org/zwobble/couscous/ast/Assignment.java
+++ b/src/main/java/org/zwobble/couscous/ast/Assignment.java
@@ -2,10 +2,16 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor;
+import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+
import lombok.Value;
@Value
public class Assignment implements ExpressionNode {
+ public static Assignment assign(VariableNode target, ExpressionNode value) {
+ return new Assignment(reference(target), value);
+ }
+
VariableReferenceNode target;
ExpressionNode value;
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index 38688d8..594187d 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -9,7 +9,7 @@ import lombok.Value;
@Value
public class LiteralNode implements ExpressionNode {
- public static LiteralNode of(String value) {
+ public static LiteralNode literal(String value) {
return new LiteralNode(new StringValue(value));
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index ef91916..a3b3871 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.interpreter;
+import java.util.HashMap;
import java.util.Map;
import org.zwobble.couscous.values.InterpreterValue;
@@ -8,7 +9,7 @@ public class Environment {
private Map<Integer, InterpreterValue> stackFrame;
public Environment(Map<Integer, InterpreterValue> stackFrame) {
- this.stackFrame = stackFrame;
+ this.stackFrame = new HashMap<>(stackFrame);
}
public InterpreterValue get(int referentId) {
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 02acbe3..863ccb0 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -10,9 +10,13 @@ import org.zwobble.couscous.values.InterpreterValue;
import lombok.val;
public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> {
+ public static InterpreterValue eval(Environment environment, ExpressionNode expression) {
+ return new Evaluator(environment).eval(expression);
+ }
+
private final Environment environment;
- public Evaluator(Environment environment) {
+ private Evaluator(Environment environment) {
this.environment = environment;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index d68f4df..bc82fee 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -13,6 +13,7 @@ import org.zwobble.couscous.values.InterpreterValue;
import static com.google.common.collect.Iterables.find;
import static java.util.stream.Collectors.toMap;
+import static org.zwobble.couscous.interpreter.Evaluator.eval;
import static org.zwobble.couscous.values.UnitValue.UNIT;
import lombok.val;
@@ -31,7 +32,7 @@ public class Interpreter {
val environment = buildEnvironment(method, arguments);
for (val statement : method.getBody()) {
- val result = statement.accept(new Executor(new Evaluator(environment)));
+ val result = statement.accept(new Executor(environment));
if (result.isPresent()) {
return result.get();
}
@@ -56,20 +57,20 @@ public class Interpreter {
}
private class Executor implements StatementNodeVisitor<Optional<InterpreterValue>> {
- private Evaluator evaluator;
+ private Environment environment;
- public Executor(Evaluator evaluator) {
- this.evaluator = evaluator;
+ public Executor(Environment environment) {
+ this.environment = environment;
}
@Override
public Optional<InterpreterValue> visit(ReturnNode returnNode) {
- return Optional.of(evaluator.eval(returnNode.getValue()));
+ return Optional.of(eval(environment, returnNode.getValue()));
}
@Override
public Optional<InterpreterValue> visit(ExpressionStatementNode expressionStatement) {
- evaluator.eval(expressionStatement.getExpression());
+ eval(environment, expressionStatement.getExpression());
return Optional.empty();
}
}