Files
smnp-py/smnp/program/interpreter.py
2019-07-13 15:06:53 +02:00

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