aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/ast/ObjectInstantiationNode.java31
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/ast/ObjectPrototypeNode.java1
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java3
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/Token.java1
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/TokenFactory.java2
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/ObjectInstantiationToken.java23
-rw-r--r--src/main/com/jantuomi/tunkki/exception/types/NotAPrototypeTunkkiError.java20
-rw-r--r--src/main/com/jantuomi/tunkki/exception/types/TunkkiError.java3
8 files changed, 82 insertions, 2 deletions
diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectInstantiationNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectInstantiationNode.java
new file mode 100644
index 0000000..9fd78be
--- /dev/null
+++ b/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectInstantiationNode.java
@@ -0,0 +1,31 @@
+package com.jantuomi.tunkki.core.parser.ast;
+
+import com.jantuomi.tunkki.core.parser.datatype.Datatype;
+import com.jantuomi.tunkki.core.parser.datatype.ObjectDatatype;
+import com.jantuomi.tunkki.core.parser.datatype.ObjectPrototypeDatatype;
+import com.jantuomi.tunkki.core.parser.tokenizer.token.Token;
+import com.jantuomi.tunkki.core.parser.tokenizer.token.types.ObjectPrototypeToken;
+import com.jantuomi.tunkki.exception.types.NotAPrototypeTunkkiError;
+import com.jantuomi.tunkki.exception.types.TunkkiError;
+
+/**
+ * Created by jan on 29.8.2016.
+ */
+public class ObjectInstantiationNode extends UnaryOperatorNode {
+ public ObjectInstantiationNode(Token token, SymbolNode operand) {
+ super(token, operand);
+ }
+
+ @Override
+ public Datatype evaluate() throws TunkkiError {
+ SymbolNode symbol = (SymbolNode) getOperand();
+ Datatype value = symbol.evaluate();
+
+ if (value.getType() != Datatype.Type.ObjectPrototype) {
+ throw new NotAPrototypeTunkkiError(getLine(), getText());
+ }
+
+ ObjectDatatype obj = ((ObjectPrototypeDatatype) value).instantiate();
+ return obj;
+ }
+}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectPrototypeNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectPrototypeNode.java
index abffba4..4a99841 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectPrototypeNode.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/ast/ObjectPrototypeNode.java
@@ -38,6 +38,7 @@ public class ObjectPrototypeNode extends NullaryOperatorNode {
prototype.setData(func);
State.getGlobalState().addSymbolToScope(name);
+ State.getGlobalState().setSymbolValueToScope(name, prototype);
return prototype;
}
}
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 1cd5a2f..9be7c8b 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/Tokenizer.java
@@ -57,11 +57,12 @@ public class Tokenizer {
tokenRegexes.put(Token.Type.OpenParenToken, "^(\\()");
tokenRegexes.put(Token.Type.BlockEndToken, "^(\\!)");
tokenRegexes.put(Token.Type.FunctionDefineToken, "^(\\@)");
- tokenRegexes.put(Token.Type.FunctionBodyToken, "^(\\|)");
+ tokenRegexes.put(Token.Type.FunctionBodyToken, "^(\\|)\\s*");
tokenRegexes.put(Token.Type.NegationToken, "^(not)\\b");
tokenRegexes.put(Token.Type.DeclarationToken, "^(decl)\\b");
tokenRegexes.put(Token.Type.ObjectPrototypeToken, "^(obj)\\b");
+ tokenRegexes.put(Token.Type.ObjectInstantiationToken, "^(new)\\b");
tokenRegexes.put(Token.Type.CallToken, "^([a-öA-Ö]+\\w*)\\?[\\s|\\!]");
tokenRegexes.put(Token.Type.ObjectMemberToken, "^([a-öA-Ö]+)\\:");
tokenRegexes.put(Token.Type.SymbolToken, "^([a-öA-Ö]+\\w*)\\b");
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 83a6712..8609940 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
@@ -71,6 +71,7 @@ abstract public class Token {
DeclareAssignToken,
ObjectMemberToken,
ObjectPrototypeToken,
+ ObjectInstantiationToken,
NotAToken
}
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 fd3102c..498922e 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
@@ -62,6 +62,8 @@ public class TokenFactory {
return new BlockEndToken();
case ObjectMemberToken:
return new ObjectMemberToken(text, rawText);
+ case ObjectInstantiationToken:
+ return new ObjectInstantiationToken();
case NegationToken:
return new NegationToken();
default:
diff --git a/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/ObjectInstantiationToken.java b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/ObjectInstantiationToken.java
new file mode 100644
index 0000000..5b8411b
--- /dev/null
+++ b/src/main/com/jantuomi/tunkki/core/parser/tokenizer/token/types/ObjectInstantiationToken.java
@@ -0,0 +1,23 @@
+package com.jantuomi.tunkki.core.parser.tokenizer.token.types;
+
+import com.jantuomi.tunkki.core.parser.ast.ASTNode;
+import com.jantuomi.tunkki.core.parser.ast.ObjectInstantiationNode;
+import com.jantuomi.tunkki.core.parser.ast.ObjectPrototypeNode;
+import com.jantuomi.tunkki.core.parser.ast.SymbolNode;
+import com.jantuomi.tunkki.exception.types.TunkkiError;
+
+/**
+ * Created by jan on 29.8.2016.
+ */
+public class ObjectInstantiationToken extends UnaryOperatorToken {
+ public ObjectInstantiationToken() {
+ super(Type.ObjectInstantiationToken, "new");
+ }
+
+ @Override
+ public ASTNode generateNode() throws TunkkiError {
+ SymbolNode symbol = (SymbolNode) operand.generateNode();
+
+ return new ObjectInstantiationNode(this, symbol);
+ }
+}
diff --git a/src/main/com/jantuomi/tunkki/exception/types/NotAPrototypeTunkkiError.java b/src/main/com/jantuomi/tunkki/exception/types/NotAPrototypeTunkkiError.java
new file mode 100644
index 0000000..db351bb
--- /dev/null
+++ b/src/main/com/jantuomi/tunkki/exception/types/NotAPrototypeTunkkiError.java
@@ -0,0 +1,20 @@
+package com.jantuomi.tunkki.exception.types;
+
+/**
+ * Created by jan on 29.8.2016.
+ */
+public class NotAPrototypeTunkkiError extends TunkkiError {
+ public NotAPrototypeTunkkiError(int line, String... args) {
+ super(line, args);
+ }
+
+ @Override
+ public String what() {
+ return "Symbol %s is not an object prototype.";
+ }
+
+ @Override
+ ExceptionType getType() {
+ return ExceptionType.NotAPrototypeError;
+ }
+}
diff --git a/src/main/com/jantuomi/tunkki/exception/types/TunkkiError.java b/src/main/com/jantuomi/tunkki/exception/types/TunkkiError.java
index dfef1cf..3bc4186 100644
--- a/src/main/com/jantuomi/tunkki/exception/types/TunkkiError.java
+++ b/src/main/com/jantuomi/tunkki/exception/types/TunkkiError.java
@@ -27,7 +27,8 @@ abstract public class TunkkiError extends Exception {
FileNotFoundError,
NotAnObjectError,
MissingTerminatorTokenError,
- NadaError
+ NadaError,
+ NotAPrototypeError
}
private int line;