Add 'source' to RuntimeException
This commit is contained in:
@@ -6,13 +6,14 @@ from smnp.type.model import Type
|
|||||||
|
|
||||||
|
|
||||||
class Environment():
|
class Environment():
|
||||||
def __init__(self, scopes, functions, methods):
|
def __init__(self, scopes, functions, methods, source):
|
||||||
self.scopes = scopes
|
self.scopes = scopes
|
||||||
self.functions = functions
|
self.functions = functions
|
||||||
self.methods = methods
|
self.methods = methods
|
||||||
self.customFunctions = []
|
self.customFunctions = []
|
||||||
self.customMethods = []
|
self.customMethods = []
|
||||||
self.callStack = []
|
self.callStack = []
|
||||||
|
self.source = source
|
||||||
|
|
||||||
def invokeMethod(self, object, name, args):
|
def invokeMethod(self, object, name, args):
|
||||||
builtinMethodResult = self._invokeBuiltinMethod(object, name, args)
|
builtinMethodResult = self._invokeBuiltinMethod(object, name, args)
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
from smnp.environment.environment import Environment
|
|
||||||
from smnp.module import functions, methods
|
|
||||||
|
|
||||||
|
|
||||||
def createEnvironment():
|
def createEnvironment():
|
||||||
return Environment([{}], functions, methods)
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ class SmnpException(Exception):
|
|||||||
def __init__(self, msg, pos):
|
def __init__(self, msg, pos):
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
|
self.file = None
|
||||||
|
|
||||||
def _title(self):
|
def _title(self):
|
||||||
pass
|
pass
|
||||||
@@ -10,7 +11,10 @@ class SmnpException(Exception):
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
def _position(self):
|
def _position(self):
|
||||||
return "" if self.pos is None else f" [line {self.pos[0]+1}, col {self.pos[1]+1}]"
|
return "" if self.pos is None else f"[line {self.pos[0]+1}, col {self.pos[1]+1}]"
|
||||||
|
|
||||||
|
def _file(self):
|
||||||
|
return "" if self.file is None else f"File: {self.file}"
|
||||||
|
|
||||||
def message(self):
|
def message(self):
|
||||||
return f"{self._title()}{self._position()}:\n{self.msg}\n{self._postMessage()}"
|
return f"{self._title()}\n{self._file()} {self._position()}\n\n{self.msg}\n{self._postMessage()}"
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
from smnp.error.base import SmnpException
|
from smnp.error.runtime import RuntimeException
|
||||||
|
|
||||||
|
|
||||||
class CustomException(SmnpException):
|
class CustomException(RuntimeException):
|
||||||
def __init__(self, message, pos):
|
def __init__(self, message, pos):
|
||||||
super().__init__(message, pos)
|
super().__init__(message, pos)
|
||||||
|
|
||||||
def _title(self):
|
def _title(self):
|
||||||
return "Execution Error"
|
return "Execution Error"
|
||||||
|
|
||||||
|
def _postMessage(self):
|
||||||
|
return "\n" + self.environment.callStackToString() if len(self.environment.callStack) > 0 else ""
|
||||||
@@ -5,5 +5,5 @@ from smnp.program.interpreter import Interpreter
|
|||||||
|
|
||||||
def loadStandardLibrary():
|
def loadStandardLibrary():
|
||||||
mainSource = resource_string('smnp.library.code', 'main.mus').decode("utf-8")
|
mainSource = resource_string('smnp.library.code', 'main.mus').decode("utf-8")
|
||||||
env = Interpreter.interpretString(mainSource)
|
env = Interpreter.interpretString(mainSource, "<stdlib>")
|
||||||
return env
|
return env
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from smnp.ast.parser import parse
|
from smnp.ast.parser import parse
|
||||||
from smnp.environment.factory import createEnvironment
|
from smnp.environment.environment import Environment
|
||||||
from smnp.error.runtime import RuntimeException
|
from smnp.error.runtime import RuntimeException
|
||||||
|
from smnp.module import functions, methods
|
||||||
from smnp.program.FileReader import readLines
|
from smnp.program.FileReader import readLines
|
||||||
from smnp.runtime.evaluator import evaluate
|
from smnp.runtime.evaluator import evaluate
|
||||||
from smnp.token.tokenizer import tokenize
|
from smnp.token.tokenizer import tokenize
|
||||||
@@ -9,16 +10,31 @@ from smnp.token.tokenizer import tokenize
|
|||||||
class Interpreter:
|
class Interpreter:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def interpretString(string, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
def interpretString(string, source, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
||||||
return Interpreter._interpret(string.splitlines(), printTokens, printAst, execute, baseEnvironment)
|
return Interpreter._interpret(
|
||||||
|
string.splitlines(),
|
||||||
|
source,
|
||||||
|
printTokens,
|
||||||
|
printAst,
|
||||||
|
execute,
|
||||||
|
baseEnvironment,
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def interpretFile(file, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
def interpretFile(file, printTokens=False, printAst=False, execute=True, baseEnvironment=None, source=None):
|
||||||
return Interpreter._interpret(readLines(file), printTokens, printAst, execute, baseEnvironment)
|
return Interpreter._interpret(
|
||||||
|
readLines(file),
|
||||||
|
source if source is not None else file,
|
||||||
|
printTokens,
|
||||||
|
printAst,
|
||||||
|
execute,
|
||||||
|
baseEnvironment,
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _interpret(lines, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
def _interpret(lines, source, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
||||||
environment = createEnvironment()
|
environment = Environment([{}], functions, methods, source=source)
|
||||||
|
|
||||||
if baseEnvironment is not None:
|
if baseEnvironment is not None:
|
||||||
environment.extend(baseEnvironment)
|
environment.extend(baseEnvironment)
|
||||||
|
|
||||||
@@ -37,4 +53,5 @@ class Interpreter:
|
|||||||
return environment
|
return environment
|
||||||
except RuntimeException as e:
|
except RuntimeException as e:
|
||||||
e.environment = environment
|
e.environment = environment
|
||||||
|
e.file = environment.source
|
||||||
raise e
|
raise e
|
||||||
Reference in New Issue
Block a user