public CQ_Value ComputeValue(CQ_Content content) { #if CQUARK_DEBUG content.InStack(this); #endif CQ_Value parent = _expressions[0].ComputeValue(content); object obj = parent.GetObject(); if (parent == CQ_Value.Null) { throw new Exception("调用空对象的方法:" + _expressions[0].ToString() + ":" + ToString()); } CQ_Value key = _expressions[1].ComputeValue(content); CQ_Value value = _expressions[2].ComputeValue(content); //object setv=value.value; //if(value.type!=parent.type) //{ // var vtype = CQuark.AppDomain.GetType(value.type); // setv = vtype.ConvertTo(CQuark.AppDomain, setv, parent.type); //} //这几行是为了快速获取Unity的静态变量,而不需要反射 if (!Wrap.IndexSet(parent.m_type, obj, key, value)) { var type = CQuark.AppDomain.GetITypeByCQValue(parent); type._class.IndexSet(content, parent.GetObject(), obj, value.GetObject()); } CQ_Expression_GetValue f = _expressions[0] as CQ_Expression_GetValue; content.Set(f.value_name, parent); #if CQUARK_DEBUG content.OutStack(this); #endif return(CQ_Value.Null); }
public DeleLambda(CQ_Content content, IList <ICQ_Expression> param, ICQ_Expression func) { this.content = content.Clone(); this.expr_func = func; foreach (var p in param) { CQ_Expression_GetValue v1 = p as CQ_Expression_GetValue; CQ_Expression_Define v2 = p as CQ_Expression_Define; if (v1 != null) { paramTypes.Add(null); paramNames.Add(v1.value_name); } else if (v2 != null) { paramTypes.Add(v2.value_type); paramNames.Add(v2.value_name); } else { throw new Exception("DeleLambda 参数不正确"); } } }
public static ICQ_Expression Compiler_Expression_Math(IList <Token> tlist, 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._expressions.Add(v); // convert.targettype = CQuark.AppDomain.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 (CQuark.AppDomain.IsCoroutine(tlist[pos].text)) { // if(tlist[pos].text == "YieldWaitForSecond") return(Compiler_Expression_Coroutine(tlist, pos, posend)); } else { return(Compiler_Expression_Function(tlist, 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, 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, right, rightend, out valueright); if (succ2) { CQ_Expression_GetValue vg = valueright as CQ_Expression_GetValue; CQ_Expression_FunctionCQ vf = valueright as CQ_Expression_FunctionCQ; if (vg != null) { CQ_Expression_StaticValueGet value = new CQ_Expression_StaticValueGet(pos, rightend, tlist[pos].line, tlist[rightend].line); value.staticmembername = vg.value_name; value.type = CQuark.AppDomain.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 = CQuark.AppDomain.GetTypeByKeyword(tlist[pos].text); //value._expressions.Add(valueleft); value._expressions.AddRange(vf._expressions.ToArray()); return(value); } else if (valueright is CQ_Expression_SelfOp) { CQ_Expression_SelfOp vr = valueright as CQ_Expression_SelfOp; CQ_Expression_StaticValueOp value = new CQ_Expression_StaticValueOp(pos, rightend, tlist[pos].line, tlist[rightend].line); value.type = CQuark.AppDomain.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, 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._expressions.Add(v); convert.targettype = CQuark.AppDomain.GetTypeByKeyword(tlist[oppos + 1].text).typeBridge; return(convert); } ICQ_Expression valueleft; bool succ1 = Compiler_Expression(tlist, left, leftend, out valueleft); ICQ_Expression valueright; if (tkCur.text == "[") { rightend--; if (!Compiler_Expression(tlist, right, rightend, out valueright)) { LogError(tlist, "编译表达式失败", right, rightend); return(null); } CQ_Expression_IndexGet value = new CQ_Expression_IndexGet(left, rightend, tlist[left].line, tlist[rightend].line); value._expressions.Add(valueleft); value._expressions.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._expressions.Add(valueleft); convert.targettype = CQuark.AppDomain.GetTypeByKeyword(tlist[oppos + 1].text).typeBridge; 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._expressions.Add(valueleft); check.targettype = CQuark.AppDomain.GetTypeByKeyword(tlist[oppos + 1].text).typeBridge; return(check); } bool succ2 = Compiler_Expression(tlist, right, rightend, out valueright); if (succ1 && succ2 && valueright != null && valueleft != null) { if (tkCur.text == "=") { //member set CQ_Expression_MemberValueGet mfinde = valueleft as CQ_Expression_MemberValueGet; CQ_Expression_StaticValueGet sfinde = valueleft as CQ_Expression_StaticValueGet; CQ_Expression_IndexGet ifinde = valueleft as CQ_Expression_IndexGet; if (mfinde != null) { CQ_Expression_MemberValueSet value = new CQ_Expression_MemberValueSet(left, rightend, tlist[left].line, tlist[rightend].line); value.membername = mfinde.membername; value._expressions.Add(mfinde._expressions[0]); value._expressions.Add(valueright); return(value); } else if (sfinde != null) { CQ_Expression_StaticValueSet value = new CQ_Expression_StaticValueSet(left, rightend, tlist[left].line, tlist[rightend].line); value.staticmembername = sfinde.staticmembername; value.type = sfinde.type; //value._expressions.Add(mfinde._expressions[0]); value._expressions.Add(valueright); return(value); } else if (ifinde != null) { CQ_Expression_IndexSet value = new CQ_Expression_IndexSet(left, rightend, tlist[left].line, tlist[rightend].line); value._expressions.Add(ifinde._expressions[0]); value._expressions.Add(ifinde._expressions[1]); value._expressions.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_FunctionCQ vf = valueright as CQ_Expression_FunctionCQ; if (vg != null) { CQ_Expression_MemberValueGet value = new CQ_Expression_MemberValueGet(left, rightend, tlist[left].line, tlist[rightend].line); value._expressions.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._expressions.Add(valueleft); value._expressions.AddRange(vf._expressions.ToArray()); return(value); } else if (valueright is CQ_Expression_SelfOp) { CQ_Expression_SelfOp vr = valueright as CQ_Expression_SelfOp; CQ_Expression_MemberValueOp value = new CQ_Expression_MemberValueOp(left, rightend, tlist[left].line, tlist[rightend].line); value._expressions.Add(valueleft); value.membername = vr.value_name; value.mathop = vr.mathop; return(value); } throw new Exception("不可识别的表达式" + valueleft + "." + valueright); //value._expressions.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._expressions.Add(vf._expressions[0]); // value.membername = vf.membername; // value.mathop = tlist[oppos].text[0]; // value._expressions.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._expressions.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._expressions.Add(valueleft); value._expressions.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._expressions.Add(valueleft); value._expressions.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._expressions.Add(valueleft); value._expressions.Add(valueright); LogicToken token = LogicToken.not_equal; if (tkCur.text == ">") { token = LogicToken.greater; } else if (tkCur.text == ">=") { token = LogicToken.greater_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._expressions.Add(valueleft); CQ_Expression_Math2Value vvright = valueright as CQ_Expression_Math2Value; if (vvright.mathop != ':') { throw new Exception("三元表达式异常" + tkCur.ToString() + tkCur.SourcePos()); } value._expressions.Add(vvright._expressions[0]); value._expressions.Add(vvright._expressions[1]); return(value); } else { CQ_Expression_Math2Value value = new CQ_Expression_Math2Value(left, rightend, tlist[left].line, tlist[rightend].line); value._expressions.Add(valueleft); value._expressions.Add(valueright); value.mathop = mathop; return(value); } } } else { LogError(tlist, "编译表达式失败", right, rightend); } } return(null); }
public static ICQ_Expression Compiler_Expression_Value(Token value, int pos) { if (value.type == TokenType.VALUE) { if (value.text[value.text.Length - 1] == 'f') { CQ_Expression_Value_Value <float> number = new CQ_Expression_Value_Value <float>(); number.value_value = float.Parse(value.text.Substring(0, value.text.Length - 1)); return(number); } else if (value.text.Contains(".")) { CQ_Expression_Value_Value <double> number = new CQ_Expression_Value_Value <double>(); number.value_value = double.Parse(value.text); return(number); } else { if (value.text.Contains("'")) { CQ_Expression_Value_Value <char> number = new CQ_Expression_Value_Value <char>(); number.value_value = (char)value.text[1]; return(number); } else { ulong lv = ulong.Parse(value.text); if (lv > uint.MaxValue) { CQ_Expression_Value_Value <long> number = new CQ_Expression_Value_Value <long>(); number.value_value = (long)lv; return(number); } else { CQ_Expression_Value_Value <int> number = new CQ_Expression_Value_Value <int>(); number.value_value = (int)lv; return(number); } } } } else if (value.type == TokenType.STRING) { CQ_Expression_Value_Value <string> str = new CQ_Expression_Value_Value <string>(); str.value_value = value.text.Substring(1, value.text.Length - 2); return(str); } else if (value.type == TokenType.IDENTIFIER) { CQ_Expression_GetValue getvalue = new CQ_Expression_GetValue(pos, pos, value.line, value.line); getvalue.value_name = value.text; return(getvalue); } else if (value.type == TokenType.TYPE) { CQ_Expression_GetValue getvalue = new CQ_Expression_GetValue(pos, pos, value.line, value.line); int l = value.text.LastIndexOf('.'); if (l >= 0) { getvalue.value_name = value.text.Substring(l + 1); } else { getvalue.value_name = value.text; } return(getvalue); } else { DebugUtil.LogError("无法识别的简单表达式" + value); return(null); } }
public CQ_Value ComputeValue(CQ_Content content) { #if CQUARK_DEBUG content.InStack(this); #endif CQ_Value left = _expressions[0].ComputeValue(content); CQ_Value right = _expressions[1].ComputeValue(content); IType type = CQuark.AppDomain.GetITypeByCQValue(left); CQ_Value val = type.Math2Value(mathop, left, right); //val.SetValue(left.typeBridge, type.ConvertTo(val.GetValue(), left.typeBridge)); left.UsingValue(val); if (_expressions[0] is CQ_Expression_MemberValueGet) { CQ_Expression_MemberValueGet f = _expressions[0] as CQ_Expression_MemberValueGet; CQ_Value parent = f._expressions[0].ComputeValue(content); if (parent == CQ_Value.Null) { throw new Exception("调用空对象的方法:" + f._expressions[0].ToString() + ":" + ToString()); } //这几行是为了快速获取Unity的静态变量,而不需要反射 object obj = parent.GetObject(); if (!Wrap.MemberValueSet(parent.m_type, obj, f.membername, val)) { IType ptype = CQuark.AppDomain.GetITypeByCQValue(parent); ptype._class.MemberValueSet(content, obj, f.membername, val); } } else if (_expressions[0] is CQ_Expression_StaticValueGet) { CQ_Expression_StaticValueGet f = _expressions[0] as CQ_Expression_StaticValueGet; //这几行是为了快速获取Unity的静态变量,而不需要反射 if (!Wrap.StaticValueSet(type.typeBridge.type, f.staticmembername, val)) { f.type._class.StaticValueSet(content, f.staticmembername, val); } } else if (_expressions[0] is CQ_Expression_GetValue) { CQ_Expression_GetValue f = _expressions[0] as CQ_Expression_GetValue; content.Set(f.value_name, left); } else if (_expressions[0] is CQ_Expression_IndexGet) { CQ_Expression_IndexGet f = _expressions[0] as CQ_Expression_IndexGet; CQ_Value parent = f._expressions[0].ComputeValue(content); object obj = parent.GetObject(); CQ_Value key = f._expressions[1].ComputeValue(content); IType parenttype = CQuark.AppDomain.GetITypeByCQValue(parent); parenttype._class.IndexSet(content, obj, key.GetObject(), left.GetObject()); CQ_Expression_GetValue g = f._expressions[0] as CQ_Expression_GetValue; content.Set(g.value_name, parent); } #if CQUARK_DEBUG content.OutStack(this); #endif return(CQ_Value.Null); }