Enable importing other source files

This commit is contained in:
Bartłomiej Pluta
2019-07-08 22:32:59 +02:00
parent 38df0bf8df
commit d4b4aa48ee
7 changed files with 59 additions and 16 deletions

View File

@@ -120,6 +120,11 @@ class Environment():
def customMethodsToString(self):
return "Custom Methods:\n" + ("\n".join([ f" {function.name}(...)" for function in self.customMethods ]))
def extend(self, environment):
self.scopes[0].update(environment.scopes[0])
self.customFunctions.extend(environment.customFunctions)
self.customMethods.extend(environment.customMethods)
def __str__(self):
return f"{self.scopesToString()}\n{self.functionsToString()}\n{self.methodsToString()}\n{self.customFunctionsToString()}\n{self.customMethodsToString()}"

View File

@@ -1,28 +1,15 @@
import sys
from smnp.ast.parser import parse
from smnp.environment.factory import createEnvironment
from smnp.error.base import SmnpException
from smnp.runtime.evaluator import evaluate
from smnp.token.tokenizer import tokenize
from smnp.program.interpreter import Interpreter
def main():
try:
with open(sys.argv[1], 'r') as source:
lines = [line.rstrip('\n') for line in source.readlines()]
tokens = tokenize(lines)
ast = parse(tokens)
ast.print()
env = createEnvironment()
evaluate(ast, env)
Interpreter.interpretFile(sys.argv[1])
except SmnpException as e:
print(e.message())
except KeyboardInterrupt:
print("Program interrupted")

View File

@@ -0,0 +1,3 @@
def readLines(file):
with open(file, 'r') as source:
return [line.rstrip('\n') for line in source.readlines()]

0
smnp/program/__init__.py Normal file
View File

View File

@@ -0,0 +1,26 @@
from smnp.ast.parser import parse
from smnp.environment.factory import createEnvironment
from smnp.program.FileReader import readLines
from smnp.runtime.evaluator import evaluate
from smnp.token.tokenizer import tokenize
class Interpreter:
@staticmethod
def interpretFile(file, printTokens=False, printAst=False):
lines = readLines(file)
tokens = tokenize(lines)
if printTokens:
print(tokens)
ast = parse(tokens)
if printAst:
ast.print()
environment = createEnvironment()
evaluate(ast, environment)
return environment

View File

@@ -1,6 +1,7 @@
from smnp.ast.node.block import BlockNode
from smnp.ast.node.extend import ExtendNode
from smnp.ast.node.function import FunctionDefinitionNode
from smnp.ast.node.imports import ImportNode
from smnp.ast.node.program import Program
from smnp.error.runtime import RuntimeException
from smnp.type.model import Type
@@ -71,8 +72,10 @@ def evaluate(node, environment):
from smnp.runtime.evaluators.function import FunctionDefinitionEvaluator
from smnp.runtime.evaluators.extend import ExtendEvaluator
from smnp.runtime.evaluators.block import BlockEvaluator
from smnp.runtime.evaluators.imports import ImportEvaluator
result = Evaluator.oneOf(
Evaluator.forNodes(ProgramEvaluator.evaluate, Program),
Evaluator.forNodes(ImportEvaluator.evaluate, ImportNode),
Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinitionNode),
Evaluator.forNodes(ExtendEvaluator.evaluate, ExtendNode),
Evaluator.forNodes(BlockEvaluator.evaluate, BlockNode),

View File

@@ -0,0 +1,19 @@
from smnp.ast.node.none import NoneNode
from smnp.program.interpreter import Interpreter
from smnp.runtime.evaluator import Evaluator
class ImportEvaluator(Evaluator):
@classmethod
def evaluator(cls, node, environment):
if type(node.type) == NoneNode:
cls._evaluateCodeImport(node, environment)
else:
raise RuntimeError("Importing types is not implemented yet")
@classmethod
def _evaluateCodeImport(cls, node, environment):
source = node.source
newEnvironment = Interpreter.interpretFile(source.value)
environment.extend(newEnvironment)