Refactor LanguageModuleInterpreter and its dependencies

This commit is contained in:
2020-03-13 13:07:30 +01:00
parent 1c7b56159a
commit a5fba7e8b1
7 changed files with 43 additions and 39 deletions

View File

@@ -10,7 +10,8 @@ import io.smnp.runtime.model.CallStack
import io.smnp.type.model.Value
import io.smnp.type.module.Module
class DefaultEnvironment(private val rootModule: Module = Module.create("<root>")) : Environment {
class DefaultEnvironment : Environment {
private val rootModule = Module.create("<root>")
private val loadedModules = mutableListOf<String>()
private val callStack = CallStack()
@@ -105,4 +106,6 @@ class DefaultEnvironment(private val rootModule: Module = Module.create("<root>"
override fun setVariable(name: String, value: Value) = callStack.top().setVariable(name, value)
override fun getVariable(name: String) = callStack.top().getVariable(name)
override fun getRootModule() = rootModule
}

View File

@@ -13,12 +13,13 @@ class DefaultInterpreter : Interpreter {
private val parser = RootParser()
private val evaluator = RootEvaluator()
fun run(code: String, printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false) {
fun run(code: String, printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false): Environment {
val lines = code.split("\n")
run(lines, printTokens, printAst, dryRun)
return run(lines, printTokens, printAst, dryRun)
}
private fun run(lines: List<String>, printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false) {
private fun run(lines: List<String>, printTokens: Boolean, printAst: Boolean, dryRun: Boolean): Environment {
val environment = createEnvironment()
val tokens = tokenizer.tokenize(lines)
val ast = parser.parse(tokens)
@@ -26,13 +27,14 @@ class DefaultInterpreter : Interpreter {
if(printAst) ast.node.pretty()
if(!dryRun) {
val environment = createEnvironment()
val result = evaluator.evaluate(ast.node, environment)
if(result.result == EvaluationResult.FAILED) {
throw RuntimeException("Evaluation failed")
}
}
return environment
}
private fun createEnvironment(): Environment {
@@ -42,9 +44,9 @@ class DefaultInterpreter : Interpreter {
return environment
}
fun run(file: File, printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false) {
fun run(file: File, printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false): Environment {
val lines = file.readLines()
run(lines, printTokens, printAst, dryRun)
return run(lines, printTokens, printAst, dryRun)
}
override fun run(code: String) = run(code, printTokens = false, printAst = false, dryRun = false)

View File

@@ -21,26 +21,17 @@ class LanguageModuleInterpreter : Interpreter {
), "function definition or extend statement")
)
override fun updateRootModule(newRootModule: Module) {
rootModule = newRootModule
}
override fun run(code: String) {
override fun run(code: String): Environment {
val lines = code.split("\n")
val tokens = tokenizer.tokenize(lines)
val ast = parser.parse(tokens)
val environment = createEnvironment()
val environment = DefaultEnvironment()
val result = evaluator.evaluate(ast.node, environment)
if (result.result == EvaluationResult.FAILED) {
throw RuntimeException("Evaluation failed")
}
}
private fun createEnvironment(): Environment {
val environment = DefaultEnvironment(rootModule)
environment.loadModule("smnp.lang")
return environment
}