aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/com/jantuomi/borker/exception
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/com/jantuomi/borker/exception')
-rw-r--r--src/main/com/jantuomi/borker/exception/ExceptionManager.java21
-rw-r--r--src/main/com/jantuomi/borker/exception/InterpreterException.java53
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);
+ }
+}