public void VisitClassStmt(ClassStmt stmt) { environment.Define(stmt.Name.Lexeme, null); object superClass = null; if (stmt.SuperClass != null) { superClass = Evaluate(stmt.SuperClass); if (!(superClass is LoxClass)) { throw new RuntimeError(stmt.SuperClass.Name, "Superclass must be class."); } environment = new Environment(environment); environment.Define("super", superClass); } var methods = new Dictionary <string, LoxFunction>(); foreach (var method in stmt.Methods) { var function = new LoxFunction(method, environment, method.Name.Lexeme.Equals("init")); methods.Add(method.Name.Lexeme, function); } var klass = new LoxClass(stmt.Name.Lexeme, (LoxClass)superClass, methods); if (stmt.SuperClass != null) { environment = environment.Enclosing; } environment.Assign(stmt.Name, klass); }
public void VisitFunctionStmt(FunctionStmt stmt) { var function = new LoxFunction(stmt, environment, false); environment.Define(stmt.Name.Lexeme, function); }