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); } }
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); }
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); }
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; } } } } }