diff options
| author | jantuomi <jans.tuomi@gmail.com> | 2016-08-30 16:50:00 +0300 |
|---|---|---|
| committer | jantuomi <jans.tuomi@gmail.com> | 2016-08-30 16:50:00 +0300 |
| commit | 7abd9bde5724aaa95751bc9b69ee0cb49c4fd399 (patch) | |
| tree | d8f2de5ade3ff92fbb2d43d03add02a4d63daf34 /src | |
| parent | a6bb3d4f3789fab2842600bed1816515de1b5aaf (diff) | |
Include calls now always return an object containing the library scopemaster
Resolves #15
Diffstat (limited to 'src')
21 files changed, 93 insertions, 51 deletions
diff --git a/src/main/com/jantuomi/tunkki/Main.java b/src/main/com/jantuomi/tunkki/Main.java index 098f0ff..dd4b2ea 100644 --- a/src/main/com/jantuomi/tunkki/Main.java +++ b/src/main/com/jantuomi/tunkki/Main.java @@ -1,6 +1,9 @@ package com.jantuomi.tunkki; import com.jantuomi.tunkki.core.CommandLineArgumentContainer; +import com.jantuomi.tunkki.core.parser.ast.ASTNode; + +import java.util.List; public class Main { @@ -18,7 +21,8 @@ public class Main { tunkki.repl(); } else { String sourceFileContents = CommandLineArgumentContainer.getInstance().getSourceFileContents(); - tunkki.run(sourceFileContents); + List<ASTNode> nodes = tunkki.parseAndInterpret(sourceFileContents); + tunkki.executeAndOutput(nodes); } } diff --git a/src/main/com/jantuomi/tunkki/Tunkki.java b/src/main/com/jantuomi/tunkki/Tunkki.java index 3100d95..0b02d3e 100644 --- a/src/main/com/jantuomi/tunkki/Tunkki.java +++ b/src/main/com/jantuomi/tunkki/Tunkki.java @@ -34,7 +34,7 @@ public class Tunkki { repl.run(); } - public void run(String input) throws TunkkiError { + public List<ASTNode> parseAndInterpret(String input) throws TunkkiError { Tokenizer tokenizer = Tokenizer.getInstance(); List<Token> sequence = tokenizer.tokenize(input); @@ -50,6 +50,10 @@ public class Tunkki { ASTGenerator.getInstance().printAllTrees(nodes); } + return nodes; + } + + public void executeAndOutput(List<ASTNode> nodes) throws TunkkiError { String output = Interpreter.execute(nodes); if (output.trim().length() > 0) { diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/ParameterListNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/ParameterListNode.java index a05eaee..fb67e68 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/ast/ParameterListNode.java +++ b/src/main/com/jantuomi/tunkki/core/parser/ast/ParameterListNode.java @@ -27,7 +27,7 @@ public class ParameterListNode extends ASTNode { @Override public Datatype evaluate() { - // TODO use State to evaluate function + // TODO use State to executeBlock function return null; } diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java index 8ee4148..2023993 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java +++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/CallableDatatype.java @@ -1,7 +1,6 @@ package com.jantuomi.tunkki.core.parser.datatype; import com.jantuomi.tunkki.core.runtime.Function; -import com.jantuomi.tunkki.core.runtime.UserDefinedFunction; import com.jantuomi.tunkki.exception.types.TunkkiError; import java.util.List; diff --git a/src/main/com/jantuomi/tunkki/core/runtime/Function.java b/src/main/com/jantuomi/tunkki/core/runtime/Function.java index ad120f6..34bc06b 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/Function.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/Function.java @@ -41,11 +41,14 @@ abstract public class Function { throw new FunctionArgumentTunkkiError(-1, Datatype.toString(params)); } + Datatype returnValue = executeBlock(params); getState().popScope(); - return null; + return returnValue; } + abstract public Datatype executeBlock(List<Datatype> params) throws TunkkiError; + protected boolean checkArgumentListValidity(List<Datatype> params) throws FunctionArgumentTunkkiError { int argumentCount = getArgumentCount(); boolean isSizeCorrect; diff --git a/src/main/com/jantuomi/tunkki/core/runtime/ModuleContainerFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/ModuleContainerFunction.java new file mode 100644 index 0000000..066cff7 --- /dev/null +++ b/src/main/com/jantuomi/tunkki/core/runtime/ModuleContainerFunction.java @@ -0,0 +1,50 @@ +package com.jantuomi.tunkki.core.runtime; + +import com.jantuomi.tunkki.core.parser.ast.ASTNode; +import com.jantuomi.tunkki.core.parser.ast.BlockBodyNode; +import com.jantuomi.tunkki.core.parser.datatype.Datatype; +import com.jantuomi.tunkki.core.parser.datatype.VoidDatatype; +import com.jantuomi.tunkki.exception.types.TunkkiError; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +/** + * Created by jan on 30.8.2016. + */ +public class ModuleContainerFunction extends Function { + + List<ASTNode> nodes; + + public ModuleContainerFunction(List<ASTNode> nodes) { + super(Collections.emptyList(), null); + this.nodes = nodes; + } + + @Override + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { + Datatype returnValue = new VoidDatatype(); + + for (ASTNode node : nodes) { + returnValue = node.evaluate(); + } + + return returnValue; + } + + @Override + public boolean hasVariableArgumentList() { + return false; + } + + @Override + public boolean hasDynamicallyTypedArguments() { + return false; + } + + @Override + public List<Set<Datatype.Type>> getArgumentTypes() { + return null; + } +} diff --git a/src/main/com/jantuomi/tunkki/core/runtime/UserDefinedFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/UserDefinedFunction.java index c094d91..e923c27 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/UserDefinedFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/UserDefinedFunction.java @@ -16,9 +16,7 @@ public class UserDefinedFunction extends Function { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - - super.evaluate(params); + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { for (int i = 0; i < argumentNames.size(); i++) { State.getGlobalState().addSymbolToScope(argumentNames.get(i)); @@ -26,7 +24,6 @@ public class UserDefinedFunction extends Function { } Datatype returnValue = body.evaluate(); - State.getGlobalState().popScope(); return returnValue; } diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ConcatBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ConcatBuiltinFunction.java index bd0a627..4ddc7ac 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ConcatBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ConcatBuiltinFunction.java @@ -4,7 +4,6 @@ import com.jantuomi.tunkki.core.parser.datatype.Datatype; import com.jantuomi.tunkki.core.parser.datatype.StringDatatype; import com.jantuomi.tunkki.exception.types.TunkkiError; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -20,9 +19,7 @@ public class ConcatBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { StringBuilder sb = new StringBuilder(); for (Datatype d : params) { sb.append(d.getData()); diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ContainsBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ContainsBuiltinFunction.java index 5e1a9b0..6f1dc5e 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ContainsBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ContainsBuiltinFunction.java @@ -20,9 +20,7 @@ public class ContainsBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { if (params.get(0).getType() == Datatype.Type.List) { return evaluateOnList(params); } diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/EqualsBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/EqualsBuiltinFunction.java index 20e40fc..b38b2de 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/EqualsBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/EqualsBuiltinFunction.java @@ -2,7 +2,6 @@ package com.jantuomi.tunkki.core.runtime.builtins.globals; import com.jantuomi.tunkki.core.parser.datatype.BooleanDatatype; import com.jantuomi.tunkki.core.parser.datatype.Datatype; -import com.jantuomi.tunkki.exception.types.FunctionArgumentTunkkiError; import com.jantuomi.tunkki.exception.types.TunkkiError; import com.jantuomi.tunkki.exception.types.TypeTunkkiError; @@ -20,9 +19,7 @@ public class EqualsBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { Datatype lhs = params.get(0); Datatype rhs = params.get(1); diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/GetBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/GetBuiltinFunction.java index 33a9170..af0ac8a 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/GetBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/GetBuiltinFunction.java @@ -20,7 +20,7 @@ public class GetBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { if (params.size() != 2) { throw new FunctionArgumentTunkkiError(-1, params.toString()); } diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java index 1156958..2b999a9 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java @@ -4,7 +4,6 @@ import com.jantuomi.tunkki.core.parser.datatype.BooleanDatatype; import com.jantuomi.tunkki.core.parser.datatype.CallableDatatype; import com.jantuomi.tunkki.core.parser.datatype.Datatype; import com.jantuomi.tunkki.core.parser.datatype.VoidDatatype; -import com.jantuomi.tunkki.core.runtime.Function; import com.jantuomi.tunkki.exception.types.FunctionArgumentTunkkiError; import com.jantuomi.tunkki.exception.types.TunkkiError; @@ -22,9 +21,7 @@ public class IfBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { if (params.size() != 2) { throw new FunctionArgumentTunkkiError(-1, Datatype.toString(params)); } diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IncludeBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IncludeBuiltinFunction.java index d2c6f31..d27ef91 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IncludeBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IncludeBuiltinFunction.java @@ -3,8 +3,10 @@ package com.jantuomi.tunkki.core.runtime.builtins.globals; import com.jantuomi.tunkki.Tunkki; import com.jantuomi.tunkki.core.CommandLineArgumentContainer; +import com.jantuomi.tunkki.core.parser.ast.ASTNode; +import com.jantuomi.tunkki.core.parser.ast.ObjectPrototypeNode; import com.jantuomi.tunkki.core.parser.datatype.*; -import com.jantuomi.tunkki.core.runtime.State; +import com.jantuomi.tunkki.core.runtime.ModuleContainerFunction; import com.jantuomi.tunkki.core.runtime.builtins.BuiltinManager; import com.jantuomi.tunkki.exception.types.*; @@ -25,9 +27,7 @@ public class IncludeBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { StringDatatype param = (StringDatatype) params.get(0); String filename = param.getData(); @@ -38,9 +38,7 @@ public class IncludeBuiltinFunction extends BuiltinFunction { for (String funcName : funcs.keySet()) { namespace.getData().addAndSetVariable(funcName, funcs.get(funcName)); } - State.getGlobalState().addSymbolToScope(filename); - State.getGlobalState().setSymbolValueToScope(filename, namespace); - + return namespace; } else { String contents = CommandLineArgumentContainer.getInstance().readFileContents(filename); @@ -56,10 +54,13 @@ public class IncludeBuiltinFunction extends BuiltinFunction { throw new RecursiveIncludeTunkkiError(-1, filename); } - Tunkki.getInstance().run(contents); + List<ASTNode> nodes = Tunkki.getInstance().parseAndInterpret(contents); + ModuleContainerFunction func = new ModuleContainerFunction(nodes); + ObjectPrototypeDatatype proto = new ObjectPrototypeDatatype(); + proto.setData(func); + ObjectDatatype namespace = proto.instantiate(); + return namespace; } - - return new VoidDatatype(); } @Override diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ListBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ListBuiltinFunction.java index 58629fc..e223956 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ListBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/ListBuiltinFunction.java @@ -18,7 +18,7 @@ public class ListBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { ListDatatype data = new ListDatatype(params); return data; } diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsBooleanBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsBooleanBuiltinFunction.java index e46b88c..b45e6af 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsBooleanBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsBooleanBuiltinFunction.java @@ -20,9 +20,7 @@ public class AsBooleanBuiltinFunction extends BuiltinFunction { } @Override - public BooleanDatatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public BooleanDatatype executeBlock(List<Datatype> params) throws TunkkiError { Datatype param = params.get(0); switch (param.getType()) { case Integer: diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsIntBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsIntBuiltinFunction.java index 6bd45ca..255c068 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsIntBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/cast/AsIntBuiltinFunction.java @@ -20,9 +20,7 @@ public class AsIntBuiltinFunction extends BuiltinFunction { } @Override - public IntegerDatatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public IntegerDatatype executeBlock(List<Datatype> params) throws TunkkiError { Datatype param = params.get(0); int i; switch (param.getType()) { diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/InputBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/InputBuiltinFunction.java index 47e6f23..3f5b7a6 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/InputBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/InputBuiltinFunction.java @@ -21,9 +21,7 @@ public class InputBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { - super.evaluate(params); - + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { Datatype param = params.get(0); System.out.print(param.getData().toString()); diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/OutputBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/OutputBuiltinFunction.java index 682c69f..175f5c0 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/OutputBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/io/OutputBuiltinFunction.java @@ -21,7 +21,7 @@ public class OutputBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { Datatype param = params.get(0); //IO.getInstance().printLine(param.toString()); System.out.println(param.toString()); diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/math/PowerBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/math/PowerBuiltinFunction.java index f426456..f8b4eb0 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/math/PowerBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/math/PowerBuiltinFunction.java @@ -20,7 +20,7 @@ public class PowerBuiltinFunction extends BuiltinFunction { } @Override - public Datatype evaluate(List<Datatype> params) throws TunkkiError { + public Datatype executeBlock(List<Datatype> params) throws TunkkiError { if (params.size() != 2) { throw new FunctionArgumentTunkkiError(-1, Datatype.toString(params)); } diff --git a/src/main/com/jantuomi/tunkki/repl/Repl.java b/src/main/com/jantuomi/tunkki/repl/Repl.java index 0b415b8..e960894 100644 --- a/src/main/com/jantuomi/tunkki/repl/Repl.java +++ b/src/main/com/jantuomi/tunkki/repl/Repl.java @@ -1,12 +1,12 @@ package com.jantuomi.tunkki.repl; import com.jantuomi.tunkki.Tunkki; +import com.jantuomi.tunkki.core.parser.ast.ASTNode; import com.jantuomi.tunkki.exception.types.TunkkiError; import com.jantuomi.tunkki.utils.IO; -import jline.console.*; import java.io.IOException; -import java.io.PrintWriter; +import java.util.List; /** * Created by jan on 31.7.2016. @@ -39,7 +39,8 @@ public class Repl { try { isMultilineInput = false; command += line; - tunkki.run(command); + List<ASTNode> nodes = tunkki.parseAndInterpret(command); + tunkki.executeAndOutput(nodes); } catch (TunkkiError ex) { ex.printStackTrace(); Thread.sleep(50); diff --git a/src/test/com/jantuomi/tunkki/MainTest.java b/src/test/com/jantuomi/tunkki/MainTest.java index a642fd5..99c52b9 100644 --- a/src/test/com/jantuomi/tunkki/MainTest.java +++ b/src/test/com/jantuomi/tunkki/MainTest.java @@ -46,7 +46,7 @@ public class MainTest { public void testWholeProcedure() throws TunkkiError { String input = "- + 2 5 1"; - Tunkki.getInstance().run(input); + Tunkki.getInstance().parseAndInterpret(input); assertTrue(out.toString().contains("6")); } }
\ No newline at end of file |
