Exemple #1
0
            public SkryptObject Sort(SkryptEngine engine, SkryptObject self, SkryptObject[] values)
            {
                var m = TypeConverter.ToMethod(values, 0);

                if (m.Parameters.Count < 2)
                {
                    engine.ThrowError("Input function must have 2 parameters!");
                }

                ((Array)self).List.Sort((x, y) => {
                    var scope         = SkryptMethod.GetPopulatedScope(m, new[] { x, y });
                    scope.ParentScope = ScopeContext;

                    var r = m.Execute(engine, self, new[] { x, y }, scope);

                    if (r.ReturnObject.ToBoolean())
                    {
                        return(1);
                    }
                    else
                    {
                        return(-1);
                    }
                });

                return(self);
            }
Exemple #2
0
        static public Variable ExecuteMethodDeclaration(node methodNode)
        {
            //string type = methodNode.nodes[0].body;
            string Identifier = methodNode.nodes[0].body;

            string[] args = new string[methodNode.nodes[1].nodes.Count];

            int i = 0;

            foreach (node argNode in methodNode.nodes[1].nodes)
            {
                args[i] = argNode.body;
                i++;
            }

            node body = methodNode.nodes[2];

            if (!MethodHandler.Exists(Identifier))
            {
                MethodHandler.Add(Identifier, args, body);
            }
            else
            {
                SkryptMethod found = MethodHandler.GetSk(Identifier);

                int foundIndex = MethodContainer.SKmethods.IndexOf(found);

                MethodContainer.SKmethods[foundIndex].methodNode = body;
            }

            Variable returnVariable = new Variable(Identifier, "method", body);

            return(returnVariable);
        }
            static public Method Add(string identifier, string[] arguments, node methodNode)
            {
                SkryptMethod method = new SkryptMethod(
                    identifier,
                    //returnType,
                    arguments,
                    methodNode
                    );

                methods.Add(method);
                SKmethods.Add(method);

                return(method);
            }
Exemple #4
0
            public SkryptObject Map(SkryptEngine engine, SkryptObject self, SkryptObject[] values)
            {
                var m = TypeConverter.ToMethod(values, 0);

                var newArray = engine.Create <Array>(((Array)self).List);

                if (m.GetType() == typeof(SkryptMethod) && m.Parameters.Count != 1)
                {
                    engine.ThrowError("Input function must have 1 parameter!");
                }

                var scope = SkryptMethod.GetPopulatedScope(m, new[] { new Null() });

                scope.ParentScope = engine.CurrentScope;
                var name = scope.Variables.Keys.First();

                for (int i = 0; i < newArray.List.Count; i++)
                {
                    var x = newArray.List[i];

                    scope.Variables[name].Value = x;

                    var r = m.Execute(engine, self, new[] { x }, scope);

                    ((Array)self).List[i] = scope.Variables[name].Value;
                }

                var iterator = new Dictionary <string, SkryptObject>(((Array)self).Table);

                foreach (var p in iterator)
                {
                    var x = p.Value;

                    scope.Variables[name].Value = x;

                    var r = m.Execute(engine, self, new[] { x }, scope);

                    newArray.Table[p.Key] = scope.Variables[name].Value;
                }

                return(newArray);
            }
        static public node ParseGlobal(node branch, List <Token> tokensList)
        {
            node newNode = branch;

            List <Token> tokenBuffer = new List <Token>();

            // Branching
            bool   isBranch         = false;
            int    branchDepth      = 0;
            string branchType       = "";
            bool   prevWasIf        = false;
            bool   prevWasLiteralIf = false;
            node   ifNode           = null;

            // Method declaration
            bool isMethod      = false;
            bool isMethodArgs  = false;
            bool isMethodBody  = false;
            bool hasMethodArgs = false;
            int  bracketDepth  = 0;
            node argsNode      = null;

            string       methodType = "";
            List <Token> methodArgs = new List <Token>();
            List <Token> methodBody = new List <Token>();
            List <Token> returnExpr = new List <Token>();

            for (int i = 0; i < tokensList.Count; i++)
            {
                Token token = tokensList[i];

                if (token.value == "lbracket")
                {
                    bracketDepth++;
                }

                if (token.value == "rbracket")
                {
                    bracketDepth--;
                }

                if (token.value == "def")
                {
                    isMethod = true;
                    continue;
                }
                else if (isMethod)
                {
                    methodType = token.value;

                    if (!hasMethodArgs && token.value == "lpar")
                    {
                        isMethodArgs = true;
                        continue;
                    }

                    if (!hasMethodArgs && isMethodArgs && token.value == "rpar")
                    {
                        isMethodArgs  = false;
                        hasMethodArgs = true;

                        MethodHandler.Add(tokenBuffer[0].value, new string[0], (node)null);

                        SkryptMethod found = MethodHandler.GetSk(tokenBuffer[0].value);

                        int foundIndex = MethodContainer.SKmethods.IndexOf(found);

                        //MethodContainer.SKmethods[foundIndex].returnType = tokenBuffer[0].value;
                        argsNode = new node()
                        {
                            body = "arguments"
                        };

                        int      j        = 0;
                        string[] argNames = new string[methodArgs.Count];
                        MethodContainer.SKmethods[foundIndex].arguments = new string[methodArgs.Count];

                        foreach (Token argTkn in methodArgs)
                        {
                            MethodContainer.SKmethods[foundIndex].arguments[j] = argTkn.value;
                            argNames[j] = argTkn.value;
                            j++;

                            if (argTkn.value == "seperate")
                            {
                                continue;
                            }

                            argsNode.nodes.Add(new node()
                            {
                                body = argTkn.value, depth = argsNode.depth + 2
                            });
                        }


                        continue;
                    }

                    if (isMethodArgs)
                    {
                        methodArgs.Add(token);
                    }

                    if (!isMethodBody && hasMethodArgs && token.value == "lbracket")
                    {
                        isMethodBody = true;
                        continue;
                    }

                    if (isMethodBody && token.value == "rbracket" && bracketDepth == 0)
                    {
                        node MethodNode = ParseMethodDeclaration(newNode, tokenBuffer, argsNode, methodBody);

                        Executor.ExecuteMethodDeclaration(MethodNode);

                        isMethodBody = false;
                        //hasMethodBody = true;
                        tokenBuffer.Clear();
                        isMethod = false;
                        continue;
                    }

                    if (isMethodBody)
                    {
                        methodBody.Add(token);
                    }

                    tokenBuffer.Add(token);

                    continue;
                }
                else if (token.value == "if" || token.value == "while" || token.value == "for" || token.value == "else" || token.value == "elseif")
                {
                    branchDepth++;
                    branchType = token.value;

                    isBranch = true;
                }
                else if (isBranch)
                {
                    if (token.value == "rbracket")
                    {
                        branchDepth--;

                        if (branchDepth == 0)
                        {
                            node baseNode = new node()
                            {
                                body = "branch", depth = newNode.depth + 1
                            };
                            tokenBuffer.Add(token);

                            if ((branchType == "else" || branchType == "elseif"))
                            {
                                if ((branchType == "else" || branchType == "elseif") && !prevWasIf)
                                {
                                    throw new SkryptException(branchType + " has to be preceeded by if/elseif statement", tokenBuffer[0]);
                                }

                                if ((branchType == "elseif") && !prevWasLiteralIf)
                                {
                                    throw new SkryptException(branchType + " has to be preceeded by if statement", tokenBuffer[0]);
                                }


                                if (branchType == "elseif")
                                {
                                    prevWasIf = true;
                                }

                                node addNode = new node()
                                {
                                    body = "secondary", depth = ifNode.depth + 1
                                };
                                ifNode.nodes.Add(addNode);

                                node branchNode = ParseBranch(addNode, tokenBuffer, branchType);
                                ifNode = branchNode;

                                prevWasLiteralIf = false;

                                tokenBuffer.Clear();
                                continue;
                            }
                            else if (branchType == "if")
                            {
                                prevWasLiteralIf = true;
                                prevWasIf        = true;

                                ifNode = ParseBranch(baseNode, tokenBuffer, branchType);

                                newNode.nodes.Add(baseNode);

                                tokenBuffer.Clear();
                                continue;
                            }

                            tokenBuffer.Clear();
                            continue;
                        }
                    }
                }
                else if (token.value == "eol")
                {
                    node baseNode = new node()
                    {
                        body = "expression", depth = newNode.depth + 1
                    };
                    newNode.nodes.Add(baseNode);

                    ParseExpression(baseNode, tokenBuffer);
                    tokenBuffer.Clear();
                    continue;
                }

                tokenBuffer.Add(token);
            }

            return(newNode);
        }
Exemple #6
0
        static public Variable ExecuteMethod(node methodNode, List <Variable> scopeContext)
        {
            if (!MethodHandler.Exists(methodNode.body))
            {
                throw new SkryptMethodDoesNotExistException(methodNode.body);
            }

            Method       method   = MethodHandler.Get(methodNode.body);
            SkryptMethod skmethod = MethodHandler.GetSk(methodNode.body);

            string      type     = methodNode.nodes[0].body;
            List <node> argNodes = null;

            object[]        args       = new object[0];
            List <Variable> scopedVars = new List <Variable>();

            if (method.arguments.Length > 0 && method.arguments != null)
            {
                argNodes = methodNode.nodes[1].nodes;
                args     = new object[argNodes.Count];

                int i = 0;

                foreach (node argNode in argNodes)
                {
                    node     Expr   = argNode.nodes[0];
                    Variable solved = ExecuteExpression(Expr, scopedVars);

                    args[i] = solved.Value;

                    i++;
                }
            }

            Variable returnVariable;

            if (method.predefined)
            {
                returnVariable = method.Run(args);
            }
            else
            {
                if (argNodes != null)
                {
                    int i = 0;

                    foreach (node argNode in argNodes)
                    {
                        node     Expr   = argNode.nodes[0];
                        Variable solved = ExecuteExpression(Expr, scopedVars);
                        solved.Identifier = argNode.body;

                        if (Variables.Exists(x => x.Identifier == argNode.body))
                        {
                            Variables[Variables.IndexOf(Variables.Find(x => x.Identifier == argNode.body))].Value = solved.Value;
                        }

                        scopedVars.Add(solved);

                        i++;
                    }
                }

                returnVariable = skmethod.Run(scopedVars);
                DeleteVariables(scopedVars);
            }

            return(returnVariable);
        }