diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2016-06-21 20:07:32 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2016-07-26 19:47:03 +0300 |
| commit | 45a2b88d584fc8bdee1fbaf0def1d9b55ba26eff (patch) | |
| tree | 1cf80f1b4384e27054c3cb2f90ac6f1953e89f35 /main/core/tokenizer | |
| parent | d745f000d6d60b9cdf0ba40dbf80660c1aa6bc61 (diff) | |
Added scopes, variables and functions
Diffstat (limited to 'main/core/tokenizer')
10 files changed, 115 insertions, 8 deletions
diff --git a/main/core/tokenizer/Tokenizer.java b/main/core/tokenizer/Tokenizer.java index 9aed09c..30bc86e 100644 --- a/main/core/tokenizer/Tokenizer.java +++ b/main/core/tokenizer/Tokenizer.java @@ -41,7 +41,7 @@ public class Tokenizer { tokenRegexes.put(Token.Type.SubtractionToken, "^(\\-)"); tokenRegexes.put(Token.Type.DivisionToken, "^(\\/)"); tokenRegexes.put(Token.Type.MultiplicationToken, "^(\\*)"); - tokenRegexes.put(Token.Type.AssignmentToken, "^(\\<\\-)"); + tokenRegexes.put(Token.Type.AssignmentToken, "^(set)\\b"); tokenRegexes.put(Token.Type.LessThanToken, "^(\\<)"); tokenRegexes.put(Token.Type.GreaterThanToken, "^(\\>)"); tokenRegexes.put(Token.Type.LessOrEqualThanToken, "^(\\<\\=)"); diff --git a/main/core/tokenizer/token/Token.java b/main/core/tokenizer/token/Token.java index 5248799..2582590 100644 --- a/main/core/tokenizer/token/Token.java +++ b/main/core/tokenizer/token/Token.java @@ -28,7 +28,7 @@ abstract public class Token { } } - abstract public ASTNode generateNode(); + abstract public ASTNode generateNode() throws InterpreterException; /* Token types, ordered by precedence */ public enum Type { @@ -165,6 +165,10 @@ abstract public class Token { return new EndFunctionDefineToken(); case FunctionBodyToken: return new FunctionBodyToken(); + case DeclarationToken: + return new VariableDeclareToken(); + case AssignmentToken: + return new AssignmentToken(); case SymbolToken: return new SymbolToken(text); case OpenParenToken: diff --git a/main/core/tokenizer/token/types/AdditionToken.java b/main/core/tokenizer/token/types/AdditionToken.java index 2d77b46..4623d73 100644 --- a/main/core/tokenizer/token/types/AdditionToken.java +++ b/main/core/tokenizer/token/types/AdditionToken.java @@ -2,6 +2,7 @@ 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.AdditionNode; +import com.jantuomi.interpreter.main.exception.InterpreterException; /** * Created by jan on 15.6.2016. @@ -12,7 +13,7 @@ public class AdditionToken extends BinaryOperatorToken { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { return new AdditionNode(this, lhs.generateNode(), rhs.generateNode() diff --git a/main/core/tokenizer/token/types/AssignmentToken.java b/main/core/tokenizer/token/types/AssignmentToken.java new file mode 100644 index 0000000..57f404c --- /dev/null +++ b/main/core/tokenizer/token/types/AssignmentToken.java @@ -0,0 +1,55 @@ +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.AssignmentNode; +import com.jantuomi.interpreter.main.core.parser.ast.SymbolNode; +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 20.6.2016. + */ +public class AssignmentToken extends Token { + + private Token lhs; + private Token rhs; + + public AssignmentToken() { + super(Type.AssignmentToken, "set"); + } + + // TODO this and the node + + @Override + public ASTNode generateNode() throws InterpreterException { + ASTNode lhsNode = lhs.generateNode(); + + if (!(lhsNode instanceof SymbolNode)) { + ExceptionManager.raise(InterpreterException.ExceptionType.SyntaxError, getLine(), "non-symbol " + toString()); + return null; + } + + AssignmentNode node = new AssignmentNode(this, + (SymbolNode) lhsNode, + rhs.generateNode() + ); + + return node; + } + + @Override + public Token setArguments(List<Token> args) { + this.lhs = args.get(0); + this.rhs = args.get(1); + return this; + } + + @Override + public List<Token> getChildren() { + return Arrays.asList(lhs, rhs); + } +} diff --git a/main/core/tokenizer/token/types/FunctionBodyToken.java b/main/core/tokenizer/token/types/FunctionBodyToken.java index 647ed55..f71e8a0 100644 --- a/main/core/tokenizer/token/types/FunctionBodyToken.java +++ b/main/core/tokenizer/token/types/FunctionBodyToken.java @@ -3,6 +3,7 @@ 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.FunctionBodyNode; import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.InterpreterException; import java.util.ArrayList; import java.util.List; @@ -16,7 +17,7 @@ public class FunctionBodyToken extends VarargOperatorToken { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { FunctionBodyNode node = new FunctionBodyNode(this); List<ASTNode> statements = new ArrayList<>(); for (int i = 0; i < args.size() - 1; i++) { diff --git a/main/core/tokenizer/token/types/FunctionDefineToken.java b/main/core/tokenizer/token/types/FunctionDefineToken.java index 6bbfd84..116d3db 100644 --- a/main/core/tokenizer/token/types/FunctionDefineToken.java +++ b/main/core/tokenizer/token/types/FunctionDefineToken.java @@ -3,6 +3,7 @@ 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.FunctionBodyNode; import com.jantuomi.interpreter.main.core.parser.ast.FunctionDefineNode; +import com.jantuomi.interpreter.main.exception.InterpreterException; import java.util.ArrayList; import java.util.List; @@ -16,7 +17,7 @@ public class FunctionDefineToken extends VarargOperatorToken { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { FunctionDefineNode node = new FunctionDefineNode(this); node.setName(args.get(0).getText()); diff --git a/main/core/tokenizer/token/types/OpenParenToken.java b/main/core/tokenizer/token/types/OpenParenToken.java index 07385c9..80b507c 100644 --- a/main/core/tokenizer/token/types/OpenParenToken.java +++ b/main/core/tokenizer/token/types/OpenParenToken.java @@ -3,6 +3,7 @@ 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.ParameterListNode; import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.InterpreterException; /** * Created by jan on 19.6.2016. @@ -13,7 +14,7 @@ public class OpenParenToken extends VarargOperatorToken { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { ParameterListNode node = new ParameterListNode(this); for (Token token : args) { diff --git a/main/core/tokenizer/token/types/SubtractionToken.java b/main/core/tokenizer/token/types/SubtractionToken.java index a1b9a83..9f7ff10 100644 --- a/main/core/tokenizer/token/types/SubtractionToken.java +++ b/main/core/tokenizer/token/types/SubtractionToken.java @@ -2,6 +2,7 @@ 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.SubtractionNode; +import com.jantuomi.interpreter.main.exception.InterpreterException; /** * Created by jan on 16.6.2016. @@ -12,7 +13,7 @@ public class SubtractionToken extends BinaryOperatorToken { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { return new SubtractionNode(this, lhs.generateNode(), rhs.generateNode() diff --git a/main/core/tokenizer/token/types/SymbolToken.java b/main/core/tokenizer/token/types/SymbolToken.java index b091ac9..d750921 100644 --- a/main/core/tokenizer/token/types/SymbolToken.java +++ b/main/core/tokenizer/token/types/SymbolToken.java @@ -4,6 +4,7 @@ import com.jantuomi.interpreter.main.core.parser.ast.ASTNode; import com.jantuomi.interpreter.main.core.parser.ast.ParameterListNode; import com.jantuomi.interpreter.main.core.parser.ast.SymbolNode; import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.InterpreterException; import java.util.Arrays; import java.util.List; @@ -24,7 +25,7 @@ public class SymbolToken extends Token { } @Override - public ASTNode generateNode() { + public ASTNode generateNode() throws InterpreterException { SymbolNode node = new SymbolNode(this); node.setName(this.getText()); if (callArgumentList != null) { diff --git a/main/core/tokenizer/token/types/VariableDeclareToken.java b/main/core/tokenizer/token/types/VariableDeclareToken.java new file mode 100644 index 0000000..1ec0826 --- /dev/null +++ b/main/core/tokenizer/token/types/VariableDeclareToken.java @@ -0,0 +1,42 @@ +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.SymbolNode; +import com.jantuomi.interpreter.main.core.parser.ast.VariableDeclareNode; +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 20.6.2016. + */ +public class VariableDeclareToken extends Token { + + private SymbolToken variable; + + public VariableDeclareToken() { + super(Type.DeclarationToken, "decl"); + } + + @Override + public ASTNode generateNode() throws InterpreterException { + VariableDeclareNode node = new VariableDeclareNode(this, + (SymbolNode) variable.generateNode()); + return node; + } + + @Override + public Token setArguments(List<Token> args) { + if (args.size() > 0) { + this.variable = (SymbolToken) args.get(0); + } + return this; + } + + @Override + public List<Token> getChildren() { + return Arrays.asList(variable); + } +} |
