From 48dcd488054024d98fe1e659a4029630130d1d35 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Wed, 22 Jun 2016 23:25:59 +0300 Subject: Add multiplication and division operations --- main/core/parser/ast/DivisionNode.java | 39 +++++++++++++ main/core/parser/ast/DoubleLiteralNode.java | 30 ++++++++++ main/core/parser/ast/MultiplicationNode.java | 39 +++++++++++++ main/core/parser/datatype/DoubleDataContainer.java | 68 +++++++++++++++++----- 4 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 main/core/parser/ast/DivisionNode.java create mode 100644 main/core/parser/ast/DoubleLiteralNode.java create mode 100644 main/core/parser/ast/MultiplicationNode.java (limited to 'main/core/parser') diff --git a/main/core/parser/ast/DivisionNode.java b/main/core/parser/ast/DivisionNode.java new file mode 100644 index 0000000..5bebf7b --- /dev/null +++ b/main/core/parser/ast/DivisionNode.java @@ -0,0 +1,39 @@ +package com.jantuomi.interpreter.main.core.parser.ast; + +import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 16.6.2016. + */ +public class DivisionNode extends BinaryOperatorNode { + + public DivisionNode(Token token, ASTNode lhs, ASTNode rhs) { + super(token, lhs, rhs); + } + + @Override + public DataContainer evaluate() throws InterpreterException { + DataContainer operand1 = lhs.evaluate(); + DataContainer operand2 = rhs.evaluate(); + + DataContainer result = operand1.divide(operand2); + if (result != null) { + return result; + } else { + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, source.getLine(), + operand1.getType().toString(), operand2.getType().toString()); + return null; + } + + } + @Override + List getChildren() { + return Arrays.asList(lhs, rhs); + } +} diff --git a/main/core/parser/ast/DoubleLiteralNode.java b/main/core/parser/ast/DoubleLiteralNode.java new file mode 100644 index 0000000..a90c4af --- /dev/null +++ b/main/core/parser/ast/DoubleLiteralNode.java @@ -0,0 +1,30 @@ +package com.jantuomi.interpreter.main.core.parser.ast; + +import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.parser.datatype.DoubleDataContainer; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 16.6.2016. + */ +public class DoubleLiteralNode extends ASTNode { + private DoubleDataContainer value; + + public DoubleLiteralNode(Token token) { + super(token); + value = new DoubleDataContainer(Double.parseDouble(token.getText())); + } + + @Override + public DataContainer evaluate() { + return value; + } + + @Override + List getChildren() { + return Arrays.asList(); + } +} diff --git a/main/core/parser/ast/MultiplicationNode.java b/main/core/parser/ast/MultiplicationNode.java new file mode 100644 index 0000000..5d86cf3 --- /dev/null +++ b/main/core/parser/ast/MultiplicationNode.java @@ -0,0 +1,39 @@ +package com.jantuomi.interpreter.main.core.parser.ast; + +import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 16.6.2016. + */ +public class MultiplicationNode extends BinaryOperatorNode { + + public MultiplicationNode(Token token, ASTNode lhs, ASTNode rhs) { + super(token, lhs, rhs); + } + + @Override + public DataContainer evaluate() throws InterpreterException { + DataContainer operand1 = lhs.evaluate(); + DataContainer operand2 = rhs.evaluate(); + + DataContainer result = operand1.multiply(operand2); + if (result != null) { + return result; + } else { + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, source.getLine(), + operand1.getType().toString(), operand2.getType().toString()); + return null; + } + + } + @Override + List getChildren() { + return Arrays.asList(lhs, rhs); + } +} diff --git a/main/core/parser/datatype/DoubleDataContainer.java b/main/core/parser/datatype/DoubleDataContainer.java index 76849c2..9564ff9 100644 --- a/main/core/parser/datatype/DoubleDataContainer.java +++ b/main/core/parser/datatype/DoubleDataContainer.java @@ -21,30 +21,66 @@ public class DoubleDataContainer extends DataContainer { } @Override - public DataContainer add(DataContainer other) throws InterpreterException { - return new DoubleDataContainer( - getData() + other.getData() - ); + public DataContainer add(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Double: + return new DoubleDataContainer( + getData() + ((DoubleDataContainer) other).getData() + ); + case Integer: + return new DoubleDataContainer( + getData() + ((IntegerDataContainer) other).getData() + ); + default: + return null; + } } @Override - public DataContainer subtract(DataContainer other) throws InterpreterException { - return new DoubleDataContainer( - getData() - other.getData() - ); + public DataContainer subtract(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Double: + return new DoubleDataContainer( + getData() - ((DoubleDataContainer) other).getData() + ); + case Integer: + return new DoubleDataContainer( + getData() - ((IntegerDataContainer) other).getData() + ); + default: + return null; + } } @Override - public DataContainer multiply(DataContainer other) throws InterpreterException { - return new DoubleDataContainer( - getData() * other.getData() - ); + public DataContainer multiply(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Double: + return new DoubleDataContainer( + getData() * ((DoubleDataContainer) other).getData() + ); + case Integer: + return new DoubleDataContainer( + getData() * ((IntegerDataContainer) other).getData() + ); + default: + return null; + } } @Override - public DataContainer divide(DataContainer other) throws InterpreterException { - return new DoubleDataContainer( - getData() / other.getData() - ); + public DataContainer divide(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Double: + return new DoubleDataContainer( + getData() / ((DoubleDataContainer) other).getData() + ); + case Integer: + return new DoubleDataContainer( + getData() / ((IntegerDataContainer) other).getData() + ); + default: + return null; + } } } -- cgit v1.3