diff options
| author | jantuomi <jans.tuomi@gmail.com> | 2016-07-28 14:48:36 +0300 |
|---|---|---|
| committer | jantuomi <jans.tuomi@gmail.com> | 2016-07-28 14:48:36 +0300 |
| commit | 0af434b287b7d702ab7fb669c4edccb53ba8e06f (patch) | |
| tree | a661f64a0a0054c0bdfd1327f2a5fee9e3f15ab8 /src | |
| parent | 33fde43199c0b9874d362ee13c8b752e7174527d (diff) | |
Handle some error cases
Diffstat (limited to 'src')
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 { |
