diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2016-06-21 22:41:57 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2016-07-26 19:47:08 +0300 |
| commit | acf7fa23e7a254fc690f036aab61fe4d9633fc30 (patch) | |
| tree | 6d87747e1c43712c892a239933b27becc72b7f34 | |
| parent | 485fe60b9838708a07b1d1af7054c729cfa9bbf5 (diff) | |
Add builtin function 'as_int'
| -rw-r--r-- | main/core/runtime/builtins/AsIntBuiltinFunction.java | 55 | ||||
| -rw-r--r-- | main/core/runtime/builtins/BuiltinManager.java | 1 | ||||
| -rw-r--r-- | test/resources/program.bork | 14 |
3 files changed, 61 insertions, 9 deletions
diff --git a/main/core/runtime/builtins/AsIntBuiltinFunction.java b/main/core/runtime/builtins/AsIntBuiltinFunction.java new file mode 100644 index 0000000..3e1c71c --- /dev/null +++ b/main/core/runtime/builtins/AsIntBuiltinFunction.java @@ -0,0 +1,55 @@ +package com.jantuomi.interpreter.main.core.runtime.builtins; + +import com.jantuomi.interpreter.main.core.parser.datatype.BooleanDataContainer; +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; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +public class AsIntBuiltinFunction extends Function { + public AsIntBuiltinFunction() { + super( + Arrays.asList("expression"), + null + ); + } + + @Override + public String getName() { + return "as_int"; + } + + @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"); + } + DataContainer param = params.get(0); + int i = 0; + if (param instanceof StringDataContainer) { + try { + 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; + } + } + else if (param instanceof IntegerDataContainer) { + i = ((IntegerDataContainer) param).getData(); + } + else if (param instanceof BooleanDataContainer) { + i = ((BooleanDataContainer) param).getData() ? 1 : 0; + } + return new IntegerDataContainer(i); + } +} diff --git a/main/core/runtime/builtins/BuiltinManager.java b/main/core/runtime/builtins/BuiltinManager.java index a16d8e9..c6c9e26 100644 --- a/main/core/runtime/builtins/BuiltinManager.java +++ b/main/core/runtime/builtins/BuiltinManager.java @@ -21,6 +21,7 @@ public class BuiltinManager { builtins.add(new OutBuiltinFunction()); builtins.add(new InBuiltinFunction()); builtins.add(new ConcatBuiltinFunction()); + builtins.add(new AsIntBuiltinFunction()); } public List<Function> getBuiltins() { diff --git a/test/resources/program.bork b/test/resources/program.bork index 0901bd7..1b7717d 100644 --- a/test/resources/program.bork +++ b/test/resources/program.bork @@ -13,18 +13,14 @@ sum(x y) */ decl user_input -set user_input in("give input: ") +set user_input in("give integer: ") out( concat("your input was: " user_input "!") ) -decl var -set var true +decl operand set operand 10 -if var then - out("var on tosi!") -end +decl sum +set sum + as_int(user_input) operand -if not var then - out("var on epatosi!") -end +out( concat(user_input " + " operand " = " sum) ) "done"
\ No newline at end of file |
