예제 #1
0
        private void ProcessAType(ref TypeInfo ti, ref string sModifier, string[] list, bool bIsValueType)
        {
            string word = NextTokenText(list);
            ti = new TypeInfo();
            ti.Name = ti.Code = word;
            word = NextTokenText(list);
            string wordNext = GetTokenText(list, tokenCurrent);


            if (word == ";")
            {
                ti.IsClass = false;
                return;
            }
            ti.IsClass = true;

            ObjectInfo obj = null, objTemp = new ObjectInfo(), paramObj = new ObjectInfo();
            MethordInfo mi = null;
            List<ObjectInfo> paramList = new List<ObjectInfo>();
            AttributeInfo attr = null;
            bool isTypeBody = false, isMethord = false, isOperator = false;
            Stack<int> stack = new Stack<int>();
            stack.Push(0);
            while (stack.Count > 0)
            {
                switch(word)
                {
                    case "operator":
                        ReadMethordBody(list, word);
                        objTemp.Clear();
                        break;
                    case "virtual":
                    case "afx_msg":
                        mi = new MethordInfo();
                        mi.Virtual = word;
                        break;
                    case "private":
                    case "protected":
                    case "public":
                        sModifier = word;
                        break;
                    case ":":
                        if (isTypeBody)
                        {
                            
                        }
                        else
                        {
                            word = NextTokenText(list);
                            ////obj = new ObjectInfo();
                            ////switch (word)
                            ////{
                            ////    case "private":
                            ////    case "protected":
                            ////    case "public":
                            ////        obj.Modifier = word;
                            ////        word = NextTokenText(list);
                            ////        break;
                            ////    default:
                            ////        break;
                            ////}
                            ////obj.Code = word;
                            ////obj.Name = word;
                            ////ti.Parents.Add(obj);
                        }
                        break;
                    case "(":
                        if (mi == null)  mi = new MethordInfo();
                        isMethord = true;
                        paramList.Clear();
                        paramObj.Clear();
                        break;
                    case ")":
                        break;
                    case "}":
                        stack.Pop();
                        break;
                    case "{":
                        if (isTypeBody)
                        {
                            // 这里应该是方法

                            // 方法或属性定义结束
                            if (isMethord)
                            {
                                if (mi != null)
                                {
                                    mi.Store(objTemp);
                                    if (!string.IsNullOrEmpty(paramObj.Code))
                                    {
                                        ObjectInfo param = new ObjectInfo();
                                        param.Store(paramObj);
                                        paramList.Add(param);

                                        if (mi.Parameters == null) mi.Parameters = new List<ObjectInfo>();
                                        mi.Parameters.AddRange(paramList);
                                    }
                                    ti.Methords.Add(mi);
                                }
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(objTemp.Code))
                                {
                                    attr = new AttributeInfo();
                                    attr.Store(objTemp);
                                    ti.Attributes.Add(attr);
                                }
                            }
                            objTemp.Clear();
                            mi = null;
                            attr = null;
                            isMethord = false;

                            ReadMethordBody(list, word);

                            break;
                        }

                        // 类体定义,方法或属性
                        if (!isTypeBody)
                        {
                            isTypeBody = true;
                        }
                        break;
                    case "DECLARE_DYNCREATE":
                    case "DECLARE_MESSAGE_MAP":
                        // 读取到行尾
                        word = ReadToLineEnd(list);
                        wordNext = GetTokenText(list, tokenCurrent);
                        continue;

                    case ";":
                        // 方法或属性定义结束
                        if (isMethord)
                        {
                            if (mi != null)
                            {
                                mi.Store(objTemp);
                                if (!string.IsNullOrEmpty(paramObj.Code))
                                {
                                    ObjectInfo param = new ObjectInfo();
                                    param.Store(paramObj);
                                    paramList.Add(param);

                                    if (mi.Parameters == null) mi.Parameters = new List<ObjectInfo>();
                                    mi.Parameters.AddRange(paramList);
                                }
                                ti.Methords.Add(mi);
                            }
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(objTemp.Code))
                            {
                                attr = new AttributeInfo();
                                attr.Store(objTemp);
                                ti.Attributes.Add(attr);
                            }
                        }
                        objTemp.Clear();
                        mi = null;
                        attr = null;
                        isMethord = false;
                        break;
                    case ",":
                        if (isMethord)
                        {
                            if (!string.IsNullOrEmpty(paramObj.Code))
                            {
                                ObjectInfo param = new ObjectInfo();
                                param.Store(paramObj);
                                paramList.Add(param);
                            }
                            paramObj.Clear();
                        }
                        break;
                    default:
                        if (word == ti.Code)
                        {
                            // 构造函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word;
                        }
                        else if(word == "~" && GetTokenText(list, tokenCurrent.next) == ti.Code)
                        {
                            // 析构函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word + ti.Code;
                            word = NextTokenText(list);
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(objTemp.Type))
                            {
                                objTemp.Modifier = sModifier;
                                switch (word)
                                {
                                    case "const":
                                        objTemp.IsConst = true;
                                        break;
                                    case "inline":
                                        break;
                                    default:
                                        objTemp.Type = word;
                                        break;
                                }
                            }
                            else if (string.IsNullOrEmpty(objTemp.Code))
                            {
                                switch (word)
                                {
                                    case "*":
                                    case "&":
                                        objTemp.Type += word;
                                        break;
                                    default:
                                        objTemp.Code = objTemp.Name = word;
                                        break;
                                }
                            }
                            else if (isMethord)
                            {
                                // 一般应该为参数

                                if (string.IsNullOrEmpty(paramObj.Type))
                                {
                                    paramObj.Modifier = sModifier;

                                    if (word == "const")
                                    {
                                        paramObj.IsConst = true;
                                    }
                                    else
                                    {
                                        paramObj.Type = word;
                                    }
                                }
                                else if (string.IsNullOrEmpty(paramObj.Code))
                                {
                                    switch(word)
                                    {
                                        case "*":
                                        case "&":
                                            paramObj.Type += word;
                                            break;
                                        default:
                                            paramObj.Code = paramObj.Name = word;
                                            break;
                                    }
                                }
                            }
                        }

                        break;
                }

                if (tokenCurrent.next == null)
                {
                    break;
                }
                word = NextTokenText(list);
                wordNext = GetTokenText(list, tokenCurrent.next);
            }
        }
예제 #2
0
        private void ProcessAType(ref TypeInfo ti, ref string sModifier, bool bIsValueType)
        {
            string word = NextTokenText();
            ti.Name = ti.Code = word;
            word = NextTokenText();
            string wordNext = GetTokenText(tokenCurrent.next);


            if (word == ";" || word == "*" || ";" == wordNext || wordNext == "*")
            {
                ti.IsClass = false;
                return;
            }
            ti.IsClass = true;

            ObjectInfo objTemp = new ObjectInfo(), paramObj = new ObjectInfo();
            List<ObjectInfo> paramList = new List<ObjectInfo>();
            bool isTypeBody = false, isMethord = false;
            Stack<int> stack = new Stack<int>();
            stack.Push(0);
            while (stack.Count > 0)
            {
                switch(word)
                {
                    case "operator":
                        ReadMethordBody(word, null);
                        objTemp.Clear();
                        break;
                    case "volatile":
                        objTemp.IsVolatile = true;
                        break;
                    case "static":
                        objTemp.IsStatic = true;
                        break;
                    case "virtual":
                        objTemp.IsVirtual = true;
                        objTemp.Virtual = word;
                        break;
                    case "WINAPI":
                    case "afx_msg":
                        break;
                    case "private":
                    case "protected":
                    case "public":
                        sModifier = word;
                        break;
                    case "union":
                        objTemp.Type = word;
                        ReadMethordBody(word, null);
                        break;
                    case ":":
                        if (!isTypeBody)
                        {
                            // 处理继承
                            ReadParentInfo(ti, word);
                        }
                        break;
                    case "(":
                        isMethord = true;
                        paramList.Clear();
                        paramObj.Clear();
                        break;
                    case ")":
                        if (isMethord && tokenCurrent.next != null && tokenCurrent.next.next != null && ("=" == GetTokenText(tokenCurrent.next)) && ("0" == GetTokenText(tokenCurrent.next.next)))
                        {
                            objTemp.IsAbstract = true;
                            ti.IsAbstract = true;
                            tokenCurrent = tokenCurrent.next.next;
                        }
                        if (isMethord && wordNext == ":")
                        {
                            // 构造函数后有参数初始化的
                            ReadMethordBody(word, objTemp.Implementation);

                            if (isTypeBody)
                            {
                                if (!string.IsNullOrEmpty(paramObj.Code))
                                {
                                    ObjectInfo param = new ObjectInfo();
                                    param.Store(paramObj);
                                    paramList.Add(param);
                                }
                                paramObj.Clear();

                                // 方法或属性定义结束
                                ti.AddMethord(objTemp, paramList);

                                objTemp.Clear();
                                isMethord = false;
                            }
                        }
                        break;
                    case "}":
                        stack.Pop();
                        break;
                    case "{":
                    case ";":
                    case ",":
                        if (isTypeBody && isMethord)    //  && (word == "," || word == ";")
                        {
                            if (!string.IsNullOrEmpty(paramObj.Code))
                            {
                                ObjectInfo param = new ObjectInfo();
                                param.Store(paramObj);
                                paramList.Add(param);
                            }
                            paramObj.Clear();
                        }

                        if (isTypeBody && word != ",") //  || word == ";"
                        {
                            // 方法或属性定义结束
                            if (isMethord)
                            {
                                // 跳过方法体
                                if (word == "{")
                                {
                                    ReadMethordBody(word, objTemp.Implementation);
                                }

                                ti.AddMethord(objTemp, paramList);
                            }
                            else
                            {
                                ti.AddAttribute(objTemp);
                            }

                            objTemp.Clear();
                            isMethord = false;

                            break;
                        }

                        // 类体定义,方法或属性
                        if (!isTypeBody && word == "{")
                        {
                            isTypeBody = true;
                        }
                        break;
                    case "DECLARE_DYNCREATE":
                    case "DECLARE_MESSAGE_MAP":
                        // 读取到行尾
                        word = ReadToLineEnd();
                        wordNext = GetTokenText(tokenCurrent);
                        continue;
                    default:
                        if (word == "~" && GetTokenText(tokenCurrent.next) == ti.Code)
                        {
                            // 析构函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word + ti.Code;
                            word = NextTokenText();
                        }
                        else
                        {
                            if (isMethord)
                            {
                                if (word == "=")
                                {
                                    // 忽略参数的默认值
                                    wordNext = GetTokenText(tokenCurrent.next);
                                    Stack sTemp = new Stack();
                                    while ((wordNext != "," && wordNext != ")") || sTemp.Count > 0)
                                    {
                                        switch (wordNext)
                                        {
                                            case "(":
                                                sTemp.Push("(");
                                                break;
                                            case ")":
                                                if (sTemp.Count > 0) sTemp.Pop();
                                                break;
                                        }
                                        word = NextTokenText();
                                        paramObj.Default += word;
                                        if (tokenCurrent == null || tokenCurrent.next == null)
                                        {
                                            break;
                                        }
                                        wordNext = GetTokenText(tokenCurrent.next);
                                    }
                                }
                                else
                                {
                                    // 一般应该为参数
                                    ChangeObjectInfo(paramObj, word, sModifier);
                                }
                            }
                            else
                            {
                                // 可能为构造函数或属性定义【指针】
                                ChangeObjectInfo(objTemp, word, sModifier);
                            }
                        }

                        break;
                }

                if (tokenCurrent == null ||tokenCurrent.next == null)
                {
                    break;
                }
                word = NextTokenText();
                wordNext = GetTokenText(tokenCurrent.next);
            }
        }