public void Resolve(int index, PostParseVariable left)
        {
            Tuple<int, List<PostParseVariable>> item;
            if (Needs.TryGetValue(index, out item))
            {
                Needs.Remove(index);

                left.Type = VariableType.Variable;
                left.Index = item.Item1;

                foreach (PostParseVariable postParseItem in item.Item2)
                {
                    postParseItem.Type = VariableType.Variable;
                    postParseItem.Index = item.Item1;
                }
                foreach (var postParseVariable in Items[index])
                {
                    postParseVariable.Type = VariableType.Variable;
                    postParseVariable.Index = item.Item1;

                }
            }

            else if (!Items[left.Index].Any())
            {
                left.Destroy = true;
            }

            Items[left.Index] = new List<PostParseVariable>() { };
        }
Exemplo n.º 2
0
        private Tuple<string, List<PostParseExpression>> buildMethod(SpokeMethod fm)
        {
            StringBuilder sb = new StringBuilder();

            #if stacktrace
            dfss.AppendLine( fm.Class.Name +" : : "+fm.MethodName+" Start");
            #endif
            List<PostParseExpression> exps = new List<PostParseExpression>();

            for (int index = 0; index < fm.Instructions.Length; index++)
            {
                var ins = fm.Instructions[index];
            #if stacktrace
                dfss.AppendLine(stackIndex + " ::  " + ins.ToString());
            #endif
                int gj;
                PostParseVariable[] pps;
                switch (ins.Type)
                {
                    case SpokeInstructionType.CreateReference:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("new SpokeObject(new SpokeObject[{0}])", ins.Index)), false));

                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(new SpokeObject[{1}]);", ins.StackBefore_, ins.Index));
                        break;
                    case SpokeInstructionType.Comment:
                        exps.Add(new PostParseString(string.Format("/*{0}*/", ins.StringVal)));
                        sb.AppendLine(string.Format("/*{0}*/", ins.StringVal));
                        break;
                    case SpokeInstructionType.CreateArray:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("new SpokeObject(new List<SpokeObject>(20))")), false));

                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(new List<SpokeObject>(20) );", ins.StackBefore_));
                        break;
                    case SpokeInstructionType.CreateMethod:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("NULL")), false));
                        sb.AppendLine(string.Format("stack[{0}]=NULL;", ins.StackBefore_));
                        break;
                    case SpokeInstructionType.Label:
                        exps.Add(new PostParseString(ins.labelGuy + ":"));
                        sb.AppendLine(string.Format("{0}:", ins.labelGuy));
                        break;
                    case SpokeInstructionType.Goto:
                        exps.Add(new PostParseString("goto " + ins.gotoGuy + ";"));
                        sb.AppendLine(string.Format("goto {0};", ins.gotoGuy));
                        break;
                    case SpokeInstructionType.CallMethod:

                        pps = new PostParseVariable[ins.Index3];
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                            pps[i] = new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1 - i);

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1), new PostParseMethod(Methods[ins.Index].Class.Name + Methods[ins.Index].CleanMethodName, pps.Reverse().ToArray(), ins.Index3), true));

                        sb.AppendLine(string.Format("sps = new SpokeObject[{0}];", Methods[ins.Index].NumOfVars));
                        gj = ins.StackBefore_ - 1;
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                        {
                            sb.AppendLine(string.Format("sps[{1}] = stack[{0}];", gj--, i));
                        }
                        sb.AppendLine(string.Format("stack[{0}] = {1}(sps);", ins.StackAfter_ - 1, Methods[ins.Index].Class.Name + Methods[ins.Index].CleanMethodName));

                        break;
                    case SpokeInstructionType.CallMethodFunc:

                        pps = new PostParseVariable[ins.Index3];
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                        {
                            pps[i] = new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1 - i);
                        }
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1), new PostParseMethod(string.Format("Methods[{0}].MethodFunc", ins.Index), pps.Reverse().ToArray(), ins.Index3), true));

                        sb.AppendLine(string.Format("sps = new SpokeObject[{0}];", ins.Index3));
                        gj = ins.StackBefore_ - 1;
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                        {
                            sb.AppendLine(string.Format("sps[{1}] = stack[{0}];", gj--, i));
                        }
                        sb.AppendLine(string.Format("stack[{0}] = Methods[{1}].MethodFunc(sps);", ins.StackAfter_ - 1, ins.Index));
                        break;
                    case SpokeInstructionType.CallInternal:

                        pps = new PostParseVariable[ins.Index3];
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                        {
                            pps[i] = new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1 - i);
                        }

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1), new PostParseMethod(string.Format("InternalMethods[{0}]", ins.Index), pps.Reverse().ToArray(), ins.Index3), true));

                        sb.AppendLine(string.Format("sps = new SpokeObject[{0}];", ins.Index3));
                        gj = ins.StackBefore_ - 1;
                        for (int i = ins.Index3 - 1; i >= 0; i--)
                        {
                            sb.AppendLine(string.Format("sps[{1}] = stack[{0}];", gj--, i));
                        }

                        sb.AppendLine(string.Format("stack[{0}] = InternalMethods[{1}](sps);", ins.StackAfter_ - 1, ins.Index));

                        break;
                    case SpokeInstructionType.BreakpointInstruction:
                        Console.WriteLine("BreakPoint");
                        break;
                    case SpokeInstructionType.Return:
                        exps.Add(new PostParseStatement("return {0};", new PostParseVariable(VariableType.Stack, ins.StackBefore_)));
                        sb.AppendLine(string.Format("return stack[{0}];", ins.StackBefore_));
                        break;
                    case SpokeInstructionType.IfTrueContinueElse:
                        exps.Add(new PostParseStatement("if(!({0}).BoolVal) ", new PostParseVariable(VariableType.Stack, ins.StackBefore_)));
                        exps.Add(new PostParseString("goto " + ins.elseGuy + ";"));

                        sb.AppendLine(string.Format("if(!stack[{0}].BoolVal) goto {1};", ins.StackBefore_, ins.elseGuy));

                        break;
                    case SpokeInstructionType.Or:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                                                  new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                                                                         new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                                                                         "(({0}.BoolVal || {1}.BoolVal)?TRUE:FALSE)"), true));
                        sb.AppendLine(string.Format("stack[{0}] = (stack[{0}].BoolVal || stack[{1}].BoolVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackBefore_));
                        break;
                    case SpokeInstructionType.And:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                                                 new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                                                 "(({0}.BoolVal && {1}.BoolVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}] = (stack[{0}].BoolVal && stack[{1}].BoolVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackBefore_));
                        break;
                    case SpokeInstructionType.StoreLocalInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Variable, ins.Index), new PostParseStatement("intCache({0}.IntVal)", new PostParseVariable(VariableType.Stack, ins.StackBefore_)), true));

                        sb.AppendLine(string.Format("variables[{0}] = intCache(stack[{1}].IntVal);", ins.Index, ins.StackBefore_));
                        break;
                    case SpokeInstructionType.StoreLocalFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Variable, ins.Index),
                            new PostParseStatement("new SpokeObject({0}.FloatVal)", new PostParseVariable(VariableType.Stack, ins.StackBefore_)), true));

                        sb.AppendLine(string.Format("variables[{0}] = new SpokeObject(stack[{1}].FloatVal);", ins.Index, ins.StackBefore_));
                        break;
                    case SpokeInstructionType.StoreLocalBool:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Variable, ins.Index),
                            new PostParseStatement("new SpokeObject({0}.BoolVal)", new PostParseVariable(VariableType.Stack, ins.StackBefore_)), true));

                        sb.AppendLine(string.Format("variables[{0}] = stack[{1}].BoolVal ? TRUE : FALSE;", ins.Index, ins.StackBefore_));

                        //      variables[ins.Index] = lastStack.BoolVal ? TRUE : FALSE;
                        break;
                    case SpokeInstructionType.StoreLocalString:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Variable, ins.Index), new PostParseStatement("new SpokeObject({0}.StringVal)", new PostParseVariable(VariableType.Stack, ins.StackBefore_)), true));

                        sb.AppendLine(string.Format("variables[{0}] = new SpokeObject(stack[{1}].StringVal);", ins.Index, ins.StackBefore_));
                        break;

                    case SpokeInstructionType.StoreLocalMethod:
                    case SpokeInstructionType.StoreLocalObject:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Variable, ins.Index), new PostParseVariable(VariableType.Stack, ins.StackBefore_), true));

                        sb.AppendLine(string.Format("variables[{0}] = stack[{1}];", ins.Index, ins.StackBefore_));

                        break;
                    case SpokeInstructionType.StoreLocalRef:
                        exps.Add(
                            new PostParseStatement(
                                @"

            //{1}={0};

            lastStack = {0};
            bm2 = {1};
            bm2.Variables = lastStack.Variables;
            bm2.ArrayItems = lastStack.ArrayItems;
            bm2.StringVal = lastStack.StringVal;
            bm2.IntVal = lastStack.IntVal;
            bm2.BoolVal = lastStack.BoolVal;
            bm2.FloatVal = lastStack.FloatVal;
            ",
                                new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Variable, ins.Index)));

                        sb.AppendLine(string.Format("lastStack = stack[{0}];", ins.StackBefore_));
                        sb.AppendLine(string.Format("bm = variables[{0}];", ins.Index));
                        sb.AppendLine(@"
            bm.Variables = lastStack.Variables;
            bm.ArrayItems = lastStack.ArrayItems;
            bm.StringVal = lastStack.StringVal;
            bm.IntVal = lastStack.IntVal;
            bm.BoolVal = lastStack.BoolVal;
            bm.FloatVal = lastStack.FloatVal;
            ");

                        break;

                    case SpokeInstructionType.StoreFieldBool:

                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "]={1}.BoolVal?TRUE:FALSE;", new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)));

                        sb.AppendLine(string.Format("stack[{0}].Variables[{2}]=stack[{1}].BoolVal?TRUE:FALSE;", ins.StackBefore_, ins.StackAfter_, ins.Index));
                        break;
                    case SpokeInstructionType.StoreFieldInt:
                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "]=intCache({1}.IntVal);", new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)));

                        sb.AppendLine(string.Format("stack[{0}].Variables[{2}]=intCache(stack[{1}].IntVal );", ins.StackBefore_, ins.StackAfter_, ins.Index));
                        break;
                    case SpokeInstructionType.StoreFieldFloat:
                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "]=new SpokeObject({1}.FloatVal);", new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)));

                        sb.AppendLine(string.Format("stack[{0}].Variables[{2}]=new SpokeObject( stack[{1}].FloatVal );", ins.StackBefore_, ins.StackAfter_, ins.Index));
                        break;
                    case SpokeInstructionType.StoreFieldString:
                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "]=new SpokeObject({1}.StringVal);", new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)));

                        sb.AppendLine(string.Format("stack[{0}].Variables[{2}]=new SpokeObject(stack[{1}].StringVal );", ins.StackBefore_, ins.StackAfter_, ins.Index));
                        break;
                    case SpokeInstructionType.StoreFieldMethod:
                    case SpokeInstructionType.StoreFieldObject:

                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "]={1};", new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)));

                        sb.AppendLine(string.Format("stack[{0}].Variables[{2}]=stack[{1}];", ins.StackBefore_, ins.StackAfter_, ins.Index));
                        break;
                    case SpokeInstructionType.StoreToReference:

                        exps.Add(new PostParseStatement("{0}.Variables[" + ins.Index + "] = {1};", new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_)));

                        sb.AppendLine(string.Format("stack[{1}].Variables[{2}] = stack[{0}];", ins.StackBefore_, ins.StackBefore_ - 1, ins.Index));
                        break;
                    case SpokeInstructionType.GetField:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseStatement("{0}.Variables[" + ins.Index + "]", new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)), true));

                        sb.AppendLine(string.Format("stack[{0}] = stack[{0}].Variables[{1}];", ins.StackBefore_ - 1, ins.Index));
                        break;
                    case SpokeInstructionType.GetLocal:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseVariable(VariableType.Variable, ins.Index), true));

                        sb.AppendLine(string.Format("stack[{0}] = variables[{1}];", ins.StackBefore_, ins.Index));
                        break;
                    case SpokeInstructionType.PopStack:
                        var d = (PostParseSet)exps.Last(a => a.ExpressionType == PPExpressionType.Set);

                        if (d.Right.ItemType == PPItemType.Variable)
                        {
                            d.MarkForRemoval = true;
                        }
                        else d.RemoveLeft = true;

                        break;
                    case SpokeInstructionType.Not:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseStatement("{0}.BoolVal?FALSE:TRUE", new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1)), true));
                        sb.AppendLine(string.Format("stack[{0}] = stack[{0}].BoolVal?FALSE:TRUE;", ins.StackBefore_ - 1));
                        break;
                    case SpokeInstructionType.IntConstant:
                        if (ins.Index >= 0 && ins.Index < 100)
                        {
                            exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("ints[{0}]", ins.Index)), true));
                            sb.AppendLine(string.Format("stack[{0}] = ints[{1}];", ins.StackBefore_, ins.Index));
                        }
                        else
                        {
                            exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("new SpokeObject( {0} )", ins.Index)), true));
                            sb.AppendLine(string.Format("stack[{0}] = new SpokeObject( {1} );", ins.StackBefore_, ins.Index));
                        }
                        break;
                    case SpokeInstructionType.BoolConstant:
                        sb.AppendLine(string.Format("stack[{0}] = {1};", ins.StackBefore_, ins.BoolVal ? "TRUE" : "FALSE"));
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(ins.BoolVal ? "TRUE" : "FALSE"), true));

                        break;
                    case SpokeInstructionType.FloatConstant:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("new SpokeObject( {0}f )", ins.FloatVal)), true));

                        sb.AppendLine(string.Format("stack[{0}] = new SpokeObject({1}f );", ins.StackBefore_, ins.FloatVal));
                        break;
                    case SpokeInstructionType.StringConstant:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString(string.Format("new SpokeObject( \"{0}\" )", ins.StringVal)), true));
                        sb.AppendLine(string.Format("stack[{0}] = new SpokeObject( \"{1}\" );", ins.StackBefore_, ins.StringVal));
                        break;

                    case SpokeInstructionType.Null:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_), new PostParseString("NULL"), true));
                        sb.AppendLine(string.Format("stack[{0}] = NULL;", ins.StackBefore_));
                        break;
                    case SpokeInstructionType.AddIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "intCache({0}.IntVal + {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=intCache(stack[{0}].IntVal + stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddStringInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.StringVal + {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject( stack[{0}].StringVal + stack[{1}].IntVal );", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddIntString:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.IntVal + {1}.StringVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal + stack[{1}].StringVal );", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddFloatString:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal + {1}.StringVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject( stack[{0}].FloatString + stack[{1}].StringVal );", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddStringFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.StringVal + {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].StringVal + stack[{1}].FloatVal );", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddStringString:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.StringVal + {1}.StringVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].StringVal + stack[{1}].StringVal );", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.SubtractIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "intCache({0}.IntVal - {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=intCache (stack[{0}].IntVal - stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.MultiplyIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "intCache({0}.IntVal * {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=intCache (stack[{0}].IntVal * stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.DivideIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "intCache({0}.IntVal / {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=intCache (stack[{0}].IntVal / stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_), "(({0}.IntVal > {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal > stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_), "(({0}.IntVal > {1}.FloatVal)?TRUE:FALSE)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal > stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_), "(({0}.FloatVal > {1}.IntVal)?TRUE:FALSE)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal > stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_), "(({0}.FloatVal > {1}.FloatVal)?TRUE:FALSE)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal > stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal < {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal < stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal < {1}.FloatVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal < stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.FloatVal < {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal < stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.FloatVal < {1}.FloatVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal < stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterEqualIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal >= {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal >= stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterEqualIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal >= {1}.FloatVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal >= stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterEqualFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.FloatVal >= {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal >= stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.GreaterEqualFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.FloatVal >= {1}.FloatVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal >= stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessEqualIntInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal <= {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal <= stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessEqualIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.IntVal <= {1}.FloatVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].IntVal <= stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessEqualFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "(({0}.FloatVal <= {1}.IntVal)?TRUE:FALSE)"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal <= stack[{1}].IntVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.LessEqualFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                          new PostParseOperation(
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                              new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                              "({0}.FloatVal <= {1}.FloatVal)?TRUE:FALSE"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].FloatVal <= stack[{1}].FloatVal)?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.Equal:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                                                  new PostParseOperation(
                                                      new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1),
                                                      new PostParseVariable(VariableType.Stack, ins.StackBefore_),
                                                      "(({0}.Compare({1})?TRUE:FALSE))"), true));

                        sb.AppendLine(string.Format("stack[{0}]=(stack[{0}].Compare(stack[{1}]))?TRUE:FALSE;", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;

                    case SpokeInstructionType.AddToArray:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1),
                                                  new PostParseStatement("{0}.AddArray({1})",
                                                                         new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1),
                                                                         new PostParseVariable(VariableType.Stack, ins.StackAfter_)), true));

                        sb.AppendLine(string.Format("stack[{0}].AddArray(stack[{1}]);", ins.StackAfter_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddRangeToArray:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1), new PostParseStatement("{0}.AddArrayRange({1})",
                                                                                                                            new PostParseVariable(VariableType.Stack, ins.StackAfter_ - 1),
                                                                                                                            new PostParseVariable(VariableType.Stack, ins.StackAfter_)), true));

                        sb.AppendLine(string.Format("stack[{0}].AddArrayRange(stack[{1}]);", ins.StackAfter_ - 1, ins.StackAfter_));
                        break;

                    case SpokeInstructionType.ArrayElem:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseStatement("{0}.ArrayItems[{1}.IntVal]", new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_)), true));
                        sb.AppendLine(string.Format("stack[{0}]=stack[{0}].ArrayItems[stack[{1}].IntVal];", ins.StackBefore_ - 1, ins.StackBefore_));

                        break;
                    case SpokeInstructionType.StoreArrayElem:

                        exps.Add(new PostParseStatement("{0}.ArrayItems[{1}.IntVal] = {2};", new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 2), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 3)));

                        sb.AppendLine(string.Format("stack[{1}].ArrayItems[stack[{0}].IntVal] = stack[{2}];", ins.StackBefore_ - 1, ins.StackBefore_ - 2, ins.StackBefore_ - 3));

                        break;

                    case SpokeInstructionType.AddIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.IntVal + {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal + stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));

                        break;
                    case SpokeInstructionType.AddFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal + {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal + stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.AddFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal + {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal + stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.SubtractIntFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.IntVal - {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal + stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.SubtractFloatInt:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal - {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal -stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.SubtractFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal - {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal - stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.MultiplyIntFloat:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.IntVal * {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal * stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_)); break;
                    case SpokeInstructionType.MultiplyFloatInt:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal * {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal * stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_)); break;
                    case SpokeInstructionType.MultiplyFloatFloat:
                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal *{1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal + stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_));
                        break;
                    case SpokeInstructionType.DivideIntFloat:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.IntVal / {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].IntVal / stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_)); break;
                    case SpokeInstructionType.DivideFloatInt:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal / {1}.IntVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal / stack[{1}].IntVal);", ins.StackBefore_ - 1, ins.StackAfter_)); break;
                    case SpokeInstructionType.DivideFloatFloat:

                        exps.Add(new PostParseSet(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseOperation(new PostParseVariable(VariableType.Stack, ins.StackBefore_ - 1), new PostParseVariable(VariableType.Stack, ins.StackAfter_), "new SpokeObject({0}.FloatVal / {1}.FloatVal)"), true));
                        sb.AppendLine(string.Format("stack[{0}]=new SpokeObject(stack[{0}].FloatVal / stack[{1}].FloatVal);", ins.StackBefore_ - 1, ins.StackAfter_)); break;

                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }

            return new Tuple<string, List<PostParseExpression>>(sb.ToString(), exps);
        }
 public void Need(int index, PostParseVariable right)
 {
     Items[right.Index].Add(right);
 }