Exemple #1
0
        private LiteValue CallFunc(FuncBase Func, SyntaxArgumentListStatementNode ArgList, LiteEnv Env)
        {
            if (Func is FuncNative FN)
            {
                for (var Index = 0; Index < ArgList.GetChildrenNum(); ++Index)
                {
                    var ArgValue = Index >= ArgList.GetChildrenNum()
                        ? LiteValue.Nil
                        : ArgList.GetChild(Index).Accept(this, Env);
                    FN.Push(ArgValue);
                }
                FN.Push(ArgList.GetChildrenNum());
                return(FN.Invoke());
            }
            else if (Func is FuncLite FL)
            {
                var NewEnv    = FL.MakeEnv();
                var ParamList = FL.GetParamList();

                for (var Index = 0; Index < ParamList.GetChildrenNum(); ++Index)
                {
                    var ArgName  = ParamList.GetChild <SyntaxIdentifierNode>(Index).GetValue();
                    var ArgValue = Index >= ArgList.GetChildrenNum()
                        ? LiteValue.Nil
                        : ArgList.GetChild(Index).Accept(this, Env);
                    NewEnv.SetSelf(ArgName, ArgValue);
                }

                var Val = FL.GetBlock().Accept(this, NewEnv);
                //Logger.DInfo($"=> call [{Func.GetName()}] = {Val}");
                return(Val);
            }

            return(LiteValue.Nil);
        }
Exemple #2
0
        // args ::= "(" [ expr { "," expr } ] ")"
        private SyntaxArgumentListStatementNode ParseArgumentListNode()
        {
            if (!TokenStream_.TakeExpect(TokenType.Delimiter, "(", out Token Tok))
            {
                ExitCode_ = new ExitUnexpectedSymbolCode(Tok);
                return(null);
            }

            var Node = new SyntaxArgumentListStatementNode();

            if (TokenStream_.PeekExpect(TokenType.Delimiter, ")"))
            {
                TokenStream_.Take();
                return(Node);
            }

            while (!TokenStream_.IsEnd())
            {
                var Arg = ParseExprNode();
                if (Arg == null)
                {
                    ExitCode_ = new ExitUnexpectedSymbolCode(TokenStream_.Peek());
                    return(null);
                }

                Node.AddNode(Arg);

                if (!TokenStream_.TakeExpect(TokenType.Delimiter, out Tok))
                {
                    ExitCode_ = new ExitUnexpectedSymbolCode(Tok);
                    return(null);
                }

                if (Tok.Code == ")")
                {
                    return(Node);
                }
                if (Tok.Code == ",")
                {
                    continue;
                }

                ExitCode_ = new ExitUnexpectedSymbolCode(Tok);
            }

            ExitCode_ = new ExitUnexpectedSymbolCode(Tok);
            return(null);
        }
Exemple #3
0
 public SyntaxCallFunctionExpressionNode(SyntaxNode FuncIdentNode, SyntaxArgumentListStatementNode ArgumentListNode)
     : base(new Token(TokenType.Operator, "()"), FuncIdentNode, ArgumentListNode)
 {
 }