Enable importing other source files
This commit is contained in:
@@ -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()}"
|
||||
|
||||
19
smnp/main.py
19
smnp/main.py
@@ -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")
|
||||
|
||||
3
smnp/program/FileReader.py
Normal file
3
smnp/program/FileReader.py
Normal 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
0
smnp/program/__init__.py
Normal file
26
smnp/program/interpreter.py
Normal file
26
smnp/program/interpreter.py
Normal 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
|
||||
@@ -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),
|
||||
|
||||
19
smnp/runtime/evaluators/imports.py
Normal file
19
smnp/runtime/evaluators/imports.py
Normal 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)
|
||||
Reference in New Issue
Block a user