Exemplo n.º 1
0
        public Value GetQuiet(string name)
        {
            if (name == "this")
            {
                Value v = new Value();
                v.type  = CallType;
                v.value = CallThis;
                return(v);
            }

            Value retV  = null;
            bool  bFind = values.TryGetValue(name, out retV);

            if (bFind)//优先上下文变量
            {
                return(retV);
            }

            if (CallType != null)
            {
                SType.Member retM = null;
                bFind = CallType.members.TryGetValue(name, out retM);
                if (bFind)
                {
                    if (retM.bStatic)
                    {
                        return(CallType.staticMemberInstance[name]);
                    }
                    else
                    {
                        return(CallThis.member[name]);
                    }
                }
                if (CallType.functions.ContainsKey(name))
                {
                    Value v = new Value();
                    //如果直接得到代理实例,
                    DeleFunction dele = new DeleFunction(CallType, this.CallThis, name);


                    //DeleScript dele =new DeleScript();
                    //dele.function = name;
                    //dele.calltype = CallType;
                    //dele.callthis = CallThis;
                    v.value = dele;
                    v.type  = typeof(DeleFunction);
                    return(v);
                }
            }
            return(null);
        }
Exemplo n.º 2
0
        public void Set(string name, object value)
        {
            Value retV  = null;
            bool  bFind = values.TryGetValue(name, out retV);

            if (!bFind)
            {
                if (CallType != null)
                {
                    SType.Member retM = null;
                    bool         bRet = CallType.members.TryGetValue(name, out retM);
                    if (bRet)
                    {
                        if (retM.bStatic)
                        {
                            CallType.staticMemberInstance[name].value = value;
                        }
                        else
                        {
                            CallThis.member[name].value = value;
                        }
                        return;
                    }
                }
                string err = CallType.Name + "\n";
                foreach (var m in CallType.members)
                {
                    err += m.Key + ",";
                }
                throw new Exception("值没有定义过" + name + "," + err);
            }
            if ((Type)retV.type == typeof(CLS_Type_Var.var) && value != null)
            {
                retV.type = value.GetType();
            }
            retV.value = value;
        }
Exemplo n.º 3
0
        ICLS_Type Compiler_Class(ICLS_Environment env, string classname, IList <string> baseTypeNames, string filename, IList <Token> tokens, int ibegin, int iend, bool EmbDebugToken, bool onlyGotType = false, IList <string> usinglist = null)
        {
            CLS_Type_Class sClass = env.GetTypeByKeywordQuiet(classname) as CLS_Type_Class;

            if (sClass == null)
            {
                sClass = new CLS_Type_Class(classname, filename);
            }

            sClass.compiled = false;
            (sClass.function as SType).functions.Clear();
            (sClass.function as SType).members.Clear();

            if (onlyGotType)
            {
                return(sClass);
            }

            // 调试Token
            if (EmbDebugToken)
            {
                (sClass.function as SType).EmbDebugToken(tokens);
            }

            bool bStatic   = false;
            int  sortIndex = 0;

            for (int i = ibegin; i <= iend; i++)
            {
                if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "static")
                {
                    bStatic = true;
                    continue;
                }

                if (tokens[i].type == TokenType.ProtoIndex)
                {
                    sortIndex = int.Parse(tokens[i].text);
                    continue;
                }

                if (tokens[i].type == TokenType.TYPE || (tokens[i].type == TokenType.IDENTIFIER && tokens[i].text == classname))//发现类型
                {
                    ICLS_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 == CSLE.TokenType.IDENTIFIER || bctor) //类型后面是名称
                    {
                        string idname = tokens[i + 1].text;
                        if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && tokens[i + 2].text == "(")//参数开始,这是函数
                        {
                            logger.Log("发现函数:" + idname);
                            SType.Function func = new SType.Function();
                            func.bStatic = bStatic;

                            int funcparambegin = i + 2;
                            int funcparamend   = FindBlock(env, tokens, funcparambegin);
                            if (funcparamend - funcparambegin > 1)
                            {
                                int start = funcparambegin + 1;
                                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);

                                        if (type == null)
                                        {
                                            throw new Exception(filename + ":不可识别的函数头参数:" + tokens[funcparambegin].ToString());
                                        }

                                        func._paramnames.Add(pid);
                                        func._paramtypes.Add(type);
                                        start = j + 1;
                                    }
                                }
                            }

                            int funcbegin = funcparamend + 1;
                            if (tokens[funcbegin].text == "{")
                            {
                                bool coroutine = tokens[i].text == "IEnumerator";

                                int funcend = FindBlock(env, tokens, funcbegin);
                                this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out func.expr_runtime);

                                // Unity协程判断
                                if (coroutine)
                                {
                                    int yieldCount = 0;
                                    if (func.expr_runtime is CLS_Expression_Yield)
                                    {
                                        yieldCount++;
                                    }
                                    else
                                    {
                                        foreach (var v1 in func.expr_runtime.listParam)
                                        {
                                            if (v1 is CLS_Expression_Yield)
                                            {
                                                yieldCount++;
                                            }
                                            else if (v1 is CLS_Expression_LoopIf)
                                            {
                                                if (v1.listParam[1] is CLS_Expression_Yield)
                                                {
                                                    yieldCount++;
                                                }
                                                else if (v1.listParam[1] is CLS_Expression_Block)
                                                {
                                                    if (v1.listParam[1].listParam[v1.listParam[1].listParam.Count - 1] is CLS_Expression_Yield)
                                                    {
                                                        yieldCount++;
                                                    }
                                                }
                                            }
                                            else if (v1 is CLS_Expression_LoopFor)
                                            {
                                                if (v1.listParam[3] is CLS_Expression_Yield)
                                                {
                                                    yieldCount++;
                                                }
                                                else if (v1.listParam[3] is CLS_Expression_Block)
                                                {
                                                    foreach (var v2 in v1.listParam[3].listParam)
                                                    {
                                                        if (v2 is CLS_Expression_Yield)
                                                        {
                                                            yieldCount++;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    // 暂不支持复杂嵌套的yield表达式
                                    if (yieldCount != m_tempYieldCount)
                                    {
                                        throw new Exception(filename + "暂不支持复杂嵌套的yield表达式: " + tokens[funcbegin].ToString());
                                    }
                                    var expr = func.expr_runtime;
                                    func.expr_runtime = new CLS_Expression_Coroutine(expr.listParam, expr.tokenBegin, expr.tokenEnd, expr.lineBegin, expr.lineEnd);
                                }
                                m_tempYieldCount = 0;

                                // 判断是否是派生类的构造函数
                                if (baseTypeNames != null && baseTypeNames.Count > 0 && bctor)
                                {
                                    CLS_Expression_Function baseFun = new CLS_Expression_Function(funcbegin, funcend, tokens[funcbegin].line, tokens[funcbegin].line);
                                    baseFun.funcname = classname + "->base";

                                    func.addBaseFun(baseFun, funcbegin, funcend, tokens[funcbegin].line, tokens[funcend].line);
                                }

                                (sClass.function as SType).addFun(idname, func);

                                i = funcend;
                            }
                            else if (tokens[funcbegin].text == ";")
                            {
                                func.expr_runtime = null;

                                (sClass.function as SType).addFun(idname, func);

                                i = funcbegin;
                            }
                            else if (tokens[funcbegin].text == ":")
                            {
                                // 添加 :base()的构造函数 支持
                                int funcbegin2 = funcbegin;

                                for (; funcbegin2 < iend; funcbegin2++)
                                {
                                    if (tokens[funcbegin2].text == "{")
                                    {
                                        CLS_Expression_Function baseFun = (CLS_Expression_Function)this.Compiler_Expression_Function(tokens, env, funcbegin + 1, funcbegin2 - 1);
                                        baseFun.funcname = classname + "->base";

                                        int funcend2 = FindBlock(env, tokens, funcbegin2);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin2, funcend2, out func.expr_runtime);

                                        func.addBaseFun(baseFun, funcbegin, funcend2, tokens[funcbegin].line, tokens[funcend2].line);

                                        (sClass.function as SType).addFun(idname, func);

                                        i = funcend2;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                throw new Exception(filename + "不可识别的函数表达式" + tokens[funcbegin].ToString());
                            }
                        }
                        else if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && tokens[i + 2].text == "{")//语句块开始,这是 getset属性
                        {
                            logger.Log("发现Get/Set:" + idname);

                            SType.Member member = new SType.Member();
                            member.bStatic   = bStatic;
                            member.sortIndex = sortIndex;
                            member.type      = idtype;

                            i += 3;
                            for (int count = 2; count > 0; count--)
                            {
                                if (tokens[i].text == "get")
                                {
                                    // get 函数定义
                                    if (tokens[i + 1].text == "{")
                                    {
                                        member.getFun = "get_" + idname;

                                        SType.Function getFunc = new SType.Function();
                                        getFunc.bStatic = bStatic;

                                        int funcbegin = i + 1;
                                        int funcend   = FindBlock(env, tokens, funcbegin);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out getFunc.expr_runtime);

                                        (sClass.function as SType).addFun(member.getFun, getFunc);

                                        i = funcend + 1;
                                    }
                                    else
                                    {
                                        i += 2; // get; 模式
                                    }
                                }
                                else if (tokens[i].text == "set")
                                {
                                    // set 函数定义
                                    if (tokens[i + 1].text == "{")
                                    {
                                        member.setFun = "set_" + idname;

                                        SType.Function setFunc = new SType.Function();
                                        setFunc.bStatic = bStatic;
                                        setFunc._paramnames.Add("value");
                                        setFunc._paramtypes.Add(member.type);

                                        int funcbegin = i + 1;
                                        int funcend   = FindBlock(env, tokens, funcbegin);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out setFunc.expr_runtime);

                                        (sClass.function as SType).addFun(member.setFun, setFunc);

                                        i = funcend + 1;
                                    }
                                    else
                                    {
                                        i += 2; // set; 模式
                                    }
                                }
                                else if (tokens[i].text == "}")
                                {
                                    // get/set块结束
                                    break;
                                }
                                else
                                {
                                    throw new Exception(filename + "不可识别的Get/Set" + tokens[i].ToString());
                                }
                            }

                            (sClass.function as SType).addMember(idname, member);
                        }
                        else if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && (tokens[i + 2].text == "=" || tokens[i + 2].text == ";"))//这是成员定义
                        {
                            logger.Log("发现成员定义:" + idname);

                            SType.Member member = new SType.Member();
                            member.bStatic   = bStatic;
                            member.sortIndex = sortIndex;
                            member.type      = idtype;

                            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("Get/Set定义错误");
                                }

                                i = jend;
                            }

                            (sClass.function as SType).addMember(idname, member);
                        }

                        bStatic   = false;
                        sortIndex = 0;
                        continue;
                    }
                    else
                    {
                        throw new Exception(filename + "不可识别的表达式" + tokens[i].ToString());
                    }
                }
            }
            sClass.compiled = true;

            // 关联基类(目前只支持单继承)
            if (baseTypeNames != null && baseTypeNames.Count > 0)
            {
                SType sBaseType = env.GetTypeByKeywordQuiet(baseTypeNames[0]).function as SType;
                SType sType     = sClass.function as SType;
                sType.BaseType = sBaseType;

                bool hasBaseFun = false;

                foreach (KeyValuePair <string, SType.Function> pair in sBaseType.functions)
                {
                    if (!sType.functions.ContainsKey(pair.Key))
                    {
                        if (sBaseType.Name.Equals(pair.Key))
                        {
                            hasBaseFun = true;
                            sType.functions.Add(sType.Name + "->base", pair.Value);
                        }
                        else
                        {
                            if (pair.Value.ownerType == null)
                            {
                                pair.Value.ownerType = sBaseType;
                            }
                            sType.functions.Add(pair.Key, pair.Value);
                        }
                    }
                }

                foreach (KeyValuePair <string, SType.Member> pair in sBaseType.members)
                {
                    if (!sType.members.ContainsKey(pair.Key))
                    {
                        sType.members.Add(pair.Key, pair.Value);
                    }
                }

                foreach (KeyValuePair <string, SType.Member> pair in sBaseType.propertys)
                {
                    if (!sType.propertys.ContainsKey(pair.Key))
                    {
                        sType.propertys.Add(pair.Key, pair.Value);
                    }
                }

                // 自动创建可以调用基类函数的构造函数
                if (!sType.functions.ContainsKey(sType.Name) && hasBaseFun)
                {
                    // 处理 自身没构造函数 -- 基类有构造函数  的情况
                    SType.Function func = new SType.Function();
                    func.bStatic = false;

                    CLS_Expression_Function baseFun = new CLS_Expression_Function(0, 0, 0, 0);
                    baseFun.funcname = sType.Name + "->base";
                    func.addBaseFun(baseFun, 0, 0, 0, 0);
                    sType.functions.Add(sType.Name, func);
                }
                else if (sType.functions.ContainsKey(sType.Name) && !hasBaseFun)
                {
                    // 处理 自身有构造函数 -- 基类没有构造函数  的情况
                    SType.Function func = new SType.Function();
                    func.bStatic = false;
                    sType.functions.Add(sType.Name + "->base", func);
                }
            }

            return(sClass);
        }
Exemplo n.º 4
0
        ICLS_Type Compiler_Class(ICLS_Environment env, string classname, bool bInterface, IList <string> basetype, string filename, IList <Token> tokens, int ibegin, int iend, bool EmbDebugToken, bool onlyGotType = false, IList <string> usinglist = null)
        {
            CLS_Type_Class stype = env.GetTypeByKeywordQuiet(classname) as CLS_Type_Class;

            if (stype == null)
            {
                stype = new CLS_Type_Class(classname, bInterface, filename);
            }

            if (basetype != null && basetype.Count != 0 && onlyGotType == false)
            {
                List <ICLS_Type> basetypess = new List <ICLS_Type>();
                foreach (var t in basetype)
                {
                    ICLS_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))//发现类型
                {
                    ICLS_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 == CSLE.TokenType.IDENTIFIER || bctor) //类型后面是名称
                    {
                        string idname = tokens[i + 1].text;
                        if (tokens[i + 2].type == CSLE.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, ICLS_Type> _params = new Dictionary<string, ICLS_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);
                                        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("不可识别的函数表达式");
                            }
                        }
                        else if (tokens[i + 2].type == CSLE.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);
                            //ICLS_Expression expr = null;

                            if (tokens[i + 2].text == "=")
                            {
                                int jbegin = i + 3;
                                int jdep;
                                int jend = FindCodeAny(tokens, ref jbegin, out jdep);

                                bool b = Compiler_Expression(tokens, env, jbegin, jend, out member.expr_defvalue);
                                i = jend;
                            }
                            (stype.function as SType).members.Add(idname, member);
                        }
                        else if (tokens[i + 2].type == CSLE.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;

                            //ICLS_Expression expr = null;

                            if (tokens[i + 2].text == "=")
                            {
                                int jbegin = i + 3;
                                int jdep;
                                int jend = FindCodeAny(tokens, ref jbegin, out jdep);

                                bool b = Compiler_Expression(tokens, env, jbegin, jend, out member.expr_defvalue);
                                i = jend;
                            }
                            (stype.function as SType).members.Add(idname, member);
                        }

                        bPublic = false;
                        bStatic = false;

                        continue;
                    }
                    else
                    {
                        throw new Exception("不可识别的表达式");
                    }
                }
            }
            stype.compiled = true;
            return(stype);
        }
Exemplo n.º 5
0
        ICLS_Type Compiler_Class(ICLS_Environment env, string classname, IList<string> baseTypeNames, string filename, IList<Token> tokens, int ibegin, int iend, bool EmbDebugToken, bool onlyGotType = false, IList<string> usinglist = null)
        {
            CLS_Type_Class sClass = env.GetTypeByKeywordQuiet(classname) as CLS_Type_Class;

            if (sClass == null)
                sClass = new CLS_Type_Class(classname, filename);

            sClass.compiled = false;
            (sClass.function as SType).functions.Clear();
            (sClass.function as SType).members.Clear();

            if (onlyGotType)
                return sClass;

            // 调试Token
            if (EmbDebugToken)
                (sClass.function as SType).EmbDebugToken(tokens);

            bool bStatic = false;
            int sortIndex = 0;

            for (int i = ibegin; i <= iend; i++)
            {
                if (tokens[i].type == TokenType.KEYWORD && tokens[i].text == "static")
                {
                    bStatic = true;
                    continue;
                }

                if (tokens[i].type == TokenType.ProtoIndex)
                {
                    sortIndex = int.Parse(tokens[i].text);
                    continue;
                }

                if (tokens[i].type == TokenType.TYPE || (tokens[i].type == TokenType.IDENTIFIER && tokens[i].text == classname))//发现类型
                {
                    ICLS_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 == CSLE.TokenType.IDENTIFIER || bctor) //类型后面是名称
                    {
                        string idname = tokens[i + 1].text;
                        if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && tokens[i + 2].text == "(")//参数开始,这是函数
                        {
                            logger.Log("发现函数:" + idname);
                            SType.Function func = new SType.Function();
                            func.bStatic = bStatic;

                            int funcparambegin = i + 2;
                            int funcparamend = FindBlock(env, tokens, funcparambegin);
                            if (funcparamend - funcparambegin > 1)
                            {
                                int start = funcparambegin + 1;
                                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);

                                        if (type == null)
                                        {
                                            throw new Exception(filename + ":不可识别的函数头参数:" + tokens[funcparambegin].ToString());
                                        }

                                        func._paramnames.Add(pid);
                                        func._paramtypes.Add(type);
                                        start = j + 1;
                                    }
                                }
                            }

                            int funcbegin = funcparamend + 1;
                            if (tokens[funcbegin].text == "{")
                            {
                                bool coroutine = tokens[i].text == "IEnumerator";

                                int funcend = FindBlock(env, tokens, funcbegin);
                                this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out func.expr_runtime);

                                // Unity协程判断
                                if (coroutine)
                                {
                                    int yieldCount = 0;
                                    if (func.expr_runtime is CLS_Expression_Yield)
                                    {
                                        yieldCount++;
                                    }
                                    else
                                    {
                                        foreach (var v1 in func.expr_runtime.listParam)
                                        {
                                            if (v1 is CLS_Expression_Yield)
                                            {
                                                yieldCount++;
                                            }
                                            else if (v1 is CLS_Expression_LoopIf)
                                            {
                                                if (v1.listParam[1] is CLS_Expression_Yield)
                                                {
                                                    yieldCount++;
                                                }
                                                else if (v1.listParam[1] is CLS_Expression_Block)
                                                {
                                                    if (v1.listParam[1].listParam[v1.listParam[1].listParam.Count - 1] is CLS_Expression_Yield)
                                                    {
                                                        yieldCount++;
                                                    }
                                                }
                                            }
                                            else if (v1 is CLS_Expression_LoopFor)
                                            {
                                                if (v1.listParam[3] is CLS_Expression_Yield)
                                                {
                                                    yieldCount++;
                                                }
                                                else if (v1.listParam[3] is CLS_Expression_Block)
                                                {
                                                    foreach (var v2 in v1.listParam[3].listParam)
                                                    {
                                                        if (v2 is CLS_Expression_Yield)
                                                        {
                                                            yieldCount++;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    // 暂不支持复杂嵌套的yield表达式
                                    if (yieldCount != m_tempYieldCount)
                                    {
                                        throw new Exception(filename + "暂不支持复杂嵌套的yield表达式: " + tokens[funcbegin].ToString());
                                    }
                                    var expr = func.expr_runtime;
                                    func.expr_runtime = new CLS_Expression_Coroutine(expr.listParam, expr.tokenBegin, expr.tokenEnd, expr.lineBegin, expr.lineEnd);
                                }
                                m_tempYieldCount = 0;

                                // 判断是否是派生类的构造函数
                                if (baseTypeNames != null && baseTypeNames.Count > 0 && bctor)
                                {
                                    CLS_Expression_Function baseFun = new CLS_Expression_Function(funcbegin, funcend, tokens[funcbegin].line, tokens[funcbegin].line);
                                    baseFun.funcname = classname + "->base";

                                    func.addBaseFun(baseFun, funcbegin, funcend, tokens[funcbegin].line, tokens[funcend].line);
                                }

                                (sClass.function as SType).addFun(idname, func);

                                i = funcend;
                            }
                            else if (tokens[funcbegin].text == ";")
                            {
                                func.expr_runtime = null;

                                (sClass.function as SType).addFun(idname, func);

                                i = funcbegin;
                            }
                            else if (tokens[funcbegin].text == ":")
                            {
                                // 添加 :base()的构造函数 支持
                                int funcbegin2 = funcbegin;

                                for (; funcbegin2 < iend; funcbegin2++)
                                {
                                    if (tokens[funcbegin2].text == "{")
                                    {
                                        CLS_Expression_Function baseFun = (CLS_Expression_Function)this.Compiler_Expression_Function(tokens, env, funcbegin + 1, funcbegin2 - 1);
                                        baseFun.funcname = classname + "->base";

                                        int funcend2 = FindBlock(env, tokens, funcbegin2);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin2, funcend2, out func.expr_runtime);

                                        func.addBaseFun(baseFun, funcbegin, funcend2, tokens[funcbegin].line, tokens[funcend2].line);

                                        (sClass.function as SType).addFun(idname, func);

                                        i = funcend2;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                throw new Exception(filename + "不可识别的函数表达式" + tokens[funcbegin].ToString());
                            }
                        }
                        else if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && tokens[i + 2].text == "{")//语句块开始,这是 getset属性
                        {
                            logger.Log("发现Get/Set:" + idname);

                            SType.Member member = new SType.Member();
                            member.bStatic = bStatic;
                            member.sortIndex = sortIndex;
                            member.type = idtype;

                            i += 3;
                            for (int count = 2; count > 0; count--)
                            {
                                if (tokens[i].text == "get")
                                {
                                    // get 函数定义
                                    if (tokens[i + 1].text == "{")
                                    {
                                        member.getFun = "get_" + idname;

                                        SType.Function getFunc = new SType.Function();
                                        getFunc.bStatic = bStatic;

                                        int funcbegin = i + 1;
                                        int funcend = FindBlock(env, tokens, funcbegin);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out getFunc.expr_runtime);

                                        (sClass.function as SType).addFun(member.getFun, getFunc);

                                        i = funcend + 1;
                                    }
                                    else
                                    {
                                        i += 2; // get; 模式
                                    }
                                }
                                else if (tokens[i].text == "set")
                                {
                                    // set 函数定义
                                    if (tokens[i + 1].text == "{")
                                    {
                                        member.setFun = "set_" + idname;

                                        SType.Function setFunc = new SType.Function();
                                        setFunc.bStatic = bStatic;
                                        setFunc._paramnames.Add("value");
                                        setFunc._paramtypes.Add(member.type);

                                        int funcbegin = i + 1;
                                        int funcend = FindBlock(env, tokens, funcbegin);
                                        this.Compiler_Expression_Block(tokens, env, funcbegin, funcend, out setFunc.expr_runtime);

                                        (sClass.function as SType).addFun(member.setFun, setFunc);

                                        i = funcend + 1;
                                    }
                                    else
                                    {
                                        i += 2; // set; 模式
                                    }
                                }
                                else if (tokens[i].text == "}")
                                {
                                    // get/set块结束
                                    break;
                                }
                                else
                                {
                                    throw new Exception(filename + "不可识别的Get/Set" + tokens[i].ToString());
                                }
                            }

                            (sClass.function as SType).addMember(idname, member);
                        }
                        else if (tokens[i + 2].type == CSLE.TokenType.PUNCTUATION && (tokens[i + 2].text == "=" || tokens[i + 2].text == ";"))//这是成员定义
                        {
                            logger.Log("发现成员定义:" + idname);

                            SType.Member member = new SType.Member();
                            member.bStatic = bStatic;
                            member.sortIndex = sortIndex;
                            member.type = idtype;

                            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("Get/Set定义错误");
                                }

                                i = jend;
                            }

                            (sClass.function as SType).addMember(idname, member);
                        }

                        bStatic = false;
                        sortIndex = 0;
                        continue;
                    }
                    else
                    {
                        throw new Exception(filename + "不可识别的表达式" + tokens[i].ToString());
                    }
                }
            }
            sClass.compiled = true;

            // 关联基类(目前只支持单继承)
            if (baseTypeNames != null && baseTypeNames.Count > 0)
            {
                SType sBaseType = env.GetTypeByKeywordQuiet(baseTypeNames[0]).function as SType;
                SType sType = sClass.function as SType;
                sType.BaseType = sBaseType;

                bool hasBaseFun = false;

                foreach (KeyValuePair<string, SType.Function> pair in sBaseType.functions)
                {
                    if (!sType.functions.ContainsKey(pair.Key))
                    {
                        if (sBaseType.Name.Equals(pair.Key))
                        {
                            hasBaseFun = true;
                            sType.functions.Add(sType.Name + "->base", pair.Value);
                        }
                        else
                        {
                            if (pair.Value.ownerType == null)
                                pair.Value.ownerType = sBaseType;
                            sType.functions.Add(pair.Key, pair.Value);
                        }
                    }
                }

                foreach (KeyValuePair<string, SType.Member> pair in sBaseType.members)
                {
                    if (!sType.members.ContainsKey(pair.Key))
                        sType.members.Add(pair.Key, pair.Value);
                }

                foreach (KeyValuePair<string, SType.Member> pair in sBaseType.propertys)
                {
                    if (!sType.propertys.ContainsKey(pair.Key))
                        sType.propertys.Add(pair.Key, pair.Value);
                }

                // 自动创建可以调用基类函数的构造函数
                if (!sType.functions.ContainsKey(sType.Name) && hasBaseFun)
                {
                    // 处理 自身没构造函数 -- 基类有构造函数  的情况
                    SType.Function func = new SType.Function();
                    func.bStatic = false;

                    CLS_Expression_Function baseFun = new CLS_Expression_Function(0, 0, 0, 0);
                    baseFun.funcname = sType.Name + "->base";
                    func.addBaseFun(baseFun, 0, 0, 0, 0);
                    sType.functions.Add(sType.Name, func);
                }
                else if (sType.functions.ContainsKey(sType.Name) && !hasBaseFun)
                {
                    // 处理 自身有构造函数 -- 基类没有构造函数  的情况
                    SType.Function func = new SType.Function();
                    func.bStatic = false;
                    sType.functions.Add(sType.Name + "->base", func);
                }
            }

            return sClass;
        }
Exemplo n.º 6
0
        ICLS_Type Compiler_Class(ICLS_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)
        {

            CLS_Type_Class stype = env.GetTypeByKeywordQuiet(classname) as CLS_Type_Class;

            if (stype == null)
                stype = new CLS_Type_Class(classname, bInterface, filename);

            if (basetype != null && basetype.Count != 0 && onlyGotType == false)
            {
                List<ICLS_Type> basetypess = new List<ICLS_Type>();
                foreach (string t in basetype)
                {
                    ICLS_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))//发现类型
                {

                    ICLS_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 == CSLE.TokenType.IDENTIFIER || bctor) //类型后面是名称
                    {
                        string idname = tokens[i + 1].text;
                        if (tokens[i + 2].type == CSLE.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, ICLS_Type> _params = new Dictionary<string, ICLS_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 == CSLE.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);
                            //ICLS_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 == CSLE.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;


                            //ICLS_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;
        }