Пример #1
0
        public void Visit(ASTMemberFunction functionDeclaration)
        {
            var _class = _environment.FindClass(functionDeclaration.BaseClass);

            if (_class == null)
            {
                throw new CompilerException($"Class '{functionDeclaration.BaseClass}' does not exist.");
            }

            var function = _class.FindFunction(functionDeclaration.Name);

            if (function == null)
            {
                throw new CompilerException($"Class '{functionDeclaration.BaseClass}' does not define function '{functionDeclaration.Name}'.");
            }

            for (int i = functionDeclaration.Arguments.Count - 1; i >= 0; i--)
            {
                function.Code.Write(OpCodeFactory.Set(ObjectFactory.String(functionDeclaration.Arguments[i])));
                function.Code.Write(OpCodeFactory.Pop);
            }

            if (functionDeclaration.Body != null)
            {
                functionDeclaration.Body.Accept(this, function);

                // We add this in case the user explicitly doesn't return anything in which case the function is void.
                function.Code.Write(OpCodeFactory.Push(ObjectFactory.Null));
                function.Code.Write(OpCodeFactory.Return);
            }
        }
Пример #2
0
        private void CreateGeneralClasses()
        {
            // TODO: work on class implementation
            var table = new Class("table");
            var func  = new Function("count", new List <string> {
                "tname"
            });

            func.Code.Write(OpCodeFactory.Set(ObjectFactory.String("tname")));
            func.Code.Write(OpCodeFactory.Pop);
            func.Code.Write(OpCodeFactory.Reference(ObjectFactory.String("tname")));
            func.Code.Write(OpCodeFactory.Return);
            table.AddFunction(func);
            var constructor = new Function("table", new List <string>());

            constructor.Code.Write(OpCodeFactory.Push(ObjectFactory.Null));
            constructor.Code.Write(OpCodeFactory.Return);
            table.AddFunction(constructor);
            _classes.Add(table);
        }
Пример #3
0
        public void Visit(ASTGlobalFunction functionDeclaration)
        {
            var newFunction = ObjectFactory.Function(functionDeclaration.Name, functionDeclaration.Arguments);

            _environment.AddFunction(newFunction);

            for (int i = functionDeclaration.Arguments.Count - 1; i >= 0; i--)
            {
                newFunction.Code.Write(OpCodeFactory.Set(ObjectFactory.String(functionDeclaration.Arguments[i])));
                newFunction.Code.Write(OpCodeFactory.Pop);
            }

            if (functionDeclaration.Body != null)
            {
                functionDeclaration.Body.Accept(this, newFunction);

                // We add this in case the user explicitly doesn't return anything in which case the function is void.
                newFunction.Code.Write(OpCodeFactory.Push(ObjectFactory.Null));
                newFunction.Code.Write(OpCodeFactory.Return);
            }
        }