diff options
Diffstat (limited to 'main/core')
| -rw-r--r-- | main/core/parser/ast/AdditionNode.java | 9 | ||||
| -rw-r--r-- | main/core/parser/ast/NegationNode.java | 2 | ||||
| -rw-r--r-- | main/core/parser/ast/SubtractionNode.java | 9 | ||||
| -rw-r--r-- | main/core/parser/ast/SymbolNode.java | 12 | ||||
| -rw-r--r-- | main/core/parser/datatype/BooleanDataContainer.java | 18 | ||||
| -rw-r--r-- | main/core/parser/datatype/DataContainer.java | 10 | ||||
| -rw-r--r-- | main/core/parser/datatype/DoubleDataContainer.java | 50 | ||||
| -rw-r--r-- | main/core/parser/datatype/IntegerDataContainer.java | 77 | ||||
| -rw-r--r-- | main/core/parser/datatype/StringDataContainer.java | 17 | ||||
| -rw-r--r-- | main/core/parser/datatype/VoidDataContainer.java | 17 | ||||
| -rw-r--r-- | main/core/runtime/Scope.java | 3 | ||||
| -rw-r--r-- | main/core/runtime/builtins/AsIntBuiltinFunction.java | 5 |
12 files changed, 205 insertions, 24 deletions
diff --git a/main/core/parser/ast/AdditionNode.java b/main/core/parser/ast/AdditionNode.java index 0820370..00db230 100644 --- a/main/core/parser/ast/AdditionNode.java +++ b/main/core/parser/ast/AdditionNode.java @@ -2,6 +2,7 @@ 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; @@ -22,7 +23,13 @@ public class AdditionNode extends BinaryOperatorNode { DataContainer operand2 = rhs.evaluate(); DataContainer result = operand1.add(operand2); - return result; + if (result != null) { + return result; + } else { + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, source.getLine(), + operand1.getType().toString(), operand2.getType().toString()); + return null; + } } @Override diff --git a/main/core/parser/ast/NegationNode.java b/main/core/parser/ast/NegationNode.java index ec3be2a..1d381cb 100644 --- a/main/core/parser/ast/NegationNode.java +++ b/main/core/parser/ast/NegationNode.java @@ -27,7 +27,7 @@ public class NegationNode extends UnaryOperatorNode { ((IntegerDataContainer) d).getData() != 0 ); } - ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, -1, "not", d.toString()); + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, source.getLine(), "not", d.toString()); return null; } diff --git a/main/core/parser/ast/SubtractionNode.java b/main/core/parser/ast/SubtractionNode.java index b234d0d..6b05073 100644 --- a/main/core/parser/ast/SubtractionNode.java +++ b/main/core/parser/ast/SubtractionNode.java @@ -2,6 +2,7 @@ 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; @@ -21,7 +22,13 @@ public class SubtractionNode extends BinaryOperatorNode { DataContainer operand2 = rhs.evaluate(); DataContainer result = operand1.subtract(operand2); - return result; + if (result != null) { + return result; + } else { + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, source.getLine(), + operand1.getType().toString(), operand2.getType().toString()); + return null; + } } @Override diff --git a/main/core/parser/ast/SymbolNode.java b/main/core/parser/ast/SymbolNode.java index c44d41b..5a4346a 100644 --- a/main/core/parser/ast/SymbolNode.java +++ b/main/core/parser/ast/SymbolNode.java @@ -3,11 +3,14 @@ package com.jantuomi.interpreter.main.core.parser.ast; import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; import com.jantuomi.interpreter.main.core.runtime.State; import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; import com.jantuomi.interpreter.main.exception.InterpreterException; +import com.sun.deploy.util.StringUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * Created by jan on 17.6.2016. @@ -46,7 +49,14 @@ public class SymbolNode extends ASTNode { paramValues.add(param.evaluate()); } } - return State.getInstance().getSymbolValue(name, paramValues); + DataContainer returnValue = State.getInstance().getSymbolValue(name, paramValues); + if (returnValue != null) { + return returnValue; + } else { + ExceptionManager.raise(InterpreterException.ExceptionType.UndeclaredSymbolError, source.getLine(), name, + StringUtils.join(paramValues.stream().map(dataContainer -> dataContainer.toString()).collect(Collectors.toList()), ",")); + return null; + } } @Override diff --git a/main/core/parser/datatype/BooleanDataContainer.java b/main/core/parser/datatype/BooleanDataContainer.java index af814bb..e21ed96 100644 --- a/main/core/parser/datatype/BooleanDataContainer.java +++ b/main/core/parser/datatype/BooleanDataContainer.java @@ -1,6 +1,5 @@ package com.jantuomi.interpreter.main.core.parser.datatype; -import com.jantuomi.interpreter.main.exception.ExceptionManager; import com.jantuomi.interpreter.main.exception.InterpreterException; /** @@ -14,19 +13,32 @@ public class BooleanDataContainer extends DataContainer<Boolean> { } @Override + public Type getType() { + return Type.Boolean; + } + + @Override public String toString() { return Boolean.toString(getData()); } @Override public DataContainer<Boolean> add(DataContainer<Boolean> other) throws InterpreterException { - ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, -1, "boolean", "boolean"); return null; } @Override public DataContainer<Boolean> subtract(DataContainer<Boolean> other) throws InterpreterException { - ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, -1, "boolean", "boolean"); + return null; + } + + @Override + public DataContainer<Boolean> multiply(DataContainer<Boolean> other) throws InterpreterException { + return null; + } + + @Override + public DataContainer<Boolean> divide(DataContainer<Boolean> other) throws InterpreterException { return null; } } diff --git a/main/core/parser/datatype/DataContainer.java b/main/core/parser/datatype/DataContainer.java index 2214d80..5f46640 100644 --- a/main/core/parser/datatype/DataContainer.java +++ b/main/core/parser/datatype/DataContainer.java @@ -8,10 +8,14 @@ import com.jantuomi.interpreter.main.exception.InterpreterException; abstract public class DataContainer<T> { public enum Type { - Integer + Integer, + Double, + String, + Boolean, + Void } - private Type type; + abstract public Type getType(); private T data; @@ -28,4 +32,6 @@ abstract public class DataContainer<T> { abstract public DataContainer<T> add(DataContainer<T> other) throws InterpreterException; public abstract DataContainer<T> subtract(DataContainer<T> other) throws InterpreterException; + public abstract DataContainer<T> multiply(DataContainer<T> other) throws InterpreterException; + public abstract DataContainer<T> divide(DataContainer<T> other) throws InterpreterException; } diff --git a/main/core/parser/datatype/DoubleDataContainer.java b/main/core/parser/datatype/DoubleDataContainer.java new file mode 100644 index 0000000..76849c2 --- /dev/null +++ b/main/core/parser/datatype/DoubleDataContainer.java @@ -0,0 +1,50 @@ +package com.jantuomi.interpreter.main.core.parser.datatype; + +import com.jantuomi.interpreter.main.exception.InterpreterException; + +/** + * Created by jan on 22.6.2016. + */ +public class DoubleDataContainer extends DataContainer<Double> { + public DoubleDataContainer(double value) { + setData(value); + } + + @Override + public Type getType() { + return Type.Double; + } + + @Override + public String toString() { + return getData().toString(); + } + + @Override + public DataContainer<Double> add(DataContainer<Double> other) throws InterpreterException { + return new DoubleDataContainer( + getData() + other.getData() + ); + } + + @Override + public DataContainer<Double> subtract(DataContainer<Double> other) throws InterpreterException { + return new DoubleDataContainer( + getData() - other.getData() + ); + } + + @Override + public DataContainer<Double> multiply(DataContainer<Double> other) throws InterpreterException { + return new DoubleDataContainer( + getData() * other.getData() + ); + } + + @Override + public DataContainer<Double> divide(DataContainer<Double> other) throws InterpreterException { + return new DoubleDataContainer( + getData() / other.getData() + ); + } +} diff --git a/main/core/parser/datatype/IntegerDataContainer.java b/main/core/parser/datatype/IntegerDataContainer.java index 1999131..4f71e2b 100644 --- a/main/core/parser/datatype/IntegerDataContainer.java +++ b/main/core/parser/datatype/IntegerDataContainer.java @@ -1,5 +1,7 @@ package com.jantuomi.interpreter.main.core.parser.datatype; +import com.jantuomi.interpreter.main.exception.InterpreterException; + /** * Created by jan on 16.6.2016. */ @@ -10,21 +12,80 @@ public class IntegerDataContainer extends DataContainer<Integer> { } @Override + public Type getType() { + return Type.Integer; + } + + @Override public String toString() { return Integer.toString(getData()); } @Override - public DataContainer<Integer> add(DataContainer<Integer> other) { - return new IntegerDataContainer( - this.getData() + other.getData() - ); + public DataContainer add(DataContainer other) { + switch (other.getType()) { + case Integer: + return new IntegerDataContainer( + this.getData() + ((IntegerDataContainer) other).getData() + ); + case Double: + return new DoubleDataContainer( + (double) getData() + ((DoubleDataContainer) other).getData() + ); + default: + return null; + + } + } + + @Override + public DataContainer subtract(DataContainer other) { + switch (other.getType()) { + case Integer: + return new IntegerDataContainer( + this.getData() - ((IntegerDataContainer) other).getData() + ); + case Double: + return new DoubleDataContainer( + (double) getData() - ((DoubleDataContainer) other).getData() + ); + default: + return null; + + } } @Override - public DataContainer<Integer> subtract(DataContainer<Integer> other) { - return new IntegerDataContainer( - this.getData() - other.getData() - ); + public DataContainer multiply(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Integer: + return new IntegerDataContainer( + this.getData() * ((IntegerDataContainer) other).getData() + ); + case Double: + return new DoubleDataContainer( + (double) getData() * ((DoubleDataContainer) other).getData() + ); + default: + return null; + + } + } + + @Override + public DataContainer divide(DataContainer other) throws InterpreterException { + switch (other.getType()) { + case Integer: + return new IntegerDataContainer( + this.getData() / ((IntegerDataContainer) other).getData() + ); + case Double: + return new DoubleDataContainer( + (double) getData() / ((DoubleDataContainer) other).getData() + ); + default: + return null; + + } } } diff --git a/main/core/parser/datatype/StringDataContainer.java b/main/core/parser/datatype/StringDataContainer.java index bbc9b29..68f41d9 100644 --- a/main/core/parser/datatype/StringDataContainer.java +++ b/main/core/parser/datatype/StringDataContainer.java @@ -1,6 +1,5 @@ package com.jantuomi.interpreter.main.core.parser.datatype; -import com.jantuomi.interpreter.main.exception.ExceptionManager; import com.jantuomi.interpreter.main.exception.InterpreterException; /** @@ -14,6 +13,11 @@ public class StringDataContainer extends DataContainer<String> { } @Override + public Type getType() { + return Type.String; + } + + @Override public String toString() { return getData(); } @@ -27,7 +31,16 @@ public class StringDataContainer extends DataContainer<String> { @Override public DataContainer<String> subtract(DataContainer<String> other) throws InterpreterException { - ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, -1, "string", "string"); + return null; + } + + @Override + public DataContainer<String> multiply(DataContainer<String> other) throws InterpreterException { + return null; + } + + @Override + public DataContainer<String> divide(DataContainer<String> other) throws InterpreterException { return null; } } diff --git a/main/core/parser/datatype/VoidDataContainer.java b/main/core/parser/datatype/VoidDataContainer.java index 8e078d9..098de8d 100644 --- a/main/core/parser/datatype/VoidDataContainer.java +++ b/main/core/parser/datatype/VoidDataContainer.java @@ -1,11 +1,18 @@ package com.jantuomi.interpreter.main.core.parser.datatype; +import com.jantuomi.interpreter.main.exception.InterpreterException; + /** * Created by jan on 17.6.2016. */ public class VoidDataContainer extends DataContainer<Integer> { @Override + public Type getType() { + return Type.Void; + } + + @Override public String toString() { return ""; } @@ -19,4 +26,14 @@ public class VoidDataContainer extends DataContainer<Integer> { public DataContainer<Integer> subtract(DataContainer<Integer> other) { return null; } + + @Override + public DataContainer<Integer> multiply(DataContainer<Integer> other) throws InterpreterException { + return null; + } + + @Override + public DataContainer<Integer> divide(DataContainer<Integer> other) throws InterpreterException { + return null; + } } diff --git a/main/core/runtime/Scope.java b/main/core/runtime/Scope.java index e3bf899..0bf8907 100644 --- a/main/core/runtime/Scope.java +++ b/main/core/runtime/Scope.java @@ -26,7 +26,8 @@ public class Scope { public DataContainer resolveSymbol(String symbol, List<DataContainer> params) throws InterpreterException { if (functions.containsKey(symbol)) { - return functions.get(symbol).evaluate(params); + DataContainer r = functions.get(symbol).evaluate(params); + return r; } if (variables.containsKey(symbol)) { return variables.get(symbol); diff --git a/main/core/runtime/builtins/AsIntBuiltinFunction.java b/main/core/runtime/builtins/AsIntBuiltinFunction.java index 3e1c71c..210e1e4 100644 --- a/main/core/runtime/builtins/AsIntBuiltinFunction.java +++ b/main/core/runtime/builtins/AsIntBuiltinFunction.java @@ -5,7 +5,6 @@ import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; import com.jantuomi.interpreter.main.core.parser.datatype.IntegerDataContainer; import com.jantuomi.interpreter.main.core.parser.datatype.StringDataContainer; import com.jantuomi.interpreter.main.core.runtime.Function; -import com.jantuomi.interpreter.main.exception.ExceptionManager; import com.jantuomi.interpreter.main.exception.InterpreterException; import java.util.Arrays; @@ -30,7 +29,7 @@ public class AsIntBuiltinFunction extends Function { @Override public DataContainer evaluate(List<DataContainer> params) throws InterpreterException { if (params.size() != 1) { - ExceptionManager.raise(InterpreterException.ExceptionType.SyntaxError, -1, "amount of parameters to as_int"); + return null; } DataContainer param = params.get(0); int i = 0; @@ -39,8 +38,6 @@ public class AsIntBuiltinFunction extends Function { i = Integer.parseInt(((StringDataContainer) param).getData()); } catch (NumberFormatException ex) { - ExceptionManager.raise(InterpreterException.ExceptionType.SyntaxError, -1, - String.format("parameter %s to as_int", param.toString())); return null; } } |
