Esempio n. 1
0
    void ExportFC_InnerEnum(ref StringBuilder szOut, int nSpaceCount)
    {
        int nSize = m_Enums.Count;

        for (int i = 0; i < nSize; ++i)
        {
            PBEnumDesc pEnum = m_Enums[i];
            pEnum.ExportFC(ref szOut, nSpaceCount);
        }
    }
Esempio n. 2
0
    protected PBEnumDesc ParseEnum(List <pb_lex_words> aWords, ref int nStart, int nEnd)
    {
        int        nLeft  = PBLex.FindFirstWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_left_brace, nStart, nEnd);
        int        nRight = PBLex.FindNextWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_right_brace, nStart, nEnd);
        PBEnumDesc pEnum  = null;

        if (nLeft < nRight && nLeft > nStart)
        {
            // 找到了  enum xxx{ }
            if (nStart + 2 == nLeft)
            {
                pb_lex_words name_enum = aWords[nStart + 1];
                pEnum          = new PBEnumDesc();
                pEnum.m_szType = name_enum.GetString();
                pEnum.Parse(aWords, nLeft + 1, nRight + 1);
            }
            nStart = nRight;
        }
        return(pEnum);
    }
Esempio n. 3
0
    public void ParseFile(string szPathName)
    {
        if (!System.IO.File.Exists(szPathName))
        {
            return;
        }
        string szFileData = System.IO.File.ReadAllText(szPathName);

        if (string.IsNullOrEmpty(szFileData))
        {
            return;
        }
        string szFileName = DistillFileName(szPathName);

        m_szCurFileName = szFileName;
        pb_lex_words_contain contain     = new pb_lex_words_contain();
        pb_lex_string_ptr    fileDataPtr = new pb_lex_string_ptr(szFileData);

        PBLex.AnylseProtoFile(contain, fileDataPtr, szFileName);

        PBMessageFile pMessageFile = new PBMessageFile();

        pMessageFile.m_szFileName = szFileName;

        int nSize = contain.m_Words.Count;

        for (int i = 0; i < nSize; ++i)
        {
            pb_lex_words words = contain.m_Words[i];
            switch (words.m_type)
            {
            case pb_lex_words_type.lex_enum:
            {
                PBEnumDesc pEnum = ParseEnum(contain.m_Words, ref i, nSize);
                if (pEnum != null)
                {
                    pMessageFile.m_Enums.Add(pEnum);
                }
            }
            break;

            case pb_lex_words_type.lex_message:
            {
                PBMessage pMessage = ParseMessage(contain.m_Words, ref i, nSize);
                if (pMessage != null)
                {
                    pMessageFile.m_Messages.Add(pMessage);
                }
            }
            break;

            default:
                break;
            }
        }

        if (pMessageFile.m_Messages.Count == 0)
        {
            return;
        }
        m_MessageFiles.Add(pMessageFile);
    }
Esempio n. 4
0
    protected void Parse(List <pb_lex_words> aWords, int nStart, int nEnd)
    {
        int nPB_ID = 0;
        int nFind  = -1;

        for (int i = nStart; i < nEnd; ++i)
        {
            pb_lex_words words = aWords[i];
            if (words.m_type == pb_lex_words_type.lex_enum)
            {
                PBEnumDesc pEnum = ParseEnum(aWords, ref i, nEnd);
                if (pEnum != null)
                {
                    m_Enums.Add(pEnum);
                }
            }
            else if (words.m_type == pb_lex_words_type.lex_message)
            {
                PBMessage pChild = ParseMessage(aWords, ref i, nEnd);
                if (pChild != null)
                {
                    m_ChildMsgDesc.Add(pChild);
                }
            }
            else if (words.m_type == pb_lex_words_type.lex_oneof)
            {
                ParseOneOf(aWords, ref i, nEnd);
            }
            else if (words.m_type == pb_lex_words_type.lex_repeated)
            {
                // repeated type xxx = id;
                // List<type> xxxx = id;
                if (i + 5 < aWords.Count &&
                    aWords[i + 3].m_type == pb_lex_words_type.lex_set &&
                    aWords[i + 5].m_type == pb_lex_words_type.lex_semicolon
                    )
                {
                    pb_lex_words key_words  = aWords[i + 1];
                    pb_lex_words name_words = aWords[i + 2];
                    pb_lex_words id_words   = aWords[i + 4];
                    nPB_ID = PBLex.GetNumber(id_words);
                    nFind  = FindChild(nPB_ID);
                    if (nFind != -1)
                    {
                        i += 5;
                        continue;
                    }

                    MessageItem Item = new MessageItem();
                    Item.m_item_type    = PBValueType.Value_Array;
                    Item.m_key.m_type   = PBLex.GetPBType(key_words);
                    Item.m_key.m_szType = key_words.GetString();
                    Item.m_value        = Item.m_key;
                    Item.m_pOneOfDesc   = m_pCurOneOf;

                    Item.m_szName = name_words.GetString();
                    Item.m_ID     = nPB_ID;
                    m_Member.Add(Item);
                    if (m_pCurOneOf != null)
                    {
                        m_pCurOneOf.m_Childs.Add(Item);
                    }
                    i += 5;
                }
            }
            else if (words.m_type == pb_lex_words_type.lex_map)
            {
                // map<key, value>  xxx = id;
                if (i + 9 < aWords.Count &&
                    aWords[i + 1].m_type == pb_lex_words_type.lex_less &&
                    aWords[i + 3].m_type == pb_lex_words_type.lex_comma &&
                    aWords[i + 5].m_type == pb_lex_words_type.lex_greate &&
                    aWords[i + 7].m_type == pb_lex_words_type.lex_set &&
                    aWords[i + 9].m_type == pb_lex_words_type.lex_semicolon
                    )
                {
                    pb_lex_words key_words   = aWords[i + 2];
                    pb_lex_words value_words = aWords[i + 4];
                    pb_lex_words name_words  = aWords[i + 6];
                    pb_lex_words id_words    = aWords[i + 8];
                    nPB_ID = PBLex.GetNumber(id_words);
                    nFind  = FindChild(nPB_ID);
                    if (nFind != -1)
                    {
                        i += 8;
                        continue;
                    }

                    MessageItem Item = new MessageItem();
                    Item.m_item_type    = PBValueType.Value_Map;
                    Item.m_key.m_type   = PBLex.GetPBType(key_words);
                    Item.m_key.m_szType = key_words.GetString();
                    Item.m_value        = Item.m_key;

                    Item.m_value.m_type   = PBLex.GetPBType(value_words);
                    Item.m_value.m_szType = value_words.GetString();
                    Item.m_pOneOfDesc     = m_pCurOneOf;

                    Item.m_szName = name_words.GetString();
                    Item.m_ID     = PBLex.GetNumber(id_words);
                    m_Member.Add(Item);
                    if (m_pCurOneOf != null)
                    {
                        m_pCurOneOf.m_Childs.Add(Item);
                    }
                    i += 8;
                }
            }
            else
            {
                // xxx type = xx;
                // xxx type = xx [default = xx]
                if (i + 5 < aWords.Count && aWords[i + 2].m_type == pb_lex_words_type.lex_set)
                {
                    // 是成员定义
                    int nSemicolon = PBLex.FindFirstWords(aWords, pb_lex_words_type.lex_none, pb_lex_words_type.lex_semicolon, i, nEnd);
                    if (nSemicolon != -1)
                    {
                        pb_lex_words key_words  = aWords[i + 0];
                        pb_lex_words name_words = aWords[i + 1];
                        pb_lex_words id_words   = aWords[i + 3];
                        nPB_ID = PBLex.GetNumber(id_words);
                        nFind  = FindChild(nPB_ID);
                        if (nFind != -1)
                        {
                            i = nSemicolon;
                            continue;
                        }

                        MessageItem Item = new MessageItem();
                        Item.m_item_type    = PBValueType.Value_Base;
                        Item.m_key.m_type   = PBLex.GetPBType(key_words);
                        Item.m_key.m_szType = key_words.GetString();
                        Item.m_value        = Item.m_key;
                        Item.m_pOneOfDesc   = m_pCurOneOf;

                        Item.m_szName = name_words.GetString();
                        Item.m_ID     = PBLex.GetNumber(id_words);

                        // 找默认值 xxx type = xx [default = xx]
                        if (i + 8 < aWords.Count &&
                            aWords[i + 4].m_type == pb_lex_words_type.lex_bracket_1 &&
                            aWords[i + 5].m_type == pb_lex_words_type.lex_default &&
                            aWords[i + 6].m_type == pb_lex_words_type.lex_set &&
                            aWords[i + 8].m_type == pb_lex_words_type.lex_bracket_2 &&
                            aWords[i + 7].m_type == pb_lex_words_type.lex_value
                            )
                        {
                            if (Item.m_value.m_type != pb_type.pb_string)
                            {
                                Item.m_default = aWords[i + 7].GetString();
                            }
                        }
                        m_Member.Add(Item);
                        if (m_pCurOneOf != null)
                        {
                            m_pCurOneOf.m_Childs.Add(Item);
                        }
                        i = nSemicolon;
                    }
                }
            }
        }
    }