diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2016-07-26 23:07:56 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2016-07-26 23:07:56 +0300 |
| commit | 83453cc7d7321f5d4a8d2af7704d4237262a0857 (patch) | |
| tree | e0cc092b942dac0ad2ba712dd917b6cab44594fb /src | |
| parent | 22ec5b89f053830f5ed3798abc28bd23ff7ca6a2 (diff) | |
Function calls are now made with call marker '?' and terminator token '!'.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/parser/Parser.java | 18 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/parser/ast/SymbolNode.java | 26 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java | 5 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java | 4 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java | 8 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallEndToken.java (renamed from src/main/com/jantuomi/tunkki/core/tokenizer/token/types/ClosedParenToken.java) | 6 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallToken.java | 40 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OpenParenToken.java | 34 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OptionalArgumentToken.java | 4 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/SymbolToken.java | 12 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/tokenizer/token/types/VarargOperatorToken.java | 4 |
11 files changed, 81 insertions, 80 deletions
diff --git a/src/main/com/jantuomi/tunkki/core/parser/Parser.java b/src/main/com/jantuomi/tunkki/core/parser/Parser.java index 02357aa..f95f329 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/Parser.java +++ b/src/main/com/jantuomi/tunkki/core/parser/Parser.java @@ -50,16 +50,14 @@ public class Parser { This branch is executed if the token has a variable list of arguments */ if (argumentInfo.getVarargs()) { - while (true) { - if (stack.size() > 0) { - Token arg = stack.pop(); - if (arg.getTokenType() != argumentInfo.getTerminator()) { - args.add(arg); - } - else { - args.add(arg); - break; - } + while (stack.size() > 0) { + Token arg = stack.pop(); + if (arg.getTokenType() != argumentInfo.getTerminator()) { + args.add(arg); + } + else { + args.add(arg); + break; } } } diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/SymbolNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/SymbolNode.java index 07c4d9c..9376206 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/ast/SymbolNode.java +++ b/src/main/com/jantuomi/tunkki/core/parser/ast/SymbolNode.java @@ -8,7 +8,6 @@ import com.jantuomi.tunkki.exception.TunkkiError; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -17,15 +16,15 @@ import java.util.stream.Collectors; */ public class SymbolNode extends ASTNode { - public ParameterListNode getParameterListNode() { - return parameterListNode; + public List<ASTNode> getParameters() { + return parameters; } - public void setParameterListNode(ParameterListNode parameterListNode) { - this.parameterListNode = parameterListNode; + public void setParameters(List<ASTNode> parameters) { + this.parameters = parameters; } - private ParameterListNode parameterListNode; + private List<ASTNode> parameters = new ArrayList<>(); public void setName(String name) { this.name = name; @@ -44,11 +43,14 @@ public class SymbolNode extends ASTNode { @Override public DataContainer evaluate() throws TunkkiError { List<DataContainer> paramValues = new ArrayList<>(); - if (parameterListNode != null) { - for (ASTNode param : parameterListNode.getChildren()) { - paramValues.add(param.evaluate()); + for (ASTNode param : parameters) { + DataContainer value = param.evaluate(); + if (value != null) { + paramValues.add(value); } + } + DataContainer returnValue = State.getInstance().getSymbolValue(name, paramValues); if (returnValue != null) { return returnValue; @@ -61,10 +63,6 @@ public class SymbolNode extends ASTNode { @Override List<ASTNode> getChildren() { - if (parameterListNode == null) { - return Arrays.asList(); - } else { - return Arrays.asList(parameterListNode); - } + return parameters; } } diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java b/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java index db04ca0..a92ffa5 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java @@ -54,7 +54,7 @@ public class Tokenizer { tokenRegexes.put(Token.Type.EqualsToken, "^(\\=\\=)"); tokenRegexes.put(Token.Type.NotEqualsToken, "^(\\!\\=)"); tokenRegexes.put(Token.Type.OpenParenToken, "^(\\()"); - tokenRegexes.put(Token.Type.ClosedParenToken, "^(\\))"); + 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"); @@ -63,7 +63,8 @@ public class Tokenizer { tokenRegexes.put(Token.Type.DeclarationToken, "^(decl)\\b"); tokenRegexes.put(Token.Type.BranchToken, "^(if)\\b"); - tokenRegexes.put(Token.Type.SymbolToken, "^([a-zA-Z]+\\w*)"); + tokenRegexes.put(Token.Type.CallToken, "^([a-zA-Z]+\\w*)\\?[\\s|\\!]"); + tokenRegexes.put(Token.Type.SymbolToken, "^([a-zA-Z]+\\w*)\\b"); discardedTokenTypes.add(Token.Type.WhitespaceToken); discardedTokenTypes.add(Token.Type.CommentToken); diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java index b976064..b67632a 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java @@ -48,7 +48,7 @@ abstract public class Token { NotEqualsToken, OpenParenToken, - ClosedParenToken, + CallEndToken, FunctionDefineToken, DeclarationToken, @@ -63,6 +63,8 @@ abstract public class Token { BranchToken, SymbolToken, + CallToken, + EndBlockToken, FunctionBodyToken, BranchBodyToken, diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java index 28c6bd2..ee77415 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java @@ -56,10 +56,10 @@ public class TokenFactory { return new AssignmentToken(); case SymbolToken: return new SymbolToken(text); - case OpenParenToken: - return new OpenParenToken(); - case ClosedParenToken: - return new ClosedParenToken(); + case CallToken: + return new CallToken(text, rawText); + case CallEndToken: + return new CallEndToken(); case BranchToken: return new BranchToken(); case NegationToken: diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/ClosedParenToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallEndToken.java index 4450818..5bf30d8 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/ClosedParenToken.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallEndToken.java @@ -5,9 +5,9 @@ import com.jantuomi.tunkki.core.parser.ast.ASTNode; /** * Created by jan on 19.6.2016. */ -public class ClosedParenToken extends TerminalToken { - public ClosedParenToken() { - super(Type.ClosedParenToken); +public class CallEndToken extends TerminalToken { + public CallEndToken() { + super(Type.CallEndToken); } @Override diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallToken.java new file mode 100644 index 0000000..fb925f2 --- /dev/null +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/CallToken.java @@ -0,0 +1,40 @@ +package com.jantuomi.tunkki.core.tokenizer.token.types; + +import com.jantuomi.tunkki.core.parser.ast.ASTNode; +import com.jantuomi.tunkki.core.parser.ast.SymbolNode; +import com.jantuomi.tunkki.core.tokenizer.token.Token; +import com.jantuomi.tunkki.exception.TunkkiError; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jan on 26.7.2016. + */ +public class CallToken extends VarargOperatorToken { + public CallToken(String text, String rawText) { + super(Type.CallToken, text, rawText); + } + + @Override + public ASTNode generateNode() throws TunkkiError { + SymbolNode node = new SymbolNode(this); + node.setName(this.getText()); + + List<ASTNode> arguments = new ArrayList<>(); + + for (Token token : args) { + ASTNode arg = token.generateNode(); + if (arg != null) { + arguments.add(arg); + } + } + node.setParameters(arguments); + return node; + } + + @Override + public Type getTerminatorTokenType() { + return Type.CallEndToken; + } +} diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OpenParenToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OpenParenToken.java deleted file mode 100644 index e5d55af..0000000 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OpenParenToken.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.jantuomi.tunkki.core.tokenizer.token.types; - -import com.jantuomi.tunkki.core.parser.ast.ASTNode; -import com.jantuomi.tunkki.core.parser.ast.ParameterListNode; -import com.jantuomi.tunkki.core.tokenizer.token.Token; -import com.jantuomi.tunkki.exception.TunkkiError; - -/** - * Created by jan on 19.6.2016. - */ -public class OpenParenToken extends VarargOperatorToken { - public OpenParenToken() { - super(Type.OpenParenToken); - } - - @Override - public ASTNode generateNode() throws TunkkiError { - ParameterListNode node = new ParameterListNode(this); - - for (Token token : args) { - if (token.getTokenType() == Type.ClosedParenToken) { - continue; - } - - node.addParameter(token.generateNode()); - } - return node; - } - - @Override - public Type getTerminatorTokenType() { - return Type.ClosedParenToken; - } -} diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OptionalArgumentToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OptionalArgumentToken.java index 42ac3f3..0f233e8 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OptionalArgumentToken.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/OptionalArgumentToken.java @@ -16,7 +16,7 @@ public abstract class OptionalArgumentToken extends Token { protected Token optionalArgument; - public void setOptionalArgument(OpenParenToken optionalArgument) { + public void setOptionalArgument(Token optionalArgument) { this.optionalArgument = optionalArgument; } @@ -32,7 +32,7 @@ public abstract class OptionalArgumentToken extends Token { @Override public Token setArguments(List<Token> args) { if (args.size() > 0) { - setOptionalArgument((OpenParenToken) args.get(0)); + setOptionalArgument(args.get(0)); } return this; } diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/SymbolToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/SymbolToken.java index 5e6c9df..eb98e7b 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/SymbolToken.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/SymbolToken.java @@ -1,14 +1,13 @@ package com.jantuomi.tunkki.core.tokenizer.token.types; import com.jantuomi.tunkki.core.parser.ast.ASTNode; -import com.jantuomi.tunkki.core.parser.ast.ParameterListNode; import com.jantuomi.tunkki.core.parser.ast.SymbolNode; import com.jantuomi.tunkki.exception.TunkkiError; /** * Created by jan on 16.6.2016. */ -public class SymbolToken extends OptionalArgumentToken { +public class SymbolToken extends TerminalToken { public SymbolToken(String name) { super(Type.SymbolToken, name); @@ -18,14 +17,7 @@ public class SymbolToken extends OptionalArgumentToken { public ASTNode generateNode() throws TunkkiError { SymbolNode node = new SymbolNode(this); node.setName(this.getText()); - if (optionalArgument != null) { - node.setParameterListNode((ParameterListNode) optionalArgument.generateNode()); - } - return node; - } - @Override - public Type getOptionalArgumentType() { - return Type.OpenParenToken; + return node; } } diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/VarargOperatorToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/VarargOperatorToken.java index 9344928..8df7fe2 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/VarargOperatorToken.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/VarargOperatorToken.java @@ -12,6 +12,10 @@ abstract public class VarargOperatorToken extends Token { protected List<Token> args; + public VarargOperatorToken(Type type, String text, String rawText) { + super(type, text, rawText); + } + public VarargOperatorToken(Type type, String text) { super(type, text); } |
