예제 #1
0
        public override ktValue _RunMethod(ktString Name, ktList Arguments)
        {
            if (Name.IsEmpty())
            {
                throw new ktError("Didn't get the name of the method to run in class '" +
                                m_Name + "'.", ktERR.NOTSET);
            }
            //ktDebug.Log( ";Name::"+ Name + ";;;;_\n" );
            if (Name == "_PropertyChanged")
            {
                if ((Arguments == null) || (Arguments.GetCount() != 2))
                {
                    throw new ktError("kactalk::_PropertyChanged() : Didn't get the two nnede arguments!",
                                      ktERR.MISSING);
                }
            #if Debug
            ktDebug.Log( "Args::" + Arguments.Get_R( "\t", true ) );
            #endif

                Name = Arguments.Get("Name").Node.Value.ToString();
                ktValue Value = (ktValue)Arguments.Get("Value").Node.Value;

                SetProperty(Name, Value);

                return ktValue.Null;
            }
            else /*if (Name.StartsWith( "operator", out Name )) {
                return HandleOperator( Name, Arguments );
            } else */
            {
                throw new ktError("Couldn't find the method '" +
                                  Name + "' in class '" + m_Name + "'.", ktERR._404);
            }
        }
예제 #2
0
        protected ktValue HandleCompound(ktList Comp)
        {
            ktValue Value = ktValue.Null;
            //ktDebug.WrapLevel++;

            if (Comp == null)
            {
                return Value;
            }
#if Debug
	if (!ktDebug.Enabled) { ktDebug.D.Enable(); this.m_enabledDebug = true;  this.m_enabledAt = ktDebug.WrapLevel; }
	ktDebug.Log( "HCHCHCHCHCHCHCHCHHCHCHC:\n" + Comp.Get_R( ktDebug.GetPrefix(), true ) );
#endif

            ktToken SToken= null;
            ktToken First = null;
            ktToken Last = null;

            if ((Comp.Node != null) && (Comp.Node.Value != null))
            {
                SToken = (ktToken)(Comp.Node.Value);
            }
            if ((Comp.First != null) && (Comp.First.Node != null))
            {
                First = (ktToken)(Comp.First.Node.Value);
            }
            if ((Comp.Last != null) && (Comp.Last.Node != null))
            {
                Last = (ktToken)(Comp.Last.Node.Value);
            }

            if ((First == null) && (Last == null))
            {
                return Value;
            }

            ktDebug.Log("SEPV::" + First.Value + ";;" + Last.Value );
            if ((SToken != null) && (SToken.Value == "§"))
            {
#if Debug
                    ktDebug.Log("METHODCALL");
#endif
                

                ktClass Class = null;

                try
                {
                    Value = GetObjectFor(First);
                    if (Value.IsNull())
                    {
                        throw new Exception();
                    }
                    Class = (ktClass)Value.Value;
                }
                catch (Exception)
                {
#if Debug
                    ktDebug.Log("ID:" + Err.Message);
#endif
                    throw new ktError("Can't find the symbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404);
                }

                First = (ktToken)Comp.First.Next.Node.Value;
                Last = (ktToken)Comp.Last.First.Node.Value;
                /*First = (ktToken)Comp.Last.First.Node.Value;
                Last = (ktToken)Comp.Last.Last.Node.Value;*/
                //ktDebug.Log(".." + First.Value + ";" + SToken.Value + "::\n" + Last.Value + "===----------====-===");

                Value = Class.RunMethod(First.Value,GetArguments(Comp.Last.Last));
            }
            else if ((First.Type == ktTokenType.CompStatement) && (First.Value == "."))
            {
#if Debug
	ktDebug.Log( "SEP::" + Comp.First.Get_R( ktDebug.GetPrefix() ) );
#endif
                Value = HandleCompound(Comp.First);
//                ktDebug.Log("SLU:" + Value.ToString() + ";");
                if (Value.Type == "ktFunction")
                {
                    ktDebug.Log("WTF???");
                    if ((Value.Value.GetType() == typeof(ktFunction)) ||
                        (Value.Value.GetType() == typeof(ktDelegateFunction)))
                    {
                        ktDebug.Log("WTF!!!_" + Value.ToString() + "!|!" + Value.Value.GetType().ToString());
                        ktFunction Func = (ktFunction)Value.Value;
                        Value = Func.Run(GetArguments(Comp.Last));
                    }
                    else
                    {
                        ktDebug.Log("WTF???_" + Value.ToString() + "!|!" + Value.Value.GetType().ToString());
                        ktClass Class = (ktClass)Value.Value;
                        Value = Class.RunMethod("run", GetArguments(Comp.Last));
                    }
                }
                else
                {
                    ktDebug.Log("HUM:" + Value.Type);
                    ktDebug.Log("HUM_T:" + Value.GetType() + ";" + Value.Value.GetType());
                    ktDebug.Log("HUM_T:" + Value.Value.GetStringType());
                    ktDebug.Log("Last:" + Comp.Last.Get_R(ktDebug.GetPrefix()));
                    ktDebug.Log("LastT:" + Last.Type);
                    if (Last.Type == ktTokenType.Id)
                    {
                        if (Value.Value.GetStringType() == "ktClass")
                        {
                            Value = ((ktClass)Value.Value).GetMember(Last.Value);
                        }
                        else
                        {
                            ktDebug.Log("__HUMMM??????????????");
                        }
                    }
                }
                /*if (Value.Type == "ktClass") {
                    ktClass Class = null;

                    try {;
                        if (Value.IsNull()) {
                            throw new Exception();
                        }
                        Class = (ktClass)Value.Value;

                        if (Last.Type == ktTokenType.Id) {
                            Value = Class.GetMember( Last.Value );
                        } else {
                            throw new ktError( "Unexpected '" + Last.ToString() + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR.UNEXP );
                        }
                    } catch (Exception Err) {
#if Debug
    ktDebug.Log( Err.Message );
#endif
                        if (Err.GetType() == typeof( ktError )) {
                            throw Err;
                        }

                        throw new ktError( "Can't find the symmmmmmmmmmbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404 );
                    }
                }*/
            }
            else if ((First.Type == ktTokenType.CompStatement) && (First.Value == "::"))
            {
                ktClass Class = null;
                ktDebug.Log("::::::::::::::::::::::::");

                Value = HandleCompound(Comp.First);
                if (Value.Type == "ktFunction")
                {
                    if (Value.Value.GetType() == typeof(ktFunction))
                    {
                        ktDebug.Log("::WTF???_" + Value.ToString() + "!|!" + Value.Value.GetType().ToString());
                        ktFunction Func = (ktFunction)Value.Value;
                        Value = Func.Run(GetArguments(Comp.Last));
                    }
                    else
                    {
                        Class = (ktClass)Value.Value;
                        Value = Class.RunMethod("run", GetArguments(Comp.Last));
                    }
                }
                else ktDebug.Log("CHUM:" + Value.Type);
#if Debug
	ktDebug.Log( "SEP.::::::::::." + Value.ToString() + "E;" + First.LineNo );
#endif
            }
            else if ((SToken != null) && (SToken.Value == "§"))
            {
#if Debug
                    ktDebug.Log("METHODCALL");
#endif
                

                ktClass Class = null;

                try
                {
                    Value = GetObjectFor(First);
                    if (Value.IsNull())
                    {
                        throw new Exception();
                    }
                    Class = (ktClass)Value.Value;
                }
                catch (Exception Err)
                {
#if Debug
                    ktDebug.Log("ID:" + Err.Message);
#endif
                    throw new ktError("Can't find the symbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404);
                }

                First = (ktToken)Comp.Last.First.Node.Value;
                Last = (ktToken)Comp.Last.Last.Node.Value;
                //ktDebug.Log(".." + First.Value + ";" + SToken.Value + "::\n" + Last.Value + "===----------====-===");
                

                Value = Class.RunMethod(First.Value,GetArguments(Comp.Last.Last));
            }
            else if ((SToken != null) && (SToken.Value == "."))
            {
                ktClass Class = null;

                try
                {
                    Value = GetObjectFor(First);
                    ktDebug.Log("SLU!!!!!!!!!!");
                    if (Value.IsNull())
                    {
                        throw new Exception();
                    }
                    Class = (ktClass)Value.Value;
                    ktDebug.Log("SLU!!++++++!!");
                    //					Class.GetM
                }
                catch (Exception Err)
                {
#if Debug
	ktDebug.Log( "ST.DOT.:" + Err.Message );
#endif
                    throw new ktError("Can't find the symbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404);
                } /*catch (NullReferenceException Err) {
#if Debug
	ktDebug.Log( "ST.DOT.NULL:" + Err.Message );
#endif
					throw new ktError( "Can't find the symbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404 );
				}*/
                if (Class == null)
                {
                    throw new ktError("A null value was found where an object instance was required, on line " + Last.LineNo.ToString() + " by character " + Last.CharPos.ToString() + "!", ktERR.NULL);
                }

                Value = Class.GetMember(Last.Value);
#if Debug
	ktDebug.Log( "SEP......." + Value.ToString() + ";E:" + First.LineNo );
#endif
            }
            else if ((SToken != null) && (SToken.Value == "::"))
            {
                ktDebug.Log("CONFU::" + Last.Value + ";");
                ktDebug.Log("SEPV::" + First.Value);
                ktContext Con = kacTalk.Main.GetContext(First.Value);
                ktDebug.Log("CON::" + ((Con == null) ? "NULL" : Con.Export()) + ";");
                Value = Con.GetMember(Last.Value);
                ktDebug.Log("CON_MEM::" + ((Value == null) ? "NULL" : Value.Export()) + ";");
            }
            else 
            {
//                ktDebug.Log(".." + First.Value + ";" + SToken.Value + "::\n" + Comp.Node.Value + "===----------====-===");
                if ((First.Type == ktTokenType.Id) && (Comp.GetCount() == 2))
                {
#if Debug
                    ktDebug.Log("IDIDIDIDIDIDIDIDIDIDID");
#endif
                    ktClass Class = null;

                    try
                    {
                        Value = GetObjectFor(First);
                        if (Value.IsNull())
                        {
                            throw new Exception();
                        }
                        Class = (ktClass)Value.Value;

                        //						Class.GetM
                    }
                    catch (Exception Err)
                    {
#if Debug
                        ktDebug.Log("ID:" + Err.Message);
#endif
                        throw new ktError("Can't find the symbol '" + First.Value + "' on line " + First.LineNo.ToString() + " by character " + First.CharPos.ToString() + "!", ktERR._404);
                    }

                    Value = Class.RunMethod("_func_call", GetArguments(Comp.Last));
                    /*
                    if (Comp.GetCount() == 2) {
                        Value = RunFunction( First.Value, GetArguments( Comp.Last ) );
                    }*/
                }
            }
#if Debug
	ktDebug.Log( "- - - EO_HC - - -" );
	if (this.m_enabledDebug && (this.m_enabledAt == ktDebug.WrapLevel)) { ktDebug.D.Disable(); }
#endif

           // ktDebug.WrapLevel--;
            return Value;
        }
예제 #3
0
        protected ktValue HandleNew(ktList Statement)
        {
            ktValue NewValue = ktValue.Null;
            ktClass NewObj = null;

#if Debug
	ktDebug.Log( "HandleNew:" + Statement.Get_R() );
#endif

            if ((Statement == null) || (Statement.GetCount() == 0) ||
                (Statement.First == null) || (Statement.First.Node == null) ||
                (Statement.First.Node.Value == null) ||
                ((Statement.First.First != null) && (
                        (Statement.First.First.Node == null) || (Statement.First.First.Node.Value == null)))
               )
            {
                throw new ktError("ktBlock::HandleNew: Didn't get enough information to create a new object!", ktERR.MISSING);
            }

            ktToken Token = (ktToken)Statement.First.Node.Value;
            ktString Name = new ktString();
            ktList Arguments = null;

            if (Token.Type == ktTokenType.Id)
            {
                Name = Token.Value;
            }
            else if ((Token.Type == ktTokenType.CompStatement) ||
                      (Token.Type == ktTokenType.Statement))
            {
                Token = (ktToken)Statement.First.First.Node.Value;
                Name = Token.Value;

                Arguments = GetArguments(Statement.First.Last);
            }

            NewObj = (ktClass)MakeObjectOf(Name, (object)null);

            if (Arguments != null)
            {
                ktDebug.Log("NO: " + NewObj.Export() + ";;Args:" + Arguments.Get_R());
                try
                {
                    NewObj.RunMethod("constructor", Arguments);
                }
                catch (ktError Err)
                {
                    ktDebug.Log("NEW_CONS:ERR:" + Err.ToString());
                    if (Err.ErrorNumber == ktERR.NOTFOUND)
                    {
                        throw new ktError("The class " + Name + " is missing an constructor!", ktERR.NOTFOUND);
                    }
                    else
                    {
                        throw Err;
                    }
                }
            }

            NewValue = new ktValue("", Name, NewObj, false, false);
            ktDebug.Log("NV: " + NewValue.ToString());
            return NewValue;
        }
예제 #4
0
        public ktList GetArguments(ktList Arguments)
        {
            ktList Args = null;
            ktToken Token = null;

#if Debug
	ktDebug.Log( "GAGAGAGAGAGA:" + Arguments.Get_R( "\t", true ) );
#endif
            if (Arguments == null)
            {
                return null;
            }
            else if ((Arguments.Node != null) && (Arguments.Node.Value != null) &&
                      ((Token = (ktToken)(Arguments.Node.Value)).Type == ktTokenType.CompStatement))
            {
                Args = new ktList();

                Args.Add(HandleCompound(Arguments).CopyValue());

                return Args;
            }
            else if (((Arguments.First != null) && (Arguments.First.Node != null) &&
                       (Arguments.First.Node.Value != null) &&
                       ((Token = (ktToken)(Arguments.First.Node.Value)).Type == ktTokenType.CompStatement)
                      ) || ((Arguments.Node != null) && (Arguments.Node.Value != null) &&
                       ((Token = (ktToken)(Arguments.Node.Value)).Type == ktTokenType.CompStatement)
                      )
                    )
            {
#if Debug
	ktDebug.Log( "GACSGACSGACSGACSGACSGACS:" + Arguments.Get_R() );
#endif
                ktList Stat = new ktList();
                Stat.Node = new ktNode("ktStatement", new ktToken(ktTokenType.Statement, "ktStatement",
                                            Token.LineNo, Token.CharPos));

                Args = new ktList();
                Args.Node = new ktNode("ktList", new ktToken(ktTokenType.List, "ktList", Token.LineNo,
                                            Token.CharPos));
                Args.AddList(Stat);
                Stat.AddList(Arguments);

                return GetArguments(Args);
            }
#if Debug
	ktDebug.Log( "gQAGAGAGAGAGAGAGGAgA::::" + Arguments.Get_R( "\t", true )  );
#endif

            if (Arguments.GetCount() == 0)
            {
                if (Arguments.Node == null)
                {
                    return null;
                }

                Token = (ktToken)Arguments.Node.Value;
                //ktDebug.Log( "GAGA111:" + Token.Name );
                Args = new ktList();

                if (Token.Type == ktTokenType.RunStatement)
                {
                    Args.Add(TokenToValue(Token, null));
                }
                else
                {
                    Args.Add(TokenToValue(Token, null).CopyValue());
                }

            }
            else
            {
                ktValue Value = null;

                Arguments.Reset();
                foreach (ktList L in Arguments)
                {
                    if ((L.Node == null) || (L.Node.Value == null))
                    {
                        continue;
                    }

                    if (Args == null)
                    {
                        Args = new ktList();
                    }

                    Token = (ktToken)L.Node.Value;

                    if (Token.Type == ktTokenType.RunStatement)
                    {
                        Value = TokenToValue(Token, L);
                    }
                    else
                    {
                        Value = TokenToValue(Token, L).CopyValue();
                    }

                    if (Value != null)
                    {
                        Args.Add(Value);
                    }
                }
            }
#if Debug
	ktDebug.Log( "EOFGA" );
	ktDebug.Log( Args.Get_R( "\t", true ) );
#endif
            return Args;
        }
예제 #5
0
        public ktValue RunLine(ktList Line)
        {
            ktValue Ret = ktValue.Null;
            ktToken Token = null;
            ktToken LToken = null;

            if (Line == null)
            {
                throw new ktError("ktBlock::RunLine() : Didn't get a line to run!", ktERR.NOTSET);
            }
//#if Debug
	ktDebug.Log( "RL:" +  Line.Get_R( " ", true ) );
//#endif

            /*if (Token.LineNo == 3)
            {
                //ktDebug.Log("L3T: ");
                ktDebug.Log("L3: " + Line.Get_R(" ", true));
            }*/

            try
            {
                Token = (ktToken)Line.Node.Value;
                if (Line.GetCount() == 0)
                {
                    if (Line.Node != null)
                    {
                        if (Token.Type == ktTokenType.String)
                        {
                            Ret = new ktValue(":ktString", "ktString", MakeObjectOf("ktString", Token.Value),
                                              true, true);
                        }
                        else if (Token.Type == ktTokenType.Number)
                        {
                            Ret = new ktValue(":ktInt", "ktInt", MakeObjectOf("ktInt", Token.Value),
                                        true, true);
                        }
                        else if (Token.Type == ktTokenType.Float)
                        {
                            Ret = new ktValue(":ktFloat", "ktFloat", MakeObjectOf("ktFloat", Token.Value),
                                        true, true);
                        }
                        else if (Token.Type == ktTokenType.Id)
                        {
                            Ret = GetVariable(Token.Value);
                        }
                    }
                    else
                    {
                        //throw new ktError( "ktBlock::RunLine() : Didn't get a line to run!", ktERR.NOTSET );
                        return Ret;
                    }
                }

                switch (Token.Type)
                {
                    case ktTokenType.If:
                        {
                            bool r = CheckLogicStatement(Line.First,Token, ref Ret);
                            if (r)
                            {
                               // m_skipNextLine = true;
                                ktList Next = Line.First.Next;
                                ktToken IfToken = (ktToken)Next.Node.Value;
                                switch (IfToken.Type)
                                {
                                    case ktTokenType.Block:
                                        {
                                            IfToken.Block.SetParent(this);
                                            Ret = IfToken.Block.Run();
                                            break;
                                        }
                                    default:
                                        {
                                            Ret = RunLine(Next);
                                            break;
                                        }
                                };
                            }
                            return Ret;
                        }
                    case ktTokenType.For:
                        {
                            break;
                        }
                    case ktTokenType.Foreach:
                        {
                            break;
                        }
                    case ktTokenType.While:
                        {
                            break;
                        }
                }

                Line.Reset();
                foreach (ktList TL in Line)
                {
                    if ((TL.Node == null) || (TL.Node.Value == null))
                    {
                        continue;
                    }
                    LToken = Token;
                    Token = (ktToken)TL.Node.Value;

                    switch (Token.Type)
                    {
                        case ktTokenType.CompStatement:
                            {
                                Ret = HandleCompound(TL);
                                break;
                            }
                        case ktTokenType.AssignmentOperator:
                            {
                                Ret = HandleOperator(TL);
                                break;
                            }
                        case ktTokenType.Operator: {
                                Ret = HandleOperator(TL);
                                break;
                            }
                        /*case ktTokenType.If: {
                            break;
                        }*/
                        case ktTokenType.Number:
                        case ktTokenType.String:
                        case ktTokenType.Id:
                            {
                                ktList L = new ktList();
                                L.AddList(TL);
                                Ret = HandleStatement(L);
                                break;
                            }
                        default:
                            {
                                throw new ktError("ktBlock::RunLine(): Unexpected " + Token.Name +
                                                " on line " + Token.LineNo.ToString() +
                                                " (by character " + Token.CharPos.ToString() + ")",
                                                ktERR.UNEXP);
                            }
                    }
#if Debug
	ktDebug.Log( "New Line!!!!!!!!!!!!" );
#endif
                }
            }
            catch (ktError Err)
            {
                //ktDebug.Log("SL:SC:" + Err.ToString() + ";" + Line.Get_R());
                if (Token == null)
                {
                    if (LToken != null)
                    {
                        Token = LToken;
                    }
                    else if (Line.Node != null)
                    {
                        Token = (ktToken)Line.Node.Value;
                    }
                    else if (Line.FirstNode != null)
                    {
                        Token = (ktToken)Line.FirstNode.Value;
                    }
                    else if (Line.LastNode != null)
                    {
                        Token = (ktToken)Line.LastNode.Value;
                    }
                }
                if (Token != null)
                {
                    Err.SetLine(Token.LineNo);
                    Err.SetChar(Token.CharPos);
                    ktDebug.Log(Err.ToString());
                }
                else ktDebug.Log("NOOOOOOOO!!");
                throw Err;
            }
#if Debug
	ktDebug.Log( "EORL" );
#endif

            /*			if (Ret == null) {
				Ret = Value;
			}*/
            return Ret;
        }