57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
from smnp.ast.parser import parse
|
|
from smnp.environment.environment import Environment
|
|
from smnp.error.runtime import RuntimeException
|
|
from smnp.module import functions, methods
|
|
from smnp.program.FileReader import readLines
|
|
from smnp.runtime.evaluator import evaluate
|
|
from smnp.token.tokenizer import tokenize
|
|
|
|
|
|
class Interpreter:
|
|
|
|
@staticmethod
|
|
def interpretString(string, source, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
|
return Interpreter._interpret(
|
|
string.splitlines(),
|
|
source,
|
|
printTokens,
|
|
printAst,
|
|
execute,
|
|
baseEnvironment,
|
|
)
|
|
|
|
@staticmethod
|
|
def interpretFile(file, printTokens=False, printAst=False, execute=True, baseEnvironment=None, source=None):
|
|
return Interpreter._interpret(
|
|
readLines(file),
|
|
source if source is not None else file,
|
|
printTokens,
|
|
printAst,
|
|
execute,
|
|
baseEnvironment,
|
|
)
|
|
|
|
@staticmethod
|
|
def _interpret(lines, source, printTokens=False, printAst=False, execute=True, baseEnvironment=None):
|
|
environment = Environment([{}], functions, methods, source=source)
|
|
|
|
if baseEnvironment is not None:
|
|
environment.extend(baseEnvironment)
|
|
|
|
try:
|
|
tokens = tokenize(lines)
|
|
if printTokens:
|
|
print(tokens)
|
|
|
|
ast = parse(tokens)
|
|
if printAst:
|
|
ast.print()
|
|
|
|
if execute:
|
|
evaluate(ast, environment)
|
|
|
|
return environment
|
|
except RuntimeException as e:
|
|
e.environment = environment
|
|
e.file = environment.source
|
|
raise e |