diff options
Diffstat (limited to 'src/main')
5 files changed, 51 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java index 594187d..cc57aef 100644 --- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; +import org.zwobble.couscous.values.BooleanValue; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.InterpreterValue; import org.zwobble.couscous.values.StringValue; @@ -13,10 +14,14 @@ public class LiteralNode implements ExpressionNode { return new LiteralNode(new StringValue(value)); } - public static LiteralNode of(int value) { + public static LiteralNode literal(int value) { return new LiteralNode(new IntegerValue(value)); } + public static LiteralNode literal(boolean value) { + return new LiteralNode(new BooleanValue(value)); + } + InterpreterValue value; @Override diff --git a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java new file mode 100644 index 0000000..0386a32 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java @@ -0,0 +1,17 @@ +package org.zwobble.couscous.ast; + +import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; + +import lombok.Value; + +@Value +public class TernaryConditionalNode implements ExpressionNode { + ExpressionNode condition; + ExpressionNode ifTrue; + ExpressionNode ifFalse; + + @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 index 0167abc..27692e3 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java @@ -2,10 +2,12 @@ package org.zwobble.couscous.ast.visitors; import org.zwobble.couscous.ast.Assignment; import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.VariableReferenceNode; public interface ExpressionNodeVisitor<T> { T visit(LiteralNode literal); T visit(VariableReferenceNode variableReference); T visit(Assignment assignment); + T visit(TernaryConditionalNode ternaryConditional); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 863ccb0..6586f6a 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -3,8 +3,10 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.ast.Assignment; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.VariableReferenceNode; import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; +import org.zwobble.couscous.values.BooleanValue; import org.zwobble.couscous.values.InterpreterValue; import lombok.val; @@ -40,4 +42,13 @@ public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> { environment.put(assignment.getTarget().getReferentId(), value); return value; } + + @Override + public InterpreterValue visit(TernaryConditionalNode ternaryConditional) { + val condition = (BooleanValue)eval(ternaryConditional.getCondition()); + val branch = condition.getValue() + ? ternaryConditional.getIfTrue() + : ternaryConditional.getIfFalse(); + return eval(branch); + } } diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java new file mode 100644 index 0000000..6d016e6 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java @@ -0,0 +1,15 @@ +package org.zwobble.couscous.values; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Value; + +@Value +public class BooleanValue implements InterpreterValue { + @Getter(value = AccessLevel.NONE) + boolean value; + + public boolean getValue() { + return value; + } +} |
