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); } }
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(); }
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(); }
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); }
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(); }
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(); }
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(); }
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(); }
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)); }
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)); }
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); }
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); }
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); } }
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(); }
public bool MathLogic(CLS_Content env, logictoken code, object left, CLS_Content.Value right) { throw new NotImplementedException(); }
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); }
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; }
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(); }
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); }
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"); }
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)); }
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); }
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 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) { 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); }
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)); }