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); } }
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; }
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; }
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; }
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; }