From 98c3ebe59f90826f82dd9dede0cca182a2e34142 Mon Sep 17 00:00:00 2001 From: jantuomi Date: Thu, 28 Jul 2016 16:58:17 +0300 Subject: Add 'dset' keyword --- .../com/jantuomi/tunkki/core/parser/Parser.java | 4 +- .../tunkki/core/parser/ast/DeclareAssignNode.java | 45 ++++++++++++++++++++++ .../core/parser/datatype/ListDataContainer.java | 3 +- .../core/parser/datatype/StringDataContainer.java | 2 +- .../jantuomi/tunkki/core/tokenizer/Tokenizer.java | 3 +- .../tunkki/core/tokenizer/token/Token.java | 2 +- .../tunkki/core/tokenizer/token/TokenFactory.java | 2 + 7 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/main/com/jantuomi/tunkki/core/parser/ast/DeclareAssignNode.java (limited to 'src/main/com') diff --git a/src/main/com/jantuomi/tunkki/core/parser/Parser.java b/src/main/com/jantuomi/tunkki/core/parser/Parser.java index 88a056a..e686377 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/Parser.java +++ b/src/main/com/jantuomi/tunkki/core/parser/Parser.java @@ -76,8 +76,8 @@ public class Parser { if (stack.size() > 0) { args.add(stack.pop()); } else { - ExceptionManager.raise(TunkkiError.ExceptionType.FunctionArgumentError, t.getLine(), - t.toString(), Integer.toString(argumentInfo.getCount())); + ExceptionManager.raise(TunkkiError.ExceptionType.ExpectedDifferentTokenError, t.getLine(), + t.getText()); return null; } } diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/DeclareAssignNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/DeclareAssignNode.java new file mode 100644 index 0000000..6e951cb --- /dev/null +++ b/src/main/com/jantuomi/tunkki/core/parser/ast/DeclareAssignNode.java @@ -0,0 +1,45 @@ +package com.jantuomi.tunkki.core.parser.ast; + +import com.jantuomi.tunkki.core.parser.datatype.DataContainer; +import com.jantuomi.tunkki.core.parser.datatype.StringDataContainer; +import com.jantuomi.tunkki.core.runtime.State; +import com.jantuomi.tunkki.core.tokenizer.token.Token; +import com.jantuomi.tunkki.exception.TunkkiError; +import com.sun.java_cup.internal.runtime.Symbol; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +public class DeclareAssignNode extends BinaryOperatorNode { + public DeclareAssignNode(Token token, SymbolNode lhs, ASTNode rhs) { + super(token, lhs, rhs); + } + + @Override + public DataContainer evaluate() throws TunkkiError { + SymbolNode var; + try { + var = (SymbolNode) lhs; + } + catch (Exception ex) { + throw new TunkkiError(TunkkiError.ExceptionType.ExpectedDifferentTokenError, getLine(), getText()); + } + + State.getInstance().addSymbolToScope(var.getName()); + + DataContainer rValue = rhs.evaluate(); + State.getInstance().setSymbolValueToScope( + var.getName(), + rValue + ); + return rValue; + } + + @Override + List getChildren() { + return Arrays.asList(lhs, rhs); + } +} diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDataContainer.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDataContainer.java index b8afb9f..1557350 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDataContainer.java +++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/ListDataContainer.java @@ -22,8 +22,7 @@ public class ListDataContainer extends DataContainer> { @Override public String toString() { - List strings = getData().stream().map( dataContainer -> dataContainer.toString() ).collect(Collectors.toList()); - return String.format("[%s]", String.join(", ", strings)); + return DataContainer.toString(getData()); } @Override diff --git a/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDataContainer.java b/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDataContainer.java index 51d3805..caba77c 100644 --- a/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDataContainer.java +++ b/src/main/com/jantuomi/tunkki/core/parser/datatype/StringDataContainer.java @@ -19,7 +19,7 @@ public class StringDataContainer extends DataContainer { @Override public String toString() { - return getData(); + return String.format("\"%s\"", getData()); } @Override diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java b/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java index a92ffa5..a055074 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/Tokenizer.java @@ -46,7 +46,8 @@ public class Tokenizer { tokenRegexes.put(Token.Type.SubtractionToken, "^(\\-)"); tokenRegexes.put(Token.Type.DivisionToken, "^(\\/)"); tokenRegexes.put(Token.Type.MultiplicationToken, "^(\\*)"); - tokenRegexes.put(Token.Type.AssignmentToken, "^(set)\\b"); + tokenRegexes.put(Token.Type.DeclareAssignToken, "^(dset)\\b"); + tokenRegexes.put(Token.Type.AssignmentToken, "^(?)"); tokenRegexes.put(Token.Type.LessOrEqualThanToken, "^(\\<\\=)"); 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 b67632a..d689556 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/Token.java @@ -70,7 +70,7 @@ abstract public class Token { BranchBodyToken, NegationToken, - NotAToken + DeclareAssignToken, NotAToken } abstract public Token setArguments(List args); 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 ee77415..878b6ba 100644 --- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java +++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/TokenFactory.java @@ -54,6 +54,8 @@ public class TokenFactory { return new VariableDeclareToken(); case AssignmentToken: return new AssignmentToken(); + case DeclareAssignToken: + return new DeclareAssignToken(); case SymbolToken: return new SymbolToken(text); case CallToken: -- cgit v1.3