Ejemplo n.º 1
0
        public object VisitFunctionStatement(FunctionStatement statement)
        {
            var function = new LoxFunction(statement, environment);

            environment.Define(statement.Name, function);

            return(null);
        }
Ejemplo n.º 2
0
        public object VisitClassStatement(ClassStatement statement)
        {
            object superclass = null;

            if (statement.Superclass != null)
            {
                superclass = Evaluate(statement.Superclass);

                if (!(superclass is LoxClass))
                {
                    throw new LoxRunTimeException(statement.Superclass.Name, "Superclass must be a class.");
                }
            }

            environment.Define(statement.Name, null);

            if (statement.Superclass != null)
            {
                environment = new Environment(environment);
                environment.Define(superToken, superclass);
            }

            var methods = new Dictionary <string, LoxFunction>();

            foreach (var method in statement.Methods)
            {
                var function = new LoxFunction(method, environment, LoxClass.IsInitializer(method));
                methods.Add(method.Name.Lexeme, function);
            }

            var loxClass = new LoxClass(statement.Name.Lexeme, (LoxClass)superclass, methods);

            if (superclass != null)
            {
                environment = environment.Enclosing;
            }

            environment.Assign(statement.Name, loxClass);

            return(null);
        }