diff options
Diffstat (limited to 'src/main/com/jantuomi/borker/exception')
| -rw-r--r-- | src/main/com/jantuomi/borker/exception/ExceptionManager.java | 21 | ||||
| -rw-r--r-- | src/main/com/jantuomi/borker/exception/InterpreterException.java | 53 |
2 files changed, 74 insertions, 0 deletions
diff --git a/src/main/com/jantuomi/borker/exception/ExceptionManager.java b/src/main/com/jantuomi/borker/exception/ExceptionManager.java new file mode 100644 index 0000000..b9b302b --- /dev/null +++ b/src/main/com/jantuomi/borker/exception/ExceptionManager.java @@ -0,0 +1,21 @@ +package com.jantuomi.borker.exception; + +/** + * Created by jan on 10.6.2016. + */ +public class ExceptionManager { + + private static final ExceptionManager instance = new ExceptionManager(); + + private ExceptionManager() { + } + + public static ExceptionManager getInstance() { + return instance; + } + + public static void raise(InterpreterException.ExceptionType ex, int line, String... args) throws InterpreterException { + InterpreterException e = new InterpreterException(ex, line, args); + throw e; + } +} diff --git a/src/main/com/jantuomi/borker/exception/InterpreterException.java b/src/main/com/jantuomi/borker/exception/InterpreterException.java new file mode 100644 index 0000000..153da0a --- /dev/null +++ b/src/main/com/jantuomi/borker/exception/InterpreterException.java @@ -0,0 +1,53 @@ +package com.jantuomi.borker.exception; + + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by jan on 12.6.2016. + */ +public class InterpreterException extends Exception { + + public enum ExceptionType { + IllegalTokenError, + SyntaxError, + TypeError, + ArgumentError, + UndeclaredSymbolError + } + + public 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.UndeclaredSymbolError, "No symbol %s defined, parameters: [%s]."); + } + + private ExceptionType exceptionType; + private String completeMessage; + + public InterpreterException(ExceptionType exceptionType, int line, String... args) { + super(exceptionType.toString(), null, false, false); + this.exceptionType = exceptionType; + this.completeMessage = formatMessage(exceptionType.toString() + ": " + what(exceptionType), line, args); + } + + private static String formatMessage(String message, int line, String... args) { + + message = String.format(message, args); + return String.format("\nline %d: ", line) + message; + } + + public static String what(ExceptionType type) { + return errorTexts.get(type); + } + + @Override + public void printStackTrace() { + System.err.println(completeMessage); + } +} |
