|
|
|
|
@ -57,6 +57,11 @@ class Interpreter: ExprVisitor<Any?>, StmtVisitor<Unit>{
|
|
|
|
|
|
|
|
|
|
environment.define(stmt.name.lexeme, null)
|
|
|
|
|
|
|
|
|
|
if (superClass != null) {
|
|
|
|
|
environment = Environment(environment)
|
|
|
|
|
environment.define("super", superClass)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val methods = stmt.methods.associate { method ->
|
|
|
|
|
val function = LoxFunction(method, environment, method.name.lexeme == "init")
|
|
|
|
|
method.name.lexeme to function
|
|
|
|
|
@ -64,6 +69,10 @@ class Interpreter: ExprVisitor<Any?>, StmtVisitor<Unit>{
|
|
|
|
|
|
|
|
|
|
val klass = LoxClass(stmt.name.lexeme, superClass, methods)
|
|
|
|
|
|
|
|
|
|
if (superClass != null) {
|
|
|
|
|
environment = environment.enclosing!!
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
environment.assign(stmt.name, klass)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -219,6 +228,15 @@ class Interpreter: ExprVisitor<Any?>, StmtVisitor<Unit>{
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun visitSuper(expr: Super): Any? {
|
|
|
|
|
val distance = locals[expr]
|
|
|
|
|
val superClass = environment.getAt(distance!!, "super") as LoxClass
|
|
|
|
|
val obj = environment.getAt(distance - 1, "this") as LoxInstance
|
|
|
|
|
val method = superClass.findMethod(expr.method.lexeme)
|
|
|
|
|
?: throw RuntimeError(expr.method, "Undefined property '${expr.method.lexeme}'")
|
|
|
|
|
return method.bind(obj)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun visitThis(expr: This): Any? {
|
|
|
|
|
return lookUpVariable(expr.keyword, expr)
|
|
|
|
|
}
|
|
|
|
|
|