示例#1
0
        public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            decimal leftValue  = GetDecimalValue(typeof(T), left);
            decimal rightValue = GetDecimalValue(right.type, right.value);

            switch (code)
            {
            case logictoken.equal:
                return(leftValue == rightValue);

            case logictoken.less:
                return(leftValue < rightValue);

            case logictoken.less_equal:
                return(leftValue <= rightValue);

            case logictoken.more:
                return(leftValue > rightValue);

            case logictoken.more_equal:
                return(leftValue >= rightValue);

            case logictoken.not_equal:
                return(leftValue != rightValue);

            default:
                throw new Exception("Invalid MathLogic opCode = " + code);
            }
        }
示例#2
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)//[6] = {Boolean op_Equality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
     {
         if (left == null || right.type == null)
         {
             return(left == right.value);
         }
         else
         {
             return(left == right.value);
         }
     }
     else if (code == logictoken.not_equal)//[7] = {Boolean op_Inequality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
     {
         if (left == null || right.type == null)
         {
             return(left != right.value);
         }
         else
         {
             return(left != right.value);
         }
     }
     throw new NotImplementedException();
 }
示例#3
0
        public bool MathLogic(CLS_Content content, logictoken code, object left, CLS_Content.Value right)
        {
            int tLeft  = System.Convert.ToInt32(left);
            int tRight = System.Convert.ToInt32(right.value);

            switch (code)
            {
            case logictoken.equal:
                return(tLeft == tRight);

            case logictoken.not_equal:
                return(tLeft != tRight);

            case logictoken.more:
                return(tLeft > tRight);

            case logictoken.more_equal:
                return(tLeft >= tRight);

            case logictoken.less:
                return(tLeft < tRight);

            case logictoken.less_equal:
                return(tLeft <= tRight);
            }

            throw new NotImplementedException();
        }
示例#4
0
        public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            bool mathLogicSuccess = false;
            bool value = NumericTypeUtils.MathLogic<byte>(code, left, right, out mathLogicSuccess);
            if (mathLogicSuccess) {
                return value;
            }

            return base.MathLogic(env, code, left, right);
        }
示例#5
0
 public bool MathLogic(CLS_Environment env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)
     {
         return null == right.value;
     }
     else if(code== logictoken.not_equal)
     {
         return null != right.value;
     }
     throw new NotImplementedException();
 }
示例#6
0
 public bool MathLogic(CLS_Environment env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)
     {
         return(null == right.value);
     }
     else if (code == logictoken.not_equal)
     {
         return(null != right.value);
     }
     throw new NotImplementedException();
 }
示例#7
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)
     {
         return((string)left == (string)right.value);
     }
     else if (code == logictoken.not_equal)
     {
         return((string)left != (string)right.value);
     }
     throw new NotImplementedException();
 }
示例#8
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)
     {
         return (string)left == (string)right.value;
     }
     else if(code == logictoken.not_equal)
     {
         return (string)left != (string)right.value;
     }
     throw new NotImplementedException();
 }
示例#9
0
        public override bool MathLogic(CQ_Content env, logictoken code, object left, CQ_Content.Value right)
        {
            bool mathLogicSuccess = false;
            bool value            = NumericTypeUtils.MathLogic <ulong>(code, left, right, out mathLogicSuccess);

            if (mathLogicSuccess)
            {
                return(value);
            }

            return(base.MathLogic(env, code, left, right));
        }
示例#10
0
        public virtual bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            System.Reflection.MethodInfo call = null;

            //var m = _type.GetMethods();
            if (code == logictoken.more)//[2] = {Boolean op_GreaterThan(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                call = _type.GetMethod("op_GreaterThan");
            }
            else if (code == logictoken.less)//[4] = {Boolean op_LessThan(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                call = _type.GetMethod("op_LessThan");
            }
            else if (code == logictoken.more_equal)//[3] = {Boolean op_GreaterThanOrEqual(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                call = _type.GetMethod("op_GreaterThanOrEqual");
            }
            else if (code == logictoken.less_equal)//[5] = {Boolean op_LessThanOrEqual(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                call = _type.GetMethod("op_LessThanOrEqual");
            }
            else if (code == logictoken.equal)//[6] = {Boolean op_Equality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                if (left == null || right.type == null)
                {
                    return(left == right.value);
                }



                call = _type.GetMethod("op_Equality");
                if (call == null)
                {
                    return(left.Equals(right.value));
                }
            }
            else if (code == logictoken.not_equal)//[7] = {Boolean op_Inequality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                if (left == null || right.type == null)
                {
                    return(left != right.value);
                }
                call = _type.GetMethod("op_Inequality");
                if (call == null)
                {
                    return(!left.Equals(right.value));
                }
            }
            var obj = call.Invoke(null, new object[] { left, right.value });

            return((bool)obj);
        }
    public override bool MathLogic(CLS_Content content, logictoken code, object left, CLS_Content.Value right)
    {
        if (code == logictoken.equal)
        {
            return(((UnityEngine.Object)left) == ((UnityEngine.Object)right.value));
        }
        if (code == logictoken.not_equal)
        {
            return(((UnityEngine.Object)left) != ((UnityEngine.Object)right.value));
        }

        return(base.MathLogic(content, code, left, right));
    }
示例#12
0
    public override bool MathLogic(CLS_Content content, logictoken code, object left, CLS_Content.Value right)
    {
        if (code == logictoken.equal)
        {
            return ((Color)left) == ((Color)right.value);
        }
        if (code == logictoken.not_equal)
        {
            return ((Color)left) != ((Color)right.value);
        }

        return base.MathLogic(content, code, left, right);
    }
示例#13
0
        public virtual bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            if (code == logictoken.equal)
            {
                if (left == null)
                {
                    return(left == right.value);
                }
                return(left.Equals(right.value));
            }
            else if (code == logictoken.not_equal)
            {
                if (left == null)
                {
                    return(left != right.value);
                }
                return(!left.Equals(right.value));
            }

            throw new NotImplementedException("未实现逻辑运算: " + code);
        }
示例#14
0
        public static bool MathLogic <LeftType>(logictoken logicCode, object left, CQ_Content.Value right, out bool mathLogicSuccess)
        {
            mathLogicSuccess = true;

            try
            {
                decimal leftValue  = GetDecimalValue(typeof(LeftType), left);
                decimal rightValue = GetDecimalValue(right.type, right.value);

                switch (logicCode)
                {
                case logictoken.equal:
                    return(leftValue == rightValue);

                case logictoken.less:
                    return(leftValue < rightValue);

                case logictoken.less_equal:
                    return(leftValue <= rightValue);

                case logictoken.more:
                    return(leftValue > rightValue);

                case logictoken.more_equal:
                    return(leftValue >= rightValue);

                case logictoken.not_equal:
                    return(leftValue != rightValue);

                default:
                    throw new Exception("Invalid logic operation::logicCode = " + logicCode.ToString());
                }
            }
            catch (Exception)
            {
                mathLogicSuccess = false;
                return(false);
            }
        }
示例#15
0
        public bool MathLogic(CLS_Content content, logictoken code, object left, CLS_Content.Value right)
        {
            int tLeft = System.Convert.ToInt32(left);
            int tRight = System.Convert.ToInt32(right.value);

            switch (code)
            {
                case logictoken.equal:
                    return tLeft == tRight;
                case logictoken.not_equal:
                    return tLeft != tRight;
                case logictoken.more:
                    return tLeft > tRight;
                case logictoken.more_equal:
                    return tLeft >= tRight;
                case logictoken.less:
                    return tLeft < tRight;
                case logictoken.less_equal:
                    return tLeft <= tRight;
            }

            throw new NotImplementedException();
        }
示例#16
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     throw new NotImplementedException();
 }
示例#17
0
        public virtual bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            if (code == logictoken.equal)
            {
                if (left == null)
                    return left == right.value;
                return left.Equals(right.value);
            }
            else if (code == logictoken.not_equal)
            {
                if (left == null)
                    return left != right.value;
                return !left.Equals(right.value);
            }

            throw new NotImplementedException("未实现逻辑运算: " + code);
        }
示例#18
0
        public virtual bool MathLogic(CLS_Environment env, logictoken code, object left, CLS_Content.Value right)
        {
            System.Reflection.MethodInfo call = null;

            //var m = type.GetMethods();
            if (code == logictoken.more)//[2] = {Boolean op_GreaterThan(CLScriptExt.Vector3, CLScriptExt.Vector3)}
                call = type.GetMethod("op_GreaterThan");
            else if (code == logictoken.less)//[4] = {Boolean op_LessThan(CLScriptExt.Vector3, CLScriptExt.Vector3)}
                call = type.GetMethod("op_LessThan");
            else if (code == logictoken.more_equal)//[3] = {Boolean op_GreaterThanOrEqual(CLScriptExt.Vector3, CLScriptExt.Vector3)}
                call = type.GetMethod("op_GreaterThanOrEqual");
            else if (code == logictoken.less_equal)//[5] = {Boolean op_LessThanOrEqual(CLScriptExt.Vector3, CLScriptExt.Vector3)}
                call = type.GetMethod("op_LessThanOrEqual");
            else if (code == logictoken.equal)//[6] = {Boolean op_Equality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                if(left==null || right.type==null)
                {
                    return left == right.value;
                }
                call = type.GetMethod("op_Equality");
            }
            else if (code == logictoken.not_equal)//[7] = {Boolean op_Inequality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
            {
                if (left == null || right.type == null)
                {
                    return left != right.value;
                }
                call = type.GetMethod("op_Inequality");
            }
            var obj = call.Invoke(null, new object[] { left, right.value });
            return (bool)obj;
        }
示例#19
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if (code == logictoken.equal)//[6] = {Boolean op_Equality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
     {
         if (left == null || right.type == null)
         {
             return left == right.value;
         }
         else
         {
             return left == right.value;
         }
     }
     else if (code == logictoken.not_equal)//[7] = {Boolean op_Inequality(CLScriptExt.Vector3, CLScriptExt.Vector3)}
     {
         if (left == null || right.type == null)
         {
             return left != right.value;
         }
         else
         {
             return left != right.value;
         }
     }
     throw new NotImplementedException();
 }
示例#20
0
        public ICLS_Expression Compiler_Expression_Math(IList <Token> tlist, ICLS_Environment environment, int pos, int posend)
        {
            IList <int> sps = SplitExpressionWithOp(tlist, pos, posend);

            if (sps == null)
            {
                LogError(tlist, "SplitExpressionWithOp return null", pos, posend);
            }
            int oppos = GetLowestMathOp(tlist, sps);

            if (oppos < 0)
            {
                if (tlist[pos + 1].type == TokenType.PUNCTUATION && tlist[pos + 1].text == "(")//函数表达式
                {
                    CLS_Expression_Function func = (CLS_Expression_Function)Compiler_Expression_Function(tlist, environment, pos, posend);
                    if (func != null)
                    {
                        if (environment.GetFunction(func.funcname) != null)
                        {
                            CLS_Expression_GlobalFunction globalFunc = new CLS_Expression_GlobalFunction(func.listParam, func.tokenBegin, func.tokenEnd, func.lineBegin, func.lineEnd);
                            globalFunc.funcname = func.funcname;
                            return(globalFunc);
                        }
                    }
                    return(func);
                }
                return(null);
            }
            Token tkCur = tlist[oppos];

            if (tkCur.text == "=>")
            {
                return(Compiler_Expression_Lambda(tlist, environment, pos, posend));
            }
            else if (tkCur.text == "." && pos == oppos - 1 && tlist[pos].type == TokenType.TYPE)
            {
                int right    = oppos + 1;
                int rightend = posend;

                ICLS_Expression valueright;
                bool            succ2 = Compiler_Expression(tlist, environment, right, rightend, out valueright);
                if (succ2)
                {
                    CLS_Expression_GetValue vg = valueright as CLS_Expression_GetValue;
                    CLS_Expression_Function vf = valueright as CLS_Expression_Function;
                    if (vg != null)
                    {
                        // 优化枚举常量表达式
                        try
                        {
                            System.Type sysType = environment.GetTypeByKeyword(tlist[pos].text).type;
                            if (sysType != null && sysType.IsEnum)
                            {
                                CLS_Expression_Enum enumVal = new CLS_Expression_Enum(sysType);
                                enumVal.tokenBegin = pos;
                                enumVal.tokenEnd   = rightend;
                                enumVal.lineBegin  = tlist[pos].line;
                                enumVal.lineEnd    = tlist[rightend].line;
                                enumVal.value      = Enum.Parse(sysType, vg.value_name);
                                return(enumVal);
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Log_Warn("Enum expression: " + ex.Message);
                        }
                        CLS_Expression_StaticFind value = new CLS_Expression_StaticFind(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.staticmembername = vg.value_name;
                        value.type             = environment.GetTypeByKeyword(tlist[pos].text);
                        return(value);
                    }
                    else if (vf != null)
                    {
                        CLS_Expression_StaticFunction value = new CLS_Expression_StaticFunction(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.functionName = vf.funcname;
                        value.type         = environment.GetTypeByKeyword(tlist[pos].text);
                        value.listParam.AddRange(vf.listParam.ToArray());
                        return(value);
                    }
                    else if (valueright is CLS_Expression_SelfOp)
                    {
                        CLS_Expression_SelfOp     vr    = valueright as CLS_Expression_SelfOp;
                        CLS_Expression_StaticMath value = new CLS_Expression_StaticMath(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.type             = environment.GetTypeByKeyword(tlist[pos].text);
                        value.staticmembername = vr.value_name;
                        value.mathop           = vr.mathop;
                        return(value);
                    }
                    else
                    {
                        throw new Exception("不可识别的表达式:" + tkCur.ToString());
                    }
                }
                else
                {
                    throw new Exception("不可识别的表达式:" + tkCur.ToString());
                }
            }
            else
            {
                int left     = pos;
                int leftend  = oppos - 1;
                int right    = oppos + 1;
                int rightend = posend;
                if (tkCur.text == "(")
                {
                    int offset = 0;
                    // 如果是(Type[])
                    if (tlist[oppos + 2].text == "[" && tlist[oppos + 3].text == "]")
                    {
                        offset = 5;
                    }
                    // 普通强转类型(Type) (Type.Type) (Type.Type.Type)
                    else if (tlist[oppos + 2].text == ")")
                    {
                        offset = 3;
                    }
                    else
                    {
                        LogError(tlist, "暂不支持该语法,可以删除多余的括号", pos, posend);
                        return(null);
                    }
                    if (offset > 0)
                    {
                        ICLS_Expression v;
                        if (!Compiler_Expression(tlist, environment, oppos + offset, posend, out v))
                        {
                            LogError(tlist, "编译表达式失败", right, rightend);
                            return(null);
                        }
                        CLS_Expression_TypeConvert convert = new CLS_Expression_TypeConvert(pos, posend, tlist[pos].line, tlist[posend].line);
                        convert.listParam.Add(v);
                        convert.targettype = environment.GetTypeByKeyword(tlist[oppos + 1].text).type;
                        return(convert);
                    }
                }
                ICLS_Expression valueleft;
                bool            succ1 = Compiler_Expression(tlist, environment, left, leftend, out valueleft);
                ICLS_Expression valueright;
                if (tkCur.text == "[")
                {
                    Token tkEnd = tlist[rightend];

                    if (tkEnd.text == "++" || tkEnd.text == "--")
                    {
                        rightend -= 2;
                    }
                    else
                    {
                        rightend--;
                    }

                    if (!Compiler_Expression(tlist, environment, right, rightend, out valueright))
                    {
                        LogError(tlist, "编译表达式失败", right, rightend);
                        return(null);
                    }

                    CLS_Expression_IndexFind value = new CLS_Expression_IndexFind(left, rightend, tlist[left].line, tlist[rightend].line);
                    value.listParam.Add(valueleft);
                    value.listParam.Add(valueright);

                    if (tkEnd.text == "++" || tkEnd.text == "--")
                    {
                        CLS_Expression_SelfOpWithValue selfOpExp = new CLS_Expression_SelfOpWithValue(left, posend, tlist[left].line, tlist[posend].line);
                        selfOpExp.listParam.Add(value);
                        selfOpExp.listParam.Add(new CLS_Expression_Value <int>()
                        {
                            value = 1
                        });
                        selfOpExp.mathop = tkEnd.text[0];
                        return(selfOpExp);
                    }
                    return(value);
                }
                else if (tkCur.text == "as")
                {
                    CLS_Expression_TypeConvert convert = new CLS_Expression_TypeConvert(left, oppos + 1, tlist[left].line, tlist[oppos + 1].line);
                    convert.listParam.Add(valueleft);
                    convert.targettype = environment.GetTypeByKeyword(tlist[oppos + 1].text).type;
                    return(convert);
                }
                else if (tkCur.text == "is")
                {
                    CLS_Expression_TypeCheck check = new CLS_Expression_TypeCheck(left, oppos + 1, tlist[left].line, tlist[oppos + 1].line);
                    check.listParam.Add(valueleft);
                    check.targettype = environment.GetTypeByKeyword(tlist[oppos + 1].text).type;
                    return(check);
                }
                bool succ2 = Compiler_Expression(tlist, environment, right, rightend, out valueright);
                if (succ1 && succ2 && valueright != null && valueleft != null)
                {
                    if (tkCur.text == "=")
                    {
                        //member set
                        CLS_Expression_MemberFind mfinde = valueleft as CLS_Expression_MemberFind;
                        CLS_Expression_StaticFind sfinde = valueleft as CLS_Expression_StaticFind;
                        CLS_Expression_IndexFind  ifinde = valueleft as CLS_Expression_IndexFind;
                        if (mfinde != null)
                        {
                            CLS_Expression_MemberSetValue value = new CLS_Expression_MemberSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.membername = mfinde.membername;
                            value.listParam.Add(mfinde.listParam[0]);
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else if (sfinde != null)
                        {
                            CLS_Expression_StaticSetValue value = new CLS_Expression_StaticSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.staticmembername = sfinde.staticmembername;
                            value.type             = sfinde.type;
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else if (ifinde != null)
                        {
                            CLS_Expression_IndexSetValue value = new CLS_Expression_IndexSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(ifinde.listParam[0]);
                            value.listParam.Add(ifinde.listParam[1]);
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else
                        {
                            throw new Exception("非法的Member Set表达式: " + valueleft + " file: " + m_curFileName);
                        }
                    }
                    else if (tkCur.text == ".")
                    {
                        //FindMember
                        CLS_Expression_GetValue vg = valueright as CLS_Expression_GetValue;
                        CLS_Expression_Function vf = valueright as CLS_Expression_Function;
                        if (vg != null)
                        {
                            CLS_Expression_MemberFind value = new CLS_Expression_MemberFind(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.membername = vg.value_name;
                            return(value);
                        }
                        else if (vf != null)
                        {
                            CLS_Expression_MemberFunction value = new CLS_Expression_MemberFunction(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.functionName = vf.funcname;
                            value.listParam.Add(valueleft);
                            value.listParam.AddRange(vf.listParam.ToArray());
                            return(value);
                        }
                        else if (valueright is CLS_Expression_SelfOp)
                        {
                            CLS_Expression_SelfOp     vr    = valueright as CLS_Expression_SelfOp;
                            CLS_Expression_MemberMath value = new CLS_Expression_MemberMath(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.membername = vr.value_name;
                            value.mathop     = vr.mathop;
                            return(value);
                        }
                        throw new Exception("不可识别的表达式" + valueleft + "." + valueright);
                    }
                    else if (tkCur.text == "+=" || tkCur.text == "-=" || tkCur.text == "*=" || tkCur.text == "/=" || tkCur.text == "%=")
                    {
                        CLS_Expression_SelfOpWithValue value = new CLS_Expression_SelfOpWithValue(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        value.mathop = tkCur.text[0];
                        return(value);
                    }
                    else if (tkCur.text == ">>=" || tkCur.text == "<<=" || tkCur.text == "&=" || tkCur.text == "|=" || tkCur.text == "^=")
                    {
                        CLS_Expression_SelfOpWithValue value = new CLS_Expression_SelfOpWithValue(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        value.mathop = tkCur.text[0];
                        return(value);
                    }
                    else if (tkCur.text == "&&" || tkCur.text == "||")
                    {
                        CLS_Expression_Math2ValueAndOr value = new CLS_Expression_Math2ValueAndOr(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        value.mathop = tkCur.text[0];
                        return(value);
                    }
                    else if (tkCur.text == ">" || tkCur.text == ">=" || tkCur.text == "<" || tkCur.text == "<=" || tkCur.text == "==" || tkCur.text == "!=")
                    {
                        CLS_Expression_Math2ValueLogic value = new CLS_Expression_Math2ValueLogic(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        logictoken token = logictoken.not_equal;
                        if (tkCur.text == ">")
                        {
                            token = logictoken.more;
                        }
                        else if (tkCur.text == ">=")
                        {
                            token = logictoken.more_equal;
                        }
                        else if (tkCur.text == "<")
                        {
                            token = logictoken.less;
                        }
                        else if (tkCur.text == "<=")
                        {
                            token = logictoken.less_equal;
                        }
                        else if (tkCur.text == "==")
                        {
                            token = logictoken.equal;
                        }
                        else if (tkCur.text == "!=")
                        {
                            token = logictoken.not_equal;
                        }
                        value.mathop = token;
                        return(value);
                    }
                    else
                    {
                        char mathop = tkCur.text[0];
                        if (mathop == '?')
                        {
                            CLS_Expression_Math3Value value = new CLS_Expression_Math3Value(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);

                            CLS_Expression_Math2Value vvright = valueright as CLS_Expression_Math2Value;
                            if (vvright.mathop != ':')
                            {
                                throw new Exception("三元表达式异常" + tkCur.ToString());
                            }
                            value.listParam.Add(vvright.listParam[0]);
                            value.listParam.Add(vvright.listParam[1]);
                            return(value);
                        }
                        else
                        {
                            CLS_Expression_Math2Value value = new CLS_Expression_Math2Value(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.listParam.Add(valueright);
                            value.mathop = mathop;
                            return(value);
                        }
                    }
                }
                else
                {
                    LogError(tlist, "编译表达式失败", right, rightend);
                }
            }
            return(null);
        }
示例#21
0
        public ICQ_Expression Compiler_Expression_Math(IList <Token> tlist, ICQ_Environment content, int pos, int posend)
        {
            IList <int> sps   = SplitExpressionWithOp(tlist, pos, posend);
            int         oppos = GetLowestMathOp(tlist, sps);

            if (oppos < 0)
            {
                ////也有可能是类型转换
                //if (posend >= pos + 3 && tlist[pos].text == "(" && tlist[pos].type == TokenType.PUNCTUATION && tlist[pos + 2].text == ")" && tlist[pos + 2].type == TokenType.PUNCTUATION
                //    && tlist[pos + 1].type == TokenType.TYPE
                //    )
                //{
                //    ICQ_Expression v;
                //    bool succ = Compiler_Expression(tlist, content, pos + 3, posend, out v);
                //    CQ_Expression_TypeConvert convert = new CQ_Expression_TypeConvert();
                //    convert.listParam.Add(v);
                //    convert.targettype = content.environment.GetTypeByKeyword(tlist[pos + 1].text).type;


                //    return convert;
                //}
                //else if (tlist[pos + 1].type == TokenType.PUNCTUATION && tlist[pos + 1].text == "[")//函数表达式
                //{
                //    return Compiler_Expression_IndexFind(tlist, content, pos, posend);
                //}
                if (tlist[pos + 1].type == TokenType.PUNCTUATION && tlist[pos + 1].text == "(")//函数表达式
                {
                    if (content.IsCoroutine(tlist[pos].text))
                    {
//					if(tlist[pos].text == "YieldWaitForSecond")
                        return(Compiler_Expression_Coroutine(tlist, content, pos, posend));
                    }
                    else
                    {
                        return(Compiler_Expression_Function(tlist, content, pos, posend));
                    }
                }
                else
                {
                    //if (!bTest && tlist[expbegin + 1].type == TokenType.PUNCTUATION && tlist[expbegin + 1].text == "(")//函数表达式
                    //{
                    //    ICQ_Expression subvalue = Compiler_Expression_Function(tlist,content, expbegin, expend);
                    //    if (null == subvalue) return false;
                    //    else
                    //        values.Add(subvalue);
                    //    bTest = true;
                    //}
                }
                return(null);
            }
            Token tkCur = tlist[oppos];

            if (tkCur.text == "=>")
            {
                //lambda
                return(Compiler_Expression_Lambda(tlist, content, pos, posend));
            }
            else if (tkCur.text == "." && pos == oppos - 1 && tlist[pos].type == TokenType.TYPE)
            {
                int right    = oppos + 1;
                int rightend = posend;

                ICQ_Expression valueright;
                bool           succ2 = Compiler_Expression(tlist, content, right, rightend, out valueright);
                if (succ2)
                {
                    CQ_Expression_GetValue vg = valueright as CQ_Expression_GetValue;
                    CQ_Expression_Function vf = valueright as CQ_Expression_Function;
                    if (vg != null)
                    {
                        CQ_Expression_StaticFind value = new CQ_Expression_StaticFind(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.staticmembername = vg.value_name;
                        value.type             = content.GetTypeByKeyword(tlist[pos].text);
                        return(value);
                    }
                    else if (vf != null)
                    {
                        CQ_Expression_StaticFunction value = new CQ_Expression_StaticFunction(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.functionName = vf.funcname;
                        value.type         = content.GetTypeByKeyword(tlist[pos].text);
                        //value.listParam.Add(valueleft);
                        value.listParam.AddRange(vf.listParam.ToArray());
                        return(value);
                    }
                    else if (valueright is CQ_Expression_SelfOp)
                    {
                        CQ_Expression_SelfOp vr = valueright as CQ_Expression_SelfOp;

                        CQ_Expression_StaticMath value = new CQ_Expression_StaticMath(pos, rightend, tlist[pos].line, tlist[rightend].line);
                        value.type             = content.GetTypeByKeyword(tlist[pos].text);
                        value.staticmembername = vr.value_name;
                        value.mathop           = vr.mathop;
                        return(value);
                    }
                    else
                    {
                        throw new Exception("不可识别的表达式:" + tkCur.ToString() + tkCur.SourcePos());
                    }
                }
                else
                {
                    throw new Exception("不可识别的表达式:" + tkCur.ToString() + tkCur.SourcePos());
                }
            }
            else
            {
                int left     = pos;
                int leftend  = oppos - 1;
                int right    = oppos + 1;
                int rightend = posend;
                if (tkCur.text == "(")
                {
                    ICQ_Expression v;
                    if (!Compiler_Expression(tlist, content, oppos + 3, posend, out v))
                    {
                        LogError(tlist, "编译表达式失败", right, rightend);
                        return(null);
                    }
                    CQ_Expression_TypeConvert convert = new CQ_Expression_TypeConvert(pos, posend, tlist[pos].line, tlist[posend].line);
                    convert.listParam.Add(v);
                    convert.targettype = content.GetTypeByKeyword(tlist[oppos + 1].text).type;

                    return(convert);
                }
                ICQ_Expression valueleft;
                bool           succ1 = Compiler_Expression(tlist, content, left, leftend, out valueleft);
                ICQ_Expression valueright;
                if (tkCur.text == "[")
                {
                    rightend--;
                    if (!Compiler_Expression(tlist, content, right, rightend, out valueright))
                    {
                        LogError(tlist, "编译表达式失败", right, rightend);
                        return(null);
                    }
                    CQ_Expression_IndexFind value = new CQ_Expression_IndexFind(left, rightend, tlist[left].line, tlist[rightend].line);
                    value.listParam.Add(valueleft);
                    value.listParam.Add(valueright);
                    return(value);
                }
                else if (tkCur.text == "as")
                {
                    CQ_Expression_TypeConvert convert = new CQ_Expression_TypeConvert(left, oppos + 1, tlist[left].line, tlist[oppos + 1].line);
                    convert.listParam.Add(valueleft);
                    convert.targettype = content.GetTypeByKeyword(tlist[oppos + 1].text).type;


                    return(convert);
                }
                else if (tkCur.text == "is")
                {
                    CQ_Expression_TypeCheck check = new CQ_Expression_TypeCheck(left, oppos + 1, tlist[left].line, tlist[oppos + 1].line);
                    check.listParam.Add(valueleft);
                    check.targettype = content.GetTypeByKeyword(tlist[oppos + 1].text).type;


                    return(check);
                }
                bool succ2 = Compiler_Expression(tlist, content, right, rightend, out valueright);
                if (succ1 && succ2 && valueright != null && valueleft != null)
                {
                    if (tkCur.text == "=")
                    {
                        //member set

                        CQ_Expression_MemberFind mfinde = valueleft as CQ_Expression_MemberFind;
                        CQ_Expression_StaticFind sfinde = valueleft as CQ_Expression_StaticFind;
                        CQ_Expression_IndexFind  ifinde = valueleft as CQ_Expression_IndexFind;
                        if (mfinde != null)
                        {
                            CQ_Expression_MemberSetValue value = new CQ_Expression_MemberSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.membername = mfinde.membername;
                            value.listParam.Add(mfinde.listParam[0]);
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else if (sfinde != null)
                        {
                            CQ_Expression_StaticSetValue value = new CQ_Expression_StaticSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.staticmembername = sfinde.staticmembername;
                            value.type             = sfinde.type;
                            //value.listParam.Add(mfinde.listParam[0]);
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else if (ifinde != null)
                        {
                            CQ_Expression_IndexSetValue value = new CQ_Expression_IndexSetValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(ifinde.listParam[0]);
                            value.listParam.Add(ifinde.listParam[1]);
                            value.listParam.Add(valueright);
                            return(value);
                        }
                        else
                        {
                            throw new Exception("非法的Member Set表达式" + valueleft);
                        }
                    }
                    else if (tkCur.text == ".")
                    {
                        //FindMember
                        CQ_Expression_GetValue vg = valueright as CQ_Expression_GetValue;
                        CQ_Expression_Function vf = valueright as CQ_Expression_Function;

                        if (vg != null)
                        {
                            CQ_Expression_MemberFind value = new CQ_Expression_MemberFind(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.membername = vg.value_name;
                            return(value);
                        }
                        else if (vf != null)
                        {
                            CQ_Expression_MemberFunction value = new CQ_Expression_MemberFunction(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.functionName = vf.funcname;
                            value.listParam.Add(valueleft);
                            value.listParam.AddRange(vf.listParam.ToArray());
                            return(value);
                        }

                        else if (valueright is CQ_Expression_SelfOp)
                        {
                            CQ_Expression_SelfOp vr = valueright as CQ_Expression_SelfOp;

                            CQ_Expression_MemberMath value = new CQ_Expression_MemberMath(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.membername = vr.value_name;
                            value.mathop     = vr.mathop;
                            return(value);
                        }

                        throw new Exception("不可识别的表达式" + valueleft + "." + valueright);
                        //value.listParam.Add(valueright);
                    }
                    else if (tkCur.text == "+=" || tkCur.text == "-=" || tkCur.text == "*=" || tkCur.text == "/=" || tkCur.text == "%=")
                    {
                        //if (valueleft is CQ_Expression_MemberFind)
                        //{
                        //    CQ_Expression_MemberFind vf = valueleft as CQ_Expression_MemberFind;
                        //    CQ_Expression_MemberMath value = new CQ_Expression_MemberMath(left, rightend, tlist[left].line, tlist[rightend].line);
                        //    value.listParam.Add(vf.listParam[0]);
                        //    value.membername = vf.membername;
                        //    value.mathop = tlist[oppos].text[0];
                        //    value.listParam.Add(valueright);
                        //    return value;
                        //}
                        //if ((valueright is CQ_Expression_Lambda ==false) && valueleft is CQ_Expression_StaticFind)
                        //{
                        //    CQ_Expression_StaticFind vf = valueleft as CQ_Expression_StaticFind;
                        //    CQ_Expression_StaticMath value = new CQ_Expression_StaticMath(left, rightend, tlist[left].line, tlist[rightend].line);
                        //    value.type = vf.type;
                        //    value.staticmembername = vf.staticmembername;
                        //    value.mathop = tlist[oppos].text[0];
                        //    value.listParam.Add(valueright);
                        //    return value;
                        //}
                        //else
                        {
                            CQ_Expression_SelfOpWithValue value = new CQ_Expression_SelfOpWithValue(left, rightend, tlist[left].line, tlist[rightend].line);
                            //value.value_name = ((CQ_Expression_GetValue)valueleft).value_name;
                            value.listParam.Add(valueleft);
                            value.listParam.Add(valueright);
                            value.mathop = tkCur.text[0];
                            return(value);
                        }
                    }
                    else if (tkCur.text == "&&" || tkCur.text == "||")
                    {
                        CQ_Expression_Math2ValueAndOr value = new CQ_Expression_Math2ValueAndOr(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        value.mathop = tkCur.text[0];
                        return(value);
                    }
                    else if (tkCur.text == ">" || tkCur.text == ">=" || tkCur.text == "<" || tkCur.text == "<=" || tkCur.text == "==" || tkCur.text == "!=")
                    {
                        CQ_Expression_Math2ValueLogic value = new CQ_Expression_Math2ValueLogic(left, rightend, tlist[left].line, tlist[rightend].line);
                        value.listParam.Add(valueleft);
                        value.listParam.Add(valueright);
                        logictoken token = logictoken.not_equal;
                        if (tkCur.text == ">")
                        {
                            token = logictoken.more;
                        }
                        else if (tkCur.text == ">=")
                        {
                            token = logictoken.more_equal;
                        }
                        else if (tkCur.text == "<")
                        {
                            token = logictoken.less;
                        }
                        else if (tkCur.text == "<=")
                        {
                            token = logictoken.less_equal;
                        }
                        else if (tkCur.text == "==")
                        {
                            token = logictoken.equal;
                        }
                        else if (tkCur.text == "!=")
                        {
                            token = logictoken.not_equal;
                        }
                        value.mathop = token;
                        return(value);
                    }
                    else
                    {
                        char mathop = tkCur.text[0];
                        if (mathop == '?')
                        {
                            CQ_Expression_Math3Value value = new CQ_Expression_Math3Value(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);

                            CQ_Expression_Math2Value vvright = valueright as CQ_Expression_Math2Value;
                            if (vvright.mathop != ':')
                            {
                                throw new Exception("三元表达式异常" + tkCur.ToString() + tkCur.SourcePos());
                            }
                            value.listParam.Add(vvright.listParam[0]);
                            value.listParam.Add(vvright.listParam[1]);
                            return(value);
                        }
                        else
                        {
                            CQ_Expression_Math2Value value = new CQ_Expression_Math2Value(left, rightend, tlist[left].line, tlist[rightend].line);
                            value.listParam.Add(valueleft);
                            value.listParam.Add(valueright);
                            value.mathop = mathop;
                            return(value);
                        }
                    }
                }
                else
                {
                    LogError(tlist, "编译表达式失败", right, rightend);
                }
            }

            return(null);
        }
 public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     throw new NotImplementedException("CSLE.SInstance.MathLogic");
 }
示例#23
0
 public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     throw new NotImplementedException();
 }
示例#24
0
        public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            if (code == logictoken.equal)
            {
                if (right.value is int)
                {
                    return((long)left == (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left == (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left == (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left == (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left == (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left == Convert.ToInt64(right.value));
                }
            }
            else if (code == logictoken.not_equal)
            {
                if (right.value is int)
                {
                    return((long)left != (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left != (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left != (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left != (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left != (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left != Convert.ToInt64(right.value));
                }
            }
            else if (code == logictoken.less)
            {
                if (right.value is int)
                {
                    return((long)left < (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left < (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left < (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left < (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left < (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left < Convert.ToInt64(right.value));
                }
            }
            else if (code == logictoken.less_equal)
            {
                if (right.value is int)
                {
                    return((long)left <= (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left <= (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left <= (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left <= (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left <= (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left <= Convert.ToInt64(right.value));
                }
            }
            else if (code == logictoken.more)
            {
                if (right.value is int)
                {
                    return((long)left > (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left > (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left > (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left > (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left > (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left > Convert.ToInt64(right.value));
                }
            }
            else if (code == logictoken.more_equal)
            {
                if (right.value is int)
                {
                    return((long)left >= (int)right.value);
                }
                else if (right.value is long)
                {
                    return((long)left >= (long)right.value);
                }
                else if (right.value is double)
                {
                    return((long)left >= (double)right.value);
                }
                else if (right.value is float)
                {
                    return((long)left >= (float)right.value);
                }
                else if (right.value is uint)
                {
                    return((long)left >= (uint)right.value);
                }
                else if (right.value is IConvertible)
                {
                    return((long)left >= Convert.ToInt64(right.value));
                }
            }

            return(base.MathLogic(env, code, left, right));
        }
示例#25
0
 public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if ((Type)right.type == typeof(int))
     {
         if (code == logictoken.equal)
             return (byte)left == (int)right.value;
         else if (code == logictoken.less)
             return (byte)left < (int)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (int)right.value;
         else if (code == logictoken.more)
             return (byte)left > (int)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (int)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (int)right.value;
     }
     else if ((Type)right.type == typeof(short))
     {
         if (code == logictoken.equal)
             return (byte)left == (short)right.value;
         else if (code == logictoken.less)
             return (byte)left < (short)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (short)right.value;
         else if (code == logictoken.more)
             return (byte)left > (short)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (short)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (short)right.value;
     }
     else if ((Type)right.type == typeof(sbyte))
     {
         if (code == logictoken.equal)
             return (byte)left == (sbyte)right.value;
         else if (code == logictoken.less)
             return (byte)left < (sbyte)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (sbyte)right.value;
         else if (code == logictoken.more)
             return (byte)left > (sbyte)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (sbyte)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (sbyte)right.value;
     }
     else if ((Type)right.type == typeof(uint))
     {
         if (code == logictoken.equal)
             return (byte)left == (uint)right.value;
         else if (code == logictoken.less)
             return (byte)left < (uint)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (uint)right.value;
         else if (code == logictoken.more)
             return (byte)left > (uint)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (uint)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (uint)right.value;
     }
     else if ((Type)right.type == typeof(ushort))
     {
         if (code == logictoken.equal)
             return (byte)left == (ushort)right.value;
         else if (code == logictoken.less)
             return (byte)left < (ushort)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (ushort)right.value;
         else if (code == logictoken.more)
             return (byte)left > (ushort)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (ushort)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (ushort)right.value;
     }
     else if ((Type)right.type == typeof(char))
     {
         if (code == logictoken.equal)
             return (byte)left == (char)right.value;
         else if (code == logictoken.less)
             return (byte)left < (char)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (char)right.value;
         else if (code == logictoken.more)
             return (byte)left > (char)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (char)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (char)right.value;
     }
     else if ((Type)right.type == typeof(byte))
     {
         if (code == logictoken.equal)
             return (byte)left == (byte)right.value;
         else if (code == logictoken.less)
             return (byte)left < (byte)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (byte)right.value;
         else if (code == logictoken.more)
             return (byte)left > (byte)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (byte)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (byte)right.value;
     }
     else if ((Type)right.type == typeof(double))
     {
         if (code == logictoken.equal)
             return (byte)left == (double)right.value;
         else if (code == logictoken.less)
             return (byte)left < (double)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (double)right.value;
         else if (code == logictoken.more)
             return (byte)left > (double)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (double)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (double)right.value;
     }
     else if ((Type)right.type == typeof(float))
     {
         if (code == logictoken.equal)
             return (byte)left == (float)right.value;
         else if (code == logictoken.less)
             return (byte)left < (float)right.value;
         else if (code == logictoken.less_equal)
             return (byte)left <= (float)right.value;
         else if (code == logictoken.more)
             return (byte)left > (float)right.value;
         else if (code == logictoken.more_equal)
             return (byte)left >= (float)right.value;
         else if (code == logictoken.not_equal)
             return (byte)left != (float)right.value;
     }
     return base.MathLogic(env, code, left, right);
 }
示例#26
0
 public bool MathLogic(CLS_Environment env, logictoken code, object left, CLS_Content.Value right)
 {
     if (right.type == typeof(int))
     {
         if (code == logictoken.equal)
         {
             return((double)left == (int)right.value);
         }
         else if (code == logictoken.less)
         {
             return((double)left < (int)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((double)left <= (int)right.value);
         }
         else if (code == logictoken.more)
         {
             return((double)left > (int)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((double)left >= (int)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((double)left != (int)right.value);
         }
     }
     else if (right.type == typeof(uint))
     {
         if (code == logictoken.equal)
         {
             return((double)left == (uint)right.value);
         }
         else if (code == logictoken.less)
         {
             return((double)left < (uint)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((double)left <= (uint)right.value);
         }
         else if (code == logictoken.more)
         {
             return((double)left > (uint)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((double)left >= (uint)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((double)left != (uint)right.value);
         }
     }
     else if (right.type == typeof(double))
     {
         if (code == logictoken.equal)
         {
             return((double)left == (double)right.value);
         }
         else if (code == logictoken.less)
         {
             return((double)left < (double)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((double)left <= (double)right.value);
         }
         else if (code == logictoken.more)
         {
             return((double)left > (double)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((double)left >= (double)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((double)left != (double)right.value);
         }
     }
     else if (right.type == typeof(float))
     {
         if (code == logictoken.equal)
         {
             return((double)left == (float)right.value);
         }
         else if (code == logictoken.less)
         {
             return((double)left < (float)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((double)left <= (float)right.value);
         }
         else if (code == logictoken.more)
         {
             return((double)left > (float)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((double)left >= (float)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((double)left != (float)right.value);
         }
     }
     throw new NotImplementedException();
 }
 public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     throw new NotImplementedException("CSLE.SInstance.MathLogic");
 }
示例#28
0
 public bool MathLogic(CLS_Environment env, logictoken code, object left, CLS_Content.Value right)
 {
     if (right.type == typeof(int))
     {
         if (code == logictoken.equal)
             return (double)left == (int)right.value;
         else if (code == logictoken.less)
             return (double)left < (int)right.value;
         else if (code == logictoken.less_equal)
             return (double)left <= (int)right.value;
         else if (code == logictoken.more)
             return (double)left > (int)right.value;
         else if (code == logictoken.more_equal)
             return (double)left >= (int)right.value;
         else if (code == logictoken.not_equal)
             return (double)left != (int)right.value;
     }
     else if (right.type == typeof(uint))
     {
         if (code == logictoken.equal)
             return (double)left == (uint)right.value;
         else if (code == logictoken.less)
             return (double)left < (uint)right.value;
         else if (code == logictoken.less_equal)
             return (double)left <= (uint)right.value;
         else if (code == logictoken.more)
             return (double)left > (uint)right.value;
         else if (code == logictoken.more_equal)
             return (double)left >= (uint)right.value;
         else if (code == logictoken.not_equal)
             return (double)left != (uint)right.value;
     }
     else if (right.type == typeof(double))
     {
         if (code == logictoken.equal)
             return (double)left == (double)right.value;
         else if (code == logictoken.less)
             return (double)left < (double)right.value;
         else if (code == logictoken.less_equal)
             return (double)left <= (double)right.value;
         else if (code == logictoken.more)
             return (double)left > (double)right.value;
         else if (code == logictoken.more_equal)
             return (double)left >= (double)right.value;
         else if (code == logictoken.not_equal)
             return (double)left != (double)right.value;
     }
     else if (right.type == typeof(float))
     {
         if (code == logictoken.equal)
             return (double)left == (float)right.value;
         else if (code == logictoken.less)
             return (double)left < (float)right.value;
         else if (code == logictoken.less_equal)
             return (double)left <= (float)right.value;
         else if (code == logictoken.more)
             return (double)left > (float)right.value;
         else if (code == logictoken.more_equal)
             return (double)left >= (float)right.value;
         else if (code == logictoken.not_equal)
             return (double)left != (float)right.value;
     }
     throw new NotImplementedException();
 }
示例#29
0
        public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
        {
            if (code == logictoken.equal)
            {
                if (right.value is int)
                {
                    return (long)left == (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left == (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left == (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left == (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left == (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left == Convert.ToInt64(right.value);
                }
            }
            else if (code == logictoken.not_equal)
            {
                if (right.value is int)
                {
                    return (long)left != (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left != (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left != (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left != (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left != (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left != Convert.ToInt64(right.value);
                }
            }
            else if (code == logictoken.less)
            {
                if (right.value is int)
                {
                    return (long)left < (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left < (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left < (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left < (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left < (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left < Convert.ToInt64(right.value);
                }
            }
            else if (code == logictoken.less_equal)
            {
                if (right.value is int)
                {
                    return (long)left <= (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left <= (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left <= (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left <= (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left <= (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left <= Convert.ToInt64(right.value);
                }
            }
            else if (code == logictoken.more)
            {
                if (right.value is int)
                {
                    return (long)left > (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left > (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left > (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left > (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left > (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left > Convert.ToInt64(right.value);
                }
            }
            else if (code == logictoken.more_equal)
            {
                if (right.value is int)
                {
                    return (long)left >= (int)right.value;
                }
                else if (right.value is long)
                {
                    return (long)left >= (long)right.value;
                }
                else if (right.value is double)
                {
                    return (long)left >= (double)right.value;
                }
                else if (right.value is float)
                {
                    return (long)left >= (float)right.value;
                }
                else if (right.value is uint)
                {
                    return (long)left >= (uint)right.value;
                }
                else if (right.value is IConvertible)
                {
                    return (long)left >= Convert.ToInt64(right.value);
                }
            }

            return base.MathLogic(env, code, left, right);
        }
示例#30
0
 public override bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right)
 {
     if ((Type)right.type == typeof(int))
     {
         if (code == logictoken.equal)
         {
             return((float)left == (int)right.value);
         }
         else if (code == logictoken.less)
         {
             return((float)left < (int)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((float)left <= (int)right.value);
         }
         else if (code == logictoken.more)
         {
             return((float)left > (int)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((float)left >= (int)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((float)left != (int)right.value);
         }
     }
     else if ((Type)right.type == typeof(uint))
     {
         if (code == logictoken.equal)
         {
             return((float)left == (uint)right.value);
         }
         else if (code == logictoken.less)
         {
             return((float)left < (uint)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((float)left <= (uint)right.value);
         }
         else if (code == logictoken.more)
         {
             return((float)left > (uint)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((float)left >= (uint)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((float)left != (uint)right.value);
         }
     }
     else if ((Type)right.type == typeof(double))
     {
         if (code == logictoken.equal)
         {
             return((float)left == (double)right.value);
         }
         else if (code == logictoken.less)
         {
             return((float)left < (double)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((float)left <= (double)right.value);
         }
         else if (code == logictoken.more)
         {
             return((float)left > (double)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((float)left >= (double)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((float)left != (double)right.value);
         }
     }
     else if ((Type)right.type == typeof(float))
     {
         if (code == logictoken.equal)
         {
             return((float)left == (float)right.value);
         }
         else if (code == logictoken.less)
         {
             return((float)left < (float)right.value);
         }
         else if (code == logictoken.less_equal)
         {
             return((float)left <= (float)right.value);
         }
         else if (code == logictoken.more)
         {
             return((float)left > (float)right.value);
         }
         else if (code == logictoken.more_equal)
         {
             return((float)left >= (float)right.value);
         }
         else if (code == logictoken.not_equal)
         {
             return((float)left != (float)right.value);
         }
     }
     return(base.MathLogic(env, code, left, right));
 }