aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjantuomi <jans.tuomi@gmail.com>2016-07-28 14:48:36 +0300
committerjantuomi <jans.tuomi@gmail.com>2016-07-28 14:48:36 +0300
commit0af434b287b7d702ab7fb669c4edccb53ba8e06f (patch)
treea661f64a0a0054c0bdfd1327f2a5fee9e3f15ab8 /src
parent33fde43199c0b9874d362ee13c8b752e7174527d (diff)
Handle some error cases
Diffstat (limited to 'src')
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/Parser.java2
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/ast/ASTNode.java16
-rw-r--r--src/main/com/jantuomi/tunkki/core/parser/ast/FunctionDefineNode.java18
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java4
-rw-r--r--src/main/com/jantuomi/tunkki/core/runtime/builtins/GetBuiltinFunction.java7
-rw-r--r--src/main/com/jantuomi/tunkki/core/tokenizer/token/types/FunctionDefineToken.java13
-rw-r--r--src/main/com/jantuomi/tunkki/exception/TunkkiError.java12
7 files changed, 53 insertions, 19 deletions
diff --git a/src/main/com/jantuomi/tunkki/core/parser/Parser.java b/src/main/com/jantuomi/tunkki/core/parser/Parser.java
index f95f329..88a056a 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/Parser.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/Parser.java
@@ -76,7 +76,7 @@ public class Parser {
if (stack.size() > 0) {
args.add(stack.pop());
} else {
- ExceptionManager.raise(TunkkiError.ExceptionType.ArgumentError, t.getLine(),
+ ExceptionManager.raise(TunkkiError.ExceptionType.FunctionArgumentError, t.getLine(),
t.toString(), Integer.toString(argumentInfo.getCount()));
return null;
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/ASTNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/ASTNode.java
index 2778928..4878105 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/ast/ASTNode.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/ast/ASTNode.java
@@ -19,6 +19,22 @@ abstract public class ASTNode {
this.source = token;
}
+ public String getText() {
+ if (source != null) {
+ return source.getText();
+ } else {
+ return "unknown node";
+ }
+ }
+
+ public int getLine() {
+ if (source != null) {
+ return source.getLine();
+ } else {
+ return -1;
+ }
+ }
+
public Token.Type tokenType() {
return source.getTokenType();
}
diff --git a/src/main/com/jantuomi/tunkki/core/parser/ast/FunctionDefineNode.java b/src/main/com/jantuomi/tunkki/core/parser/ast/FunctionDefineNode.java
index ec2862e..9d9c33b 100644
--- a/src/main/com/jantuomi/tunkki/core/parser/ast/FunctionDefineNode.java
+++ b/src/main/com/jantuomi/tunkki/core/parser/ast/FunctionDefineNode.java
@@ -5,6 +5,7 @@ import com.jantuomi.tunkki.core.parser.datatype.StringDataContainer;
import com.jantuomi.tunkki.core.runtime.Function;
import com.jantuomi.tunkki.core.runtime.State;
import com.jantuomi.tunkki.core.tokenizer.token.Token;
+import com.jantuomi.tunkki.exception.TunkkiError;
import java.util.ArrayList;
import java.util.List;
@@ -31,11 +32,16 @@ public class FunctionDefineNode extends VarargOperatorNode {
}
@Override
- public DataContainer evaluate() {
+ public DataContainer evaluate() throws TunkkiError {
List<String> argumentNames = new ArrayList<>();
- for (ASTNode arg : args) {
- SymbolNode argSym = (SymbolNode) arg;
- argumentNames.add(argSym.getName());
+ try {
+ for (ASTNode arg : args) {
+ SymbolNode argSym = (SymbolNode) arg;
+ argumentNames.add(argSym.getName());
+ }
+ }
+ catch (Exception ex) {
+ throw new TunkkiError(TunkkiError.ExceptionType.ExpectedTokenError, getLine(), getText());
}
Function function = new Function(argumentNames, (BlockBodyNode) body);
function.setName(name);
@@ -57,7 +63,7 @@ public class FunctionDefineNode extends VarargOperatorNode {
System.out.print("\t");
}
- System.out.println(String.format("Arguments: "));
+ System.out.println("Arguments: ");
for (ASTNode node : args) {
node.print(indent + 2);
@@ -67,7 +73,7 @@ public class FunctionDefineNode extends VarargOperatorNode {
System.out.print("\t");
}
- System.out.println(String.format("Body statements: "));
+ System.out.println("Body statements: ");
body.print(indent + 2);
}
}
diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
index 776fde0..4c531f7 100644
--- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
+++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/ContainsBuiltinFunction.java
@@ -19,11 +19,11 @@ public class ContainsBuiltinFunction extends BuiltinFunction {
@Override
public DataContainer evaluate(List<DataContainer> params) throws TunkkiError {
if (params.size() != 2) {
- throw new TunkkiError(TunkkiError.ExceptionType.ArgumentError, -1, getName(), DataContainer.toString(params));
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), DataContainer.toString(params));
}
if (params.get(0).getType() != DataContainer.Type.List) {
- throw new TunkkiError(TunkkiError.ExceptionType.ArgumentError, -1, getName(), DataContainer.toString(params));
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), DataContainer.toString(params));
}
ListDataContainer list = (ListDataContainer) params.get(0);
diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/GetBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/GetBuiltinFunction.java
index e9d10d1..59698bc 100644
--- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/GetBuiltinFunction.java
+++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/GetBuiltinFunction.java
@@ -1,6 +1,5 @@
package com.jantuomi.tunkki.core.runtime.builtins;
-import com.jantuomi.tunkki.core.parser.datatype.BooleanDataContainer;
import com.jantuomi.tunkki.core.parser.datatype.DataContainer;
import com.jantuomi.tunkki.core.parser.datatype.IntegerDataContainer;
import com.jantuomi.tunkki.core.parser.datatype.ListDataContainer;
@@ -20,15 +19,15 @@ public class GetBuiltinFunction extends BuiltinFunction {
@Override
public DataContainer evaluate(List<DataContainer> params) throws TunkkiError {
if (params.size() != 2) {
- throw new TunkkiError(TunkkiError.ExceptionType.ArgumentError, -1, getName(), params.toString());
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), params.toString());
}
if (params.get(0).getType() != DataContainer.Type.List) {
- throw new TunkkiError(TunkkiError.ExceptionType.ArgumentError, -1, getName(), DataContainer.toString(params));
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), DataContainer.toString(params));
}
if (params.get(1).getType() != DataContainer.Type.Integer) {
- throw new TunkkiError(TunkkiError.ExceptionType.ArgumentError, -1, getName(), DataContainer.toString(params));
+ throw new TunkkiError(TunkkiError.ExceptionType.FunctionArgumentError, -1, getName(), DataContainer.toString(params));
}
ListDataContainer list = (ListDataContainer) params.get(0);
diff --git a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/FunctionDefineToken.java b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/FunctionDefineToken.java
index 0a6c174..1ea99b7 100644
--- a/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/FunctionDefineToken.java
+++ b/src/main/com/jantuomi/tunkki/core/tokenizer/token/types/FunctionDefineToken.java
@@ -19,6 +19,11 @@ public class FunctionDefineToken extends VarargOperatorToken {
@Override
public ASTNode generateNode() throws TunkkiError {
FunctionDefineNode node = new FunctionDefineNode(this);
+
+ if (args.size() == 0) {
+ throw new TunkkiError(TunkkiError.ExceptionType.ExpectedTokenError, -1, getText(), getText());
+ }
+
node.setName(args.get(0).getText());
List<ASTNode> funcArgs = new ArrayList<>();
@@ -27,7 +32,13 @@ public class FunctionDefineToken extends VarargOperatorToken {
}
node.setArgs(funcArgs);
- BlockBodyNode bodyNode = (BlockBodyNode) args.get(args.size() - 1).generateNode();
+ BlockBodyNode bodyNode;
+ try {
+ bodyNode = (BlockBodyNode) args.get(args.size() - 1).generateNode();
+ }
+ catch (Exception ex) {
+ throw new TunkkiError(TunkkiError.ExceptionType.ExpectedTokenError, -1, getText());
+ }
node.setBody(bodyNode);
return node;
}
diff --git a/src/main/com/jantuomi/tunkki/exception/TunkkiError.java b/src/main/com/jantuomi/tunkki/exception/TunkkiError.java
index b75398a..5de905d 100644
--- a/src/main/com/jantuomi/tunkki/exception/TunkkiError.java
+++ b/src/main/com/jantuomi/tunkki/exception/TunkkiError.java
@@ -13,19 +13,21 @@ public class TunkkiError extends Exception {
IllegalTokenError,
SyntaxError,
TypeError,
- ArgumentError,
+ FunctionArgumentError,
+ ExpectedTokenError,
UndeclaredSymbolError,
IncludeError,
GeneralError
}
- public static Map<ExceptionType, String> errorTexts = new HashMap<>();
+ private static Map<ExceptionType, String> errorTexts = new HashMap<>();
static {
errorTexts.put(ExceptionType.IllegalTokenError, "Unknown or illegal token %s found.");
errorTexts.put(ExceptionType.SyntaxError, "Unexpected %s.");
errorTexts.put(ExceptionType.TypeError, "Incompatible types %s and %s.");
- errorTexts.put(ExceptionType.ArgumentError, "The parameter list given to function %s is either of wrong length or the parameters are of wrong type. Actual: %s");
+ errorTexts.put(ExceptionType.ExpectedTokenError, "Token '%s' expects a different token stack.");
+ errorTexts.put(ExceptionType.FunctionArgumentError, "The parameter list given to function %s is either of wrong length or the parameters are of wrong type. Actual: %s");
errorTexts.put(ExceptionType.UndeclaredSymbolError, "No symbol %s defined, parameters: [%s].");
errorTexts.put(ExceptionType.IncludeError, "File %s could not be included.");
errorTexts.put(ExceptionType.GeneralError, "%s");
@@ -40,9 +42,9 @@ public class TunkkiError extends Exception {
this.completeMessage = formatMessage(exceptionType.toString() + ": " + what(exceptionType), line, args);
}
- private static String formatMessage(String message, int line, String... args) {
+ private static String formatMessage(String message, int line, String... parameters) {
- message = String.format(message, args);
+ message = String.format(message, parameters);
if (line == -1) {
return "\n" + message;
} else {