diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2016-06-21 21:37:09 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2016-07-26 19:47:06 +0300 |
| commit | 50dd5dc0caa4e37a37123845cb2f8cf02a7dd945 (patch) | |
| tree | d4107b9cf961e660f1e6eabee6b33f462abfed23 | |
| parent | 885fb97dae384112110eb2980d80f45937637896 (diff) | |
Add negation operator
| -rw-r--r-- | main/core/parser/ast/NegationNode.java | 34 | ||||
| -rw-r--r-- | main/core/parser/ast/UnaryOperatorNode.java | 31 | ||||
| -rw-r--r-- | main/core/tokenizer/Tokenizer.java | 1 | ||||
| -rw-r--r-- | main/core/tokenizer/token/Token.java | 4 | ||||
| -rw-r--r-- | main/core/tokenizer/token/types/NegationToken.java | 37 | ||||
| -rw-r--r-- | test/resources/program.bork | 5 |
6 files changed, 110 insertions, 2 deletions
diff --git a/main/core/parser/ast/NegationNode.java b/main/core/parser/ast/NegationNode.java new file mode 100644 index 0000000..ec3be2a --- /dev/null +++ b/main/core/parser/ast/NegationNode.java @@ -0,0 +1,34 @@ +package com.jantuomi.interpreter.main.core.parser.ast; + +import com.jantuomi.interpreter.main.core.parser.datatype.BooleanDataContainer; +import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.parser.datatype.IntegerDataContainer; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +/** + * Created by jan on 21.6.2016. + */ +public class NegationNode extends UnaryOperatorNode { + public NegationNode(Token token, ASTNode operand) { + super(token, operand); + } + + @Override + public DataContainer evaluate() throws InterpreterException { + DataContainer d = getOperand().evaluate(); + + if (d instanceof BooleanDataContainer) { + return new BooleanDataContainer(!((BooleanDataContainer) d).getData()); + } + else if (d instanceof IntegerDataContainer) { + return new BooleanDataContainer( + ((IntegerDataContainer) d).getData() != 0 + ); + } + ExceptionManager.raise(InterpreterException.ExceptionType.TypeError, -1, "not", d.toString()); + return null; + + } +} diff --git a/main/core/parser/ast/UnaryOperatorNode.java b/main/core/parser/ast/UnaryOperatorNode.java new file mode 100644 index 0000000..283f07d --- /dev/null +++ b/main/core/parser/ast/UnaryOperatorNode.java @@ -0,0 +1,31 @@ +package com.jantuomi.interpreter.main.core.parser.ast; + +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +abstract public class UnaryOperatorNode extends ASTNode { + public UnaryOperatorNode(Token token, ASTNode operand) { + super(token); + this.operand = operand; + } + + public ASTNode getOperand() { + return operand; + } + + public void setOperand(ASTNode operand) { + this.operand = operand; + } + + private ASTNode operand; + + @Override + List<ASTNode> getChildren() { + return Arrays.asList(operand); + } +} diff --git a/main/core/tokenizer/Tokenizer.java b/main/core/tokenizer/Tokenizer.java index 8837ad1..35bf7da 100644 --- a/main/core/tokenizer/Tokenizer.java +++ b/main/core/tokenizer/Tokenizer.java @@ -54,6 +54,7 @@ public class Tokenizer { 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.IntegerLiteralToken, "^(\\d+)"); diff --git a/main/core/tokenizer/token/Token.java b/main/core/tokenizer/token/Token.java index 436160a..a9b66e8 100644 --- a/main/core/tokenizer/token/Token.java +++ b/main/core/tokenizer/token/Token.java @@ -58,6 +58,7 @@ abstract public class Token { EndBlockToken, FunctionBodyToken, BranchBodyToken, + NegationToken, NotAToken } @@ -185,6 +186,8 @@ abstract public class Token { return new ClosedParenToken(); case BranchToken: return new BranchToken(); + case NegationToken: + return new NegationToken(); default: ExceptionManager.raise(InterpreterException.ExceptionType.IllegalTokenError, line, type.toString() @@ -232,6 +235,7 @@ abstract public class Token { case BranchToken: return new ArgumentInfo(2); case DeclarationToken: + case NegationToken: return new ArgumentInfo(1); default: return new ArgumentInfo(0); diff --git a/main/core/tokenizer/token/types/NegationToken.java b/main/core/tokenizer/token/types/NegationToken.java new file mode 100644 index 0000000..5658f10 --- /dev/null +++ b/main/core/tokenizer/token/types/NegationToken.java @@ -0,0 +1,37 @@ +package com.jantuomi.interpreter.main.core.tokenizer.token.types; + +import com.jantuomi.interpreter.main.core.parser.ast.ASTNode; +import com.jantuomi.interpreter.main.core.parser.ast.NegationNode; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +public class NegationToken extends Token { + + private Token operand; + + public NegationToken() { + super(Type.NegationToken, "not"); + } + + @Override + public ASTNode generateNode() throws InterpreterException { + return new NegationNode(this, operand.generateNode()); + } + + @Override + public Token setArguments(List<Token> args) { + operand = args.get(0); + return this; + } + + @Override + public List<Token> getChildren() { + return Arrays.asList(operand); + } +} diff --git a/test/resources/program.bork b/test/resources/program.bork index 3638ce8..b79b0bd 100644 --- a/test/resources/program.bork +++ b/test/resources/program.bork @@ -12,8 +12,9 @@ set y 20 sum(x y) */ -decl var set var true +decl var +set var true -if var then +if not var then "var on tosi!" end
\ No newline at end of file |
