diff options
| author | jantuomi <jans.tuomi@gmail.com> | 2016-08-29 15:28:45 +0300 |
|---|---|---|
| committer | jantuomi <jans.tuomi@gmail.com> | 2016-08-29 15:28:45 +0300 |
| commit | ab048875e8f9b4861221c32751c5e503b3cafcb6 (patch) | |
| tree | 5fc456de2222678476257a501c003e7b70bcad0b /src/main/com | |
| parent | c561978dbc9612c3726ef02b8c08ec296e05e23d (diff) | |
Implement 'new' keyword for object instantiation
Add NotAPrototypeError
Diffstat (limited to 'src/main/com')
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; |
