Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        public ICQ_Type GetTypeByKeywordQuiet(string keyword)
        {
            ICQ_Type ret = null;

            if (typess.TryGetValue(keyword, out ret) == false)
            {
                return(null);
            }
            return(ret);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 7
0
 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);
 }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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));
        }
Esempio n. 12
0
        //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);
        }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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);
        }