aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/com/jantuomi/tunkki
diff options
context:
space:
mode:
authorjantuomi <jans.tuomi@gmail.com>2016-08-04 14:03:33 +0300
committerjantuomi <jans.tuomi@gmail.com>2016-08-04 14:03:33 +0300
commitefc2af17c87104ad35e32c50d26a8678b519a1bf (patch)
tree1a6141a3166cde0f1467dbc223822839a39bbe9a /src/main/com/jantuomi/tunkki
parent5b690c7cf7d024b855b9c75d9c53603b3ba46970 (diff)
Remove if keyword and create if builtin function
Diffstat (limited to 'src/main/com/jantuomi/tunkki')
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java2
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java2
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java4
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/BranchToken.java48
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/BuiltinManager.java7
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/globals/IfBuiltinFunction.java46
6 files changed, 48 insertions, 61 deletions
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<Token> args) {
- expression = args.get(0);
- branch = (BlockBodyToken) args.get(1);
- return this;
- }
-
- @Override
- public List<Token> 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<Function> getFunctionsFromMathModule() {
- return Arrays.asList(new PowerBuiltinFunction());
+ return Collections.singletonList(new PowerBuiltinFunction());
}
public List<Function> getFunctionsFromModule(String name) throws TunkkiError {
@@ -58,10 +59,6 @@ public class BuiltinManager {
}
}
- public void addBuiltin(BuiltinFunction func) {
- builtins.add(func);
- }
-
public List<BuiltinFunction> 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<Datatype> 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";
+ }
+}