public ICQ_Expression Compiler_Expression_DefineAndSet(IList <Token> tlist, ICQ_Environment content, int pos, int posend) { int expbegin = pos + 3; int bdep; int expend = FindCodeAny(tlist, ref expbegin, out bdep); if (expend != posend) { expend = posend; } ICQ_Expression v; bool succ = Compiler_Expression(tlist, content, expbegin, expend, out v); if (succ && v != null) { CQ_Expression_Define define = new CQ_Expression_Define(pos, posend, tlist[pos].line, tlist[posend].line); if (tlist[pos].text == "bool") { define.value_type = typeof(bool); } else { ICQ_Type type = content.GetTypeByKeyword(tlist[pos].text); define.value_type = type.type; } define.value_name = tlist[pos + 1].text; define.listParam.Add(v); return(define); } LogError(tlist, "不正确的定义表达式:", pos, posend); return(null); }
public void RegType(ICQ_Type type) { types[type.type] = type; string typename = type.keyword; //if (useNamespace) //{ // if (string.IsNullOrEmpty(type._namespace) == false) // { // typename = type._namespace + "." + type.keyword; // } //} if (string.IsNullOrEmpty(typename)) {//匿名自动注册 } else { typess[typename] = type; if (tokenParser.types.Contains(typename) == false) { tokenParser.types.Add(typename); } } }
public CQ_Content.Value ComputeValue(CQ_Content content) { content.InStack(this); var left = listParam[0].ComputeValue(content); var right = listParam[1].ComputeValue(content); ICQ_Type type = content.environment.GetType(left.type); //if (mathop == "+=") { CQType returntype; object value = type.Math2Value(content, mathop, left.value, right, out returntype); value = type.ConvertTo(content, value, left.type); left.value = value; // Type t = right.type; //if(t.IsSubclassOf(typeof(MulticastDelegate))||t.IsSubclassOf(typeof(Delegate))) //{ //} ////content.Set(value_name, value); //else if (t == typeof(CQuark.DeleLambda) || t == typeof(CQuark.DeleFunction) || t == typeof(CQuark.DeleEvent)) //{ //} //else { if (listParam[0] is CQ_Expression_MemberFind) { CQ_Expression_MemberFind f = listParam[0] as CQ_Expression_MemberFind; var parent = f.listParam[0].ComputeValue(content); if (parent == null) { throw new Exception("调用空对象的方法:" + f.listParam[0].ToString() + ":" + ToString()); } var ptype = content.environment.GetType(parent.type); ptype.function.MemberValueSet(content, parent.value, f.membername, value); } if (listParam[0] is CQ_Expression_StaticFind) { CQ_Expression_StaticFind f = listParam[0] as CQ_Expression_StaticFind; f.type.function.StaticValueSet(content, f.staticmembername, value); } } } //操作变量之 //做数学计算 //从上下文取值 //_value = null; content.OutStack(this); return(null); }
public ICQ_Type GetTypeByKeywordQuiet(string keyword) { ICQ_Type ret = null; if (typess.TryGetValue(keyword, out ret) == false) { return(null); } return(ret); }
public ICQ_Expression Compiler_Expression_DefineArray(IList <Token> tlist, ICQ_Environment content, int pos, int posend) { CQ_Expression_Define define = new CQ_Expression_Define(pos, posend, tlist[pos].line, tlist[posend].line); { ICQ_Type type = content.GetTypeByKeyword(tlist[pos].text + "[]"); define.value_type = type.type; } define.value_name = tlist[pos + 3].text; return(define); }
public CQ_Content.Value ComputeValue(CQ_Content content) { content.InStack(this); CQ_Content.Value r = listParam[0].ComputeValue(content); ICQ_Type type = content.environment.GetType(r.type); r.value = type.Math2Value(content, '*', r.value, CQ_Content.Value.OneMinus, out r.type); content.OutStack(this); return(r); }
ICQ_Expression OptimizeSingle(ICQ_Expression expr, CQ_Content content) { if (expr is CQ_Expression_Math2Value || expr is CQ_Expression_Math2ValueAndOr || expr is CQ_Expression_Math2ValueLogic) { if (expr.listParam[0] is ICQ_Value && expr.listParam[1] is ICQ_Value) { CQ_Content.Value result = expr.ComputeValue(content); if ((Type)result.type == typeof(bool)) { CQ_Value_Value <bool> value = new CQ_Value_Value <bool>(); value.value_value = (bool)result.value; value.tokenBegin = expr.listParam[0].tokenBegin; value.tokenEnd = expr.listParam[1].tokenEnd; value.lineBegin = expr.listParam[0].lineBegin; value.lineEnd = expr.listParam[1].lineEnd; return(value); } else { ICQ_Type v = content.environment.GetType(result.type); ICQ_Value value = v.MakeValue(result.value); value.tokenBegin = expr.listParam[0].tokenBegin; value.tokenEnd = expr.listParam[1].tokenEnd; value.lineBegin = expr.listParam[0].lineBegin; value.lineEnd = expr.listParam[1].lineEnd; return(value); } } } if (expr is CQ_Expression_Math3Value) { CQ_Content.Value result = expr.listParam[0].ComputeValue(content); if ((Type)result.type == typeof(bool)) { bool bv = (bool)result.value; if (bv) { return(expr.listParam[1]); } else { return(expr.listParam[2]); } } } return(expr); }
public ICQ_Expression Compiler_Expression_Define(IList <Token> tlist, ICQ_Environment content, int pos, int posend) { CQ_Expression_Define define = new CQ_Expression_Define(pos, posend, tlist[pos].line, tlist[posend].line); if (tlist[pos].text == "bool") { define.value_type = typeof(bool); } else { ICQ_Type type = content.GetTypeByKeyword(tlist[pos].text); define.value_type = type.type; } define.value_name = tlist[pos + 1].text; return(define); }
public ICQ_Type GetType(CQType type) { if (type == null) { return(typess["null"]); } ICQ_Type ret = null; if (types.TryGetValue(type, out ret) == false) { logger.Log_Warn("(CQcript)类型未注册,将自动注册一份匿名:" + type.ToString()); ret = RegHelper_Type.MakeType(type, ""); RegType(ret); } return(ret); }
public CQ_Content.Value ComputeValue(CQ_Content content) { content.InStack(this); var right = listParam[0].ComputeValue(content); ICQ_Type type = content.environment.GetType(right.type); CQ_Content.Value value = new CQ_Content.Value(); value.type = typeof(bool); value.value = type.ConvertTo(content, right.value, targettype) != null; //操作变量之 //做数学计算 //从上下文取值 //_value = null; content.OutStack(this); return(value); }
public CQ_Content.Value ComputeValue(CQ_Content content) { content.InStack(this); var v = content.Get(value_name); ICQ_Type type = content.environment.GetType(v.type); CQType returntype; object value = type.Math2Value(content, mathop, v.value, CQ_Content.Value.One, out returntype); value = type.ConvertTo(content, value, v.type); content.Set(value_name, value); //操作变量之 //做数学计算 //从上下文取值 //_value = null; content.OutStack(this); return(content.Get(value_name)); }
//public ICQ_Type_Dele GetDeleTypeBySign(string sign) //{ // if (deleTypes.ContainsKey(sign) == false) // { // return null; // //logger.Log_Error("(CQcript)类型未注册:" + sign); // } // return deleTypes[sign]; //} public ICQ_Type GetTypeByKeyword(string keyword) { ICQ_Type ret = null; if (string.IsNullOrEmpty(keyword)) { return(null); } if (typess.TryGetValue(keyword, out ret) == false) { if (keyword[keyword.Length - 1] == '>') { int iis = keyword.IndexOf('<'); string func = keyword.Substring(0, iis); List <string> _types = new List <string>(); int istart = iis + 1; int inow = istart; int dep = 0; while (inow < keyword.Length) { if (keyword[inow] == '<') { dep++; } if (keyword[inow] == '>') { dep--; if (dep < 0) { _types.Add(keyword.Substring(istart, inow - istart)); break; } } if (keyword[inow] == ',' && dep == 0) { _types.Add(keyword.Substring(istart, inow - istart)); istart = inow + 1; inow = istart; continue;; } inow++; } //var funk = keyword.Split(new char[] { '<', '>', ',' }, StringSplitOptions.RemoveEmptyEntries); if (typess.ContainsKey(func)) { Type gentype = GetTypeByKeyword(func).type; if (gentype.IsGenericTypeDefinition) { Type[] types = new Type[_types.Count]; for (int i = 0; i < types.Length; i++) { CQType t = GetTypeByKeyword(_types[i]).type; Type rt = t; if (rt == null && t != null) { rt = typeof(object); } types[i] = rt; } Type IType = gentype.MakeGenericType(types); RegType(CQuark.RegHelper_Type.MakeType(IType, keyword)); return(GetTypeByKeyword(keyword)); } } } logger.Log_Error("(CQcript)类型未注册:" + keyword); } return(ret); }
ICQ_Type Compiler_Class(ICQ_Environment env, string classname, bool bInterface, IList <string> basetype, string filename, IList <Token> tokens, int ibegin, int iend, bool EmbDebugToken, bool onlyGotType, IList <string> usinglist) { CQ_Type_Class stype = env.GetTypeByKeywordQuiet(classname) as CQ_Type_Class; if (stype == null) { stype = new CQ_Type_Class(classname, bInterface, filename); } if (basetype != null && basetype.Count != 0 && onlyGotType == false) { List <ICQ_Type> basetypess = new List <ICQ_Type>(); foreach (string t in basetype) { ICQ_Type type = env.GetTypeByKeyword(t); basetypess.Add(type); } stype.SetBaseType(basetypess); } if (onlyGotType) { return(stype); } //if (env.useNamespace && usinglist != null) //{//使用命名空间,替换token // List<Token> newTokens = new List<Token>(); // for (int i = ibegin; i <= iend; i++) // { // if (tokens[i].type == TokenType.IDENTIFIER) // { // string ntype = null; // string shortname = tokens[i].text; // int startpos = i; // while (ntype == null) // { // foreach (var u in usinglist) // { // string ttype = u + "." + shortname; // if (env.GetTypeByKeywordQuiet(ttype) != null) // { // ntype = ttype; // break; // } // } // if (ntype != null) break; // if ((startpos + 2) <= iend && tokens[startpos + 1].text == "." && tokens[startpos + 2].type == TokenType.IDENTIFIER) // { // shortname += "." + tokens[startpos + 2].text; // startpos += 2; // if (env.GetTypeByKeywordQuiet(shortname) != null) // { // ntype = shortname; // break; // } // continue; // } // else // { // break; // } // } // if (ntype != null) // { // var t = tokens[i]; // t.text = ntype; // t.type = TokenType.TYPE; // newTokens.Add(t); // i = startpos; // continue; // } // } // newTokens.Add(tokens[i]); // } // tokens = newTokens; // ibegin = 0; // iend = tokens.Count - 1; //} stype.compiled = false; (stype.function as SType).functions.Clear(); (stype.function as SType).members.Clear(); //搜寻成员定义和函数 //定义语法 //Type id[= expr]; //函数语法 //Type id([Type id,]){block}; //属性语法 //Type id{get{},set{}}; bool bPublic = false; bool bStatic = false; if (EmbDebugToken)//SType 嵌入Token { stype.EmbDebugToken(tokens); } for (int i = ibegin; i <= iend; i++) { if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "public") { bPublic = true; continue; } else if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "private") { bPublic = false; continue; } else if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "static") { bStatic = true; continue; } else if (tokens[i].type == TokenType.TYPE || (tokens[i].type == TokenType.IDENTIFIER && tokens[i].text == classname))//发现类型 { ICQ_Type idtype = env.GetTypeByKeyword("null"); bool bctor = false; if (tokens[i].type == TokenType.TYPE)//类型 { if (tokens[i].text == classname && tokens[i + 1].text == "(") {//构造函数 bctor = true; i--; } else if (tokens[i + 1].text == "[" && tokens[i + 2].text == "]") { idtype = env.GetTypeByKeyword(tokens[i].text + "[]"); i += 2; } else if (tokens[i].text == "void") { } else { idtype = env.GetTypeByKeyword(tokens[i].text); } } if (tokens[i + 1].type == CQuark.TokenType.IDENTIFIER || bctor) //类型后面是名称 { string idname = tokens[i + 1].text; if (tokens[i + 2].type == CQuark.TokenType.PUNCTUATION && tokens[i + 2].text == "(")//参数开始,这是函数 { logger.Log("发现函数:" + idname); SType.Function func = new SType.Function(); func.bStatic = bStatic; func.bPublic = bPublic; int funcparambegin = i + 2; int funcparamend = FindBlock(env, tokens, funcparambegin); if (funcparamend - funcparambegin > 1) { int start = funcparambegin + 1; //Dictionary<string, ICQ_Type> _params = new Dictionary<string, ICQ_Type>(); for (int j = funcparambegin + 1; j <= funcparamend; j++) { if (tokens[j].text == "," || tokens[j].text == ")") { string ptype = ""; for (int k = start; k <= j - 2; k++) { ptype += tokens[k].text; } var pid = tokens[j - 1].text; var type = env.GetTypeByKeyword(ptype); // _params[pid] = type; //func._params.Add(pid, type); if (type == null) { throw new Exception(filename + ":不可识别的函数头参数:" + tokens[funcparambegin].ToString() + tokens[funcparambegin].SourcePos()); } func._paramnames.Add(pid); func._paramtypes.Add(type); start = j + 1; } } } int funcbegin = funcparamend + 1; if (tokens[funcbegin].text == "{") { int funcend = FindBlock(env, tokens, funcbegin); this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out func.expr_runtime); if (func.expr_runtime == null) { logger.Log_Warn("警告,该函数编译为null,请检查"); } (stype.function as SType).functions.Add(idname, func); i = funcend; } else if (tokens[funcbegin].text == ";") { func.expr_runtime = null; (stype.function as SType).functions.Add(idname, func); i = funcbegin; } else { throw new Exception(filename + ":不可识别的函数表达式:" + tokens[funcbegin].ToString() + tokens[funcbegin].SourcePos()); } } else if (tokens[i + 2].type == CQuark.TokenType.PUNCTUATION && tokens[i + 2].text == "{")//语句块开始,这是 getset属性 { //get set 成员定义 bool setpublic = true; bool haveset = false; for (int j = i + 3; j <= iend; j++) { if (tokens[j].text == "get") { setpublic = true; } if (tokens[j].text == "private") { setpublic = false; } if (tokens[j].text == "set") { haveset = true; } if (tokens[j].text == "}") { break; } } var member = new SType.Member(); member.bStatic = bStatic; member.bPublic = bPublic; member.bReadOnly = !(haveset && setpublic); member.type = idtype; logger.Log("发现Get/Set:" + idname); //ICQ_Expression expr = null; if (tokens[i + 2].text == "=") { int jbegin = i + 3; int jdep; int jend = FindCodeAny(tokens, ref jbegin, out jdep); if (!Compiler_Expression(tokens, env, jbegin, jend, out member.expr_defvalue)) { logger.Log_Error("Get/Set定义错误"); } i = jend; } (stype.function as SType).members.Add(idname, member); } else if (tokens[i + 2].type == CQuark.TokenType.PUNCTUATION && (tokens[i + 2].text == "=" || tokens[i + 2].text == ";"))//这是成员定义 { logger.Log("发现成员定义:" + idname); var member = new SType.Member(); member.bStatic = bStatic; member.bPublic = bPublic; member.bReadOnly = false; member.type = idtype; //ICQ_Expression expr = null; if (tokens[i + 2].text == "=") { int posend = 0; for (int j = i; j < iend; j++) { if (tokens[j].text == ";") { posend = j - 1; break; } } int jbegin = i + 3; int jdep; int jend = FindCodeAny(tokens, ref jbegin, out jdep); if (jend < posend) { jend = posend; } if (!Compiler_Expression(tokens, env, jbegin, jend, out member.expr_defvalue)) { logger.Log_Error("成员定义错误"); } i = jend; } (stype.function as SType).members.Add(idname, member); } bPublic = false; bStatic = false; continue; } else { throw new Exception(filename + ":不可识别的表达式:" + tokens[i].ToString() + tokens[i].SourcePos()); } } } stype.compiled = true; return(stype); }
IList <ICQ_Type> _FileCompiler(string filename, IList <Token> tokens, bool embDeubgToken, ICQ_Environment env, bool onlyGotType) { List <ICQ_Type> typelist = new List <ICQ_Type>(); List <string> usingList = new List <string>(); //识别using //扫描token有没有要合并的类型 //using的实现在token级别处理即可 bool bJumpClass = false; for (int i = 0; i < tokens.Count; i++) { if (tokens[i].type == TokenType.PUNCTUATION && tokens[i].text == ";") { continue; } if (tokens[i].type == TokenType.COMMENT) { continue; } if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "using") { int dep; int pos = i; int iend = FindCodeAny(tokens, ref pos, out dep); List <string> list = Compiler_Using(tokens, env, pos, iend); string useText = ""; for (int j = 0; j < list.Count; j++) { useText += list[j]; if (j != list.Count - 1) { useText += "."; } } usingList.Add(useText); i = iend; continue; } if (tokens[i].type == TokenType.PUNCTUATION && tokens[i].text == "[") { if (tokens[i + 1].text == "NotScipt" || (tokens[i + 1].text == "CQuark" && tokens[i + 3].text == "NotScipt")) { bJumpClass = true; i = i + 2; continue; } } if (tokens[i].type == TokenType.KEYWORD && (tokens[i].text == "class" || tokens[i].text == "interface")) { string name = tokens[i + 1].text; //在这里检查继承 List <string> typebase = null; int ibegin = i + 2; if (onlyGotType) { while (tokens[ibegin].text != "{") { ibegin++; } } else { if (tokens[ibegin].text == ":") { typebase = new List <string>(); ibegin++; } while (tokens[ibegin].text != "{") { if (tokens[ibegin].type == TokenType.TYPE) { typebase.Add(tokens[ibegin].text); } ibegin++; } } int iend = FindBlock(env, tokens, ibegin); if (iend == -1) { env.logger.Log_Error("查找文件尾失败。"); return(null); } if (bJumpClass) { env.logger.Log("(NotScript)findclass:" + name + "(" + ibegin + "," + iend + ")"); } else if (onlyGotType) { env.logger.Log("(scriptPreParser)findclass:" + name + "(" + ibegin + "," + iend + ")"); } else { env.logger.Log("(scriptParser)findclass:" + name + "(" + ibegin + "," + iend + ")"); } if (bJumpClass) {//忽略这个Class //ICQ_Type type = Compiler_Class(env, name, (tokens[i].text == "interface"), filename, tokens, ibegin, iend, embDeubgToken, true); //bJumpClass = false; } else { ICQ_Type type = Compiler_Class(env, name, (tokens[i].text == "interface"), typebase, filename, tokens, ibegin, iend, embDeubgToken, onlyGotType, usingList); if (type != null) { typelist.Add(type); } } i = iend; continue; } } return(typelist); }