From efc2af17c87104ad35e32c50d26a8678b519a1bf Mon Sep 17 00:00:00 2001 From: jantuomi Date: Thu, 4 Aug 2016 14:03:33 +0300 Subject: Remove if keyword and create if builtin function --- .../tunkki/core/parser/tokenizer/Tokenizer.java | 2 - .../tunkki/core/parser/tokenizer/token/Token.java | 2 - .../core/parser/tokenizer/token/TokenFactory.java | 4 -- .../parser/tokenizer/token/types/BranchToken.java | 48 ---------------------- .../core/runtime/builtins/BuiltinManager.java | 7 +--- .../builtins/globals/IfBuiltinFunction.java | 46 +++++++++++++++++++++ 6 files changed, 48 insertions(+), 61 deletions(-) delete mode 100644 src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/BranchToken.java create mode 100644 src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java (limited to 'src/main/com') diff --git a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java index c3c0b05..b793a8a 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java +++ b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java @@ -59,11 +59,9 @@ public class Tokenizer { tokenRegexes.put(Token.Type.CallEndToken, "^(\\!)"); tokenRegexes.put(Token.Type.FunctionDefineToken, "^(func)\\b"); tokenRegexes.put(Token.Type.FunctionBodyToken, "^(as)\\b"); - tokenRegexes.put(Token.Type.BranchBodyToken, "^(then)\\b"); tokenRegexes.put(Token.Type.EndBlockToken, "^(end)\\b"); tokenRegexes.put(Token.Type.NegationToken, "^(not)\\b"); tokenRegexes.put(Token.Type.DeclarationToken, "^(decl)\\b"); - tokenRegexes.put(Token.Type.BranchToken, "^(if)\\b"); tokenRegexes.put(Token.Type.CallToken, "^([a-öA-Ö]+\\w*)\\?[\\s|\\!]"); tokenRegexes.put(Token.Type.ObjectMemberToken, "^([a-öA-Ö]+)\\:"); diff --git a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java index 97ac488..d672b34 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java +++ b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java @@ -62,13 +62,11 @@ abstract public class Token { WhitespaceToken, NewlineToken, - BranchToken, SymbolToken, CallToken, EndBlockToken, FunctionBodyToken, - BranchBodyToken, NegationToken, DeclareAssignToken, diff --git a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java index 5d26617..ec5cf55 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java +++ b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java @@ -48,8 +48,6 @@ public class TokenFactory { return new EndBlockToken(); case FunctionBodyToken: return new BlockBodyToken("as"); - case BranchBodyToken: - return new BlockBodyToken("then"); case DeclarationToken: return new VariableDeclareToken(); case AssignmentToken: @@ -64,8 +62,6 @@ public class TokenFactory { return new CallEndToken(); case ObjectMemberToken: return new ObjectMemberToken(text, rawText); - case BranchToken: - return new BranchToken(); case NegationToken: return new NegationToken(); default: diff --git a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/BranchToken.java b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/BranchToken.java deleted file mode 100644 index c4dfaf4..0000000 --- a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/BranchToken.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jantuomi.tunkki.core.parser.tokenizer.token.types; - -import com.jantuomi.tunkki.core.parser.ast.ASTNode; -import com.jantuomi.tunkki.core.parser.ast.BlockBodyNode; -import com.jantuomi.tunkki.core.parser.ast.BranchNode; -import com.jantuomi.tunkki.core.parser.tokenizer.token.Token; -import com.jantuomi.tunkki.exception.types.TunkkiError; - -import java.util.Arrays; -import java.util.List; - -/** - * Created by jan on 21.6.2016. - */ -public class BranchToken extends VarargOperatorToken { - - private Token expression; - private BlockBodyToken branch; - - public BranchToken() { - super(Type.BranchToken, "if"); - } - - @Override - public ASTNode generateNode() throws TunkkiError { - return new BranchNode(this, - expression.generateNode(), - (BlockBodyNode) branch.generateNode() - ); - } - - @Override - public Token setArguments(List args) { - expression = args.get(0); - branch = (BlockBodyToken) args.get(1); - return this; - } - - @Override - public List getChildren() { - return Arrays.asList(expression, branch); - } - - @Override - public Type getTerminatorTokenType() { - return Type.BranchBodyToken; - } -} diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java index a039121..0b98830 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java @@ -43,10 +43,11 @@ public class BuiltinManager { builtins.add(new ContainsBuiltinFunction()); builtins.add(new GetBuiltinFunction()); builtins.add(new EqualsBuiltinFunction()); + builtins.add(new IfBuiltinFunction()); } private List getFunctionsFromMathModule() { - return Arrays.asList(new PowerBuiltinFunction()); + return Collections.singletonList(new PowerBuiltinFunction()); } public List getFunctionsFromModule(String name) throws TunkkiError { @@ -58,10 +59,6 @@ public class BuiltinManager { } } - public void addBuiltin(BuiltinFunction func) { - builtins.add(func); - } - public List getBuiltins() { return builtins; } 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 new file mode 100644 index 0000000..b0eb491 --- /dev/null +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java @@ -0,0 +1,46 @@ +package com.jantuomi.tunkki.core.runtime.builtins.globals; + +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.exception.types.FunctionArgumentTunkkiError; +import com.jantuomi.tunkki.exception.types.TunkkiError; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Created by jan on 4.8.2016. + */ +public class IfBuiltinFunction extends BuiltinFunction { + public IfBuiltinFunction() { + super(Arrays.asList("condition", "function")); + } + + @Override + public Datatype evaluate(List params) throws TunkkiError { + if (params.size() != 2) { + throw new FunctionArgumentTunkkiError(-1, getName(), Datatype.toString(params)); + } + + Datatype lhs = params.get(0); + Datatype rhs = params.get(1); + if (lhs.getType() != Datatype.Type.Boolean || rhs.getType() != Datatype.Type.Callable) { + throw new FunctionArgumentTunkkiError(-1, getName(), Datatype.toString(params)); + } + + BooleanDatatype cond = (BooleanDatatype) lhs; + CallableDatatype branch = (CallableDatatype) rhs; + if (cond.getData()) { + branch.call(Collections.emptyList()); + } + return new VoidDatatype(); + } + + @Override + public String getName() { + return "if"; + } +} -- cgit v1.3