コード例 #1
0
    public static object Execute(ELEMENT i_e, xmlScriptObj scrObj, STACKVAL stack)
    {
        if (i_e == null || i_e.isNONE())
        {
            return(null);
        }

        ELEMENT e = i_e;
        object  o;

        if (e.isSENTENCE())
        {
            e = e.GetListElement(0);
        }

        if (e.isNUMBER())
        {
            double x = 0;
            double.TryParse(e.raw, out x);
            return(x);
        }
        else if (e.isQUOTE())
        {
            return(e.raw);
        }
        else if (e.isNULL())
        {
            return(null);
        }
        else if (e.isBLOCK_M())
        {
            o = null;
            stack.PushStack();
            var l = e.list;
            if (l != null)
            {
                foreach (var s in l)
                {
                    if (s.isSENTENCE())
                    {
                        o = Execute(s.list[0], scrObj, stack);
                        if (o != null && xmlScriptGetMethod.ObjectGetType(o) == typeof(SENTENCE_STATE))
                        {
                            if (((SENTENCE_STATE)o).state != SENTENCE_STATE.STATE.NONE)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            stack.PopStack();
            return(o);
        }
        else if (e.isBLOCK_L())
        {
            return(xmlScriptArray.CreateArray(e, scrObj, stack));
        }
        else if (e.isBLOCK_C())
        {
            if (e.list == null || e.list.Count == 0)
            {
                return(null);
            }
            o = null;
            foreach (var s in e.list)
            {
                o = Execute(s, scrObj, stack);
            }
            return(o);
        }

        else if (Execute_Func_Pointer_Variable(e, scrObj, stack, out o))
        {
            return(o);
        }
        else if (e.isRETURN())
        {
            var ss = new SENTENCE_STATE();
            ss.state = SENTENCE_STATE.STATE.RETURN;
            ss.ret   = Execute(e.GetListElement(0), scrObj, stack);

            return(ss);
        }
        else if (e.isDEC_VAR())
        {
            stack.DeclareLocalVal(e.decname);
            return(e.decname);
        }
        else if (e.isOP())
        {
            if (e.group == GROUP.op_Assign)
            {
                var p0   = e.GetListElement(0);
                var p1   = e.GetListElement(1);
                var o_p1 = Execute(p1, scrObj, stack);


                if (p0.isVARIABLE())
                {
                    bool b = xmlScriptExecVar.ExecuteSetVariable(p0, o_p1, scrObj, stack);//  stack.SetVal(p0.raw, o_p1);
                    if (!b)
                    {
                        stack.SetGlobalVal(p0.raw, o_p1);
                    }
                }
                else if (p0.isPOINTER())
                {
                    xmlScriptExecPointer.ExecuteSetPointer(p0, o_p1, scrObj, stack);
                }
                else if (p0.isDEC_VAR())
                {
                    stack.SetVal((string)Execute(p0, scrObj, stack), o_p1);
                }
                return(null);
            }
            else
            {
                o = Execute_OP(e, scrObj, stack);

                if (e.group == GROUP.op_Increment_R || e.group == GROUP.op_Decrement_R)
                {
                    var p0 = e.GetListElement(0);
                    if (p0.isVARIABLE())
                    {
                        if (xmlScriptGetMethod.ObjectGetType(o) == typeof(double))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (double)o + 1, scrObj, stack); break; //stack.SetVal(p0.raw, (int)o + 1); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (double)o - 1, scrObj, stack); break; // stack.SetVal(p0.raw, (int)o - 1); break;
                            }
                        }
                        else if (xmlScriptGetMethod.ObjectGetType(o) == typeof(int))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (int)o + 1, scrObj, stack); break; //stack.SetVal(p0.raw, (int)o + 1); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (int)o - 1, scrObj, stack); break; // stack.SetVal(p0.raw, (int)o - 1); break;
                            }
                        }
                        else if (xmlScriptGetMethod.ObjectGetType(o) == typeof(float))
                        {
                            switch (e.group)
                            {
                            case GROUP.op_Increment_R: xmlScriptExecVar.ExecuteSetVariable(p0, (float)o + 1.0f, scrObj, stack); break; //  stack.SetVal(p0.raw, (float)o + 1.0f); break;

                            case GROUP.op_Decrement_R: xmlScriptExecVar.ExecuteSetVariable(p0, (float)o - 1.0f, scrObj, stack); break; //stack.SetVal(p0.raw, (float)o - 1.0f); break;
                            }
                        }
                    }
                }
                return(o);
            }
        }
        else if (Execute_FlowControl(e, scrObj, stack, out o))
        {
            return(o);
        }
        else if (e.isNEW())
        {
            ELEMENT last = e.GetListElement(0).GetPointerLast();
            if (!last.isFUNCTION())
            {
                throw new SystemException("ERROR NEW EXPECTED () ");
            }

            object[] args = last.GetListElement(0).GetListCount() > 0 ? new object[last.GetListElement(0).GetListCount()] : null;
            for (int i = 0; i < last.GetListElement(0).GetListCount(); i++)
            {
                args[i] = Execute(last.GetListElement(0).GetListElement(i), scrObj, stack);
            }

            return(xmlScriptReflection.CreateNewObject(e.GetListElement(0), args, scrObj, stack));
        }
        else if (e.isDELETE())
        {
            var p_o = Execute(e.GetListElement(0), scrObj, stack);
            if (p_o is UnityEngine.Object)
            {
                UnityEngine.Object.Destroy((UnityEngine.Object)p_o);
            }
            else if (p_o is System.IDisposable)
            {
                ((System.IDisposable)p_o).Dispose();
            }
            //ELEMENT last;
            //var pointerstr = GetPointerToString(e.GetListElement(0), out last);
            //TBD
        }
        return(null);
    }
コード例 #2
0
    static bool Execute_FlowControl(ELEMENT e, xmlScriptObj scrObj, STACKVAL stack, out object o)
    {
        o = null;
        if (e.isIF())
        {
            bool b = (bool)Execute(e.GetListElement(0), scrObj, stack);
            if (b)
            {
                o = Execute(e.GetListElement(1), scrObj, stack);  //Debug.LogError("isIF o=" + o);
                return(true);
            }
            for (int i = 2; i < e.list.Count; i++)
            {
                var s = e.GetListElement(i); if (s.isNONE())
                {
                    o = null; return(true);
                }
                if (s.isELSE())
                {
                    o = Execute(s.GetListElement(0), scrObj, stack);
                    return(true);
                }
                else if (s.isELSEIF())
                {
                    bool b2 = (bool)Execute(s.GetListElement(0), scrObj, stack);
                    if (b2)
                    {
                        o = Execute(s.GetListElement(1), scrObj, stack);
                        return(true);
                    }
                }
            }
        }
        else if (e.isSWITCH())
        {
            object x = null;
            {
                var p0 = e.GetListElement(0).GetListElement(0);
                x = Execute(p0, scrObj, stack);
            }

            var block       = e.GetListElement(1);
            int start_index = -1;
            for (int i = 0; i < block.GetListCount(); i++)
            {
                if (!block.GetListElement(i).isSENTENCE())
                {
                    continue;
                }
                var case_e = block.GetListElement(i).GetListElement(0);
                if (case_e.isCASE())
                {
                    var case_a = case_e.GetListElement(0);
                    if (case_a.raw == x.ToString())
                    {
                        start_index = i + 1;
                        break;
                    }
                }
                else if (case_e.isDEFAULT())
                {
                    start_index = i + 1;
                    break;
                }
            }

            if (start_index > 0)
            {
                for (int i = start_index; i < block.GetListCount(); i++)
                {
                    o = Execute(block.GetListElement(i), scrObj, stack);
                    if (o != null && xmlScriptGetMethod.ObjectGetType(o) == typeof(SENTENCE_STATE))
                    {
                        var ss = (SENTENCE_STATE)o;
                        if (ss.state == SENTENCE_STATE.STATE.BREAK)
                        {
                            break;
                        }
                    }
                }
            }
            return(true);
        }
        else if (e.isFOR())
        {
            var e_bc = e.GetListElement(0); //Debug.Log("e_bc" + e_bc); Debug.Log("e_bc.list[0]=" + e_bc.GetListElement(0)); Debug.Log("e_bc.list[1]=" + e_bc.GetListElement(1)); Debug.Log("e_bc.list[2]=" + e_bc.GetListElement(2));
            var e_bm = e.GetListElement(1); //Debug.Log("e_bm" + e_bm);
            stack.PushStack();
            Execute(e_bc.GetListElement(0), scrObj, stack);
            o = null;
            for (var i = 0; i < 200; i++)
            {
                bool b = (bool)Execute(e_bc.GetListElement(1), scrObj, stack);
                if (!b)
                {
                    break;
                }
                o = Execute(e_bm, scrObj, stack);
                if (o != null && xmlScriptGetMethod.ObjectGetType(o) == typeof(SENTENCE_STATE))
                {
                    var state = (SENTENCE_STATE)o;
                    if (state.state == SENTENCE_STATE.STATE.BREAK)
                    {
                        break;
                    }
                    if (state.state == SENTENCE_STATE.STATE.CONTINUE)
                    {
                        goto _FOR_LOOPEND;
                    }
                    if (state.state == SENTENCE_STATE.STATE.RETURN)
                    {
                        break;
                    }
                }
_FOR_LOOPEND:
                Execute(e_bc.GetListElement(2), scrObj, stack);
            }
            stack.PopStack();

            o = null;
            return(true);
        }
        else if (e.isWHILE())
        {
            var e_bc = e.GetListElement(0);
            var e_bm = e.GetListElement(1);

            stack.PushStack();
            Execute(e_bc.GetListElement(0), scrObj, stack);
            o = null;
            for (var i = 0; i < 200; i++)
            {
                bool b = (bool)Execute(e_bc.GetListElement(0), scrObj, stack);
                if (!b)
                {
                    break;
                }
                o = Execute(e_bm, scrObj, stack);
                if (o != null && xmlScriptGetMethod.ObjectGetType(o) == typeof(SENTENCE_STATE))
                {
                    var state = (SENTENCE_STATE)o;
                    if (state.state == SENTENCE_STATE.STATE.BREAK)
                    {
                        break;
                    }
                    if (state.state == SENTENCE_STATE.STATE.CONTINUE)
                    {
                        continue;
                    }
                    if (state.state == SENTENCE_STATE.STATE.RETURN)
                    {
                        break;
                    }
                }
            }
            stack.PopStack();

            o = null;
            return(true);
        }
        else if (e.isBREAK())
        {
            Debug.LogWarning("BREAK " + e);
            o = new SENTENCE_STATE()
            {
                state = SENTENCE_STATE.STATE.BREAK
            };
            return(true);
        }
        else if (e.isCONTINUE())
        {
            o = new SENTENCE_STATE()
            {
                state = SENTENCE_STATE.STATE.CONTINUE
            };
            return(true);
        }
        return(false);
    }