// 功能:添加一个转义符 public void push_escape_char(pb_lex_string_ptr pcsIn, char ch, pb_lex_words_type type) { if (m_type != type && m_nLen > 0) { Flush(); } if (!m_bEscapeChar) { m_bEscapeChar = true; } if (m_nLen == 0) { m_nLine = m_nCurLine; m_nLineStart = (int)(pcsIn - m_pcsCurLine); m_pcsIn = pcsIn; m_nLen = 1; m_nCodeLine = m_nStartCode + (int)(pcsIn - m_pcsStart); m_type = type; } else { m_nLen++; } }
public static pb_lex_string_ptr operator +(pb_lex_string_ptr left, int nLen) { pb_lex_string_ptr ptr = left; ptr.Skip(nLen); return(ptr); }
public void SetLine(pb_lex_string_ptr pcsIn, pb_lex_words_type type) { m_nCodeLine = m_nStartCode + (int)(pcsIn - m_pcsStart); m_type = type; m_nLine = m_nCurLine; m_nLineStart = (int)(pcsIn - m_pcsCurLine); m_pcsIn = pcsIn; }
// 功能:判断是不是可以添加关键字 public bool IsCanPushKeyWords(pb_lex_string_ptr pcsIn, string pcsWords) { if (m_nLen > 0) { return(false); } return(IsWords(pcsIn, pcsWords)); }
public pb_lex_words_ex(pb_lex_string_ptr pcsStart, int nStartCode, pb_lex_words_contain pWords) { m_pcsStart = pcsStart; m_nStartCode = nStartCode; m_pWords = pWords; m_nCurLine = 0; m_bEscapeChar = false; }
public static bool IsHaveUTF8(pb_lex_string_ptr pcsStr) { if (pcsStr.Offset + 3 > pcsStr.Length) { return(false); } return(pcsStr[0] == 0xef && pcsStr[1] == 0xbb && pcsStr[2] == 0xbf); }
public static bool IsHaveUTF16(pb_lex_string_ptr pcsStr) { if (pcsStr.Offset + 4 > pcsStr.Length) { return(false); } return((pcsStr[0] == 0xfe && pcsStr[1] == 0xff) || (pcsStr[0] == 0xff && pcsStr[1] == 0xfe)); }
// 功能:尝试添加关键词 public void TryPushKeyWords(ref pb_lex_string_ptr pcsIn, string pcsWords, int nWordsLen, pb_lex_words_type type) { if (IsCanPushKeyWords(pcsIn, pcsWords)) { push_char(pcsIn, type, nWordsLen); Flush(); pcsIn.Skip(nWordsLen - 1); } else { push_char(pcsIn, pb_lex_words_type.lex_value); } }
public void push_char(pb_lex_string_ptr pcsIn, pb_lex_words_type type, int nLen = 1) { if (m_type != type && m_nLen > 0) { Flush(); } if (m_nLen == 0) { m_nLine = m_nCurLine; m_nLineStart = (int)(pcsIn - m_pcsCurLine); m_pcsIn = pcsIn; m_nLen = nLen; m_nCodeLine = m_nStartCode + (int)(pcsIn - m_pcsStart); m_type = type; } else { m_nLen += nLen; } }
public static bool IsWords(pb_lex_string_ptr pcsIn, string pcsWords) { int i = 0, nLen2 = pcsWords.Length; for (; i < nLen2; ++i) { if (pcsIn[i] != pcsWords[i]) { return(false); } } char ch = pcsIn[i]; if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_' ) { return(false); } return(true); }
public static void AnylseProtoFile(pb_lex_words_contain contain, pb_lex_string_ptr pcsIn, string pcsFileName) { contain.reserve(10000); int nStartCode = pcsIn.Offset; // 这个只是针对C/C++语法 int nHelp = 0; pb_lex_words_type nHelpType = pb_lex_words_type.lex_value; pb_lex_words_ex words = new pb_lex_words_ex(pcsIn, nStartCode, contain); words.m_nCurLine = 1; words.m_pcsCurLine = pcsIn; words.m_pcsFileName = pcsFileName; words.m_pcsThisFileName = pcsFileName; if (IsHaveUTF8(pcsIn)) { pcsIn.Skip(3); } else if (IsHaveUTF16(pcsIn)) { pcsIn.Skip(4); } char ch; for (; pcsIn.IsCanRead(); pcsIn.NextStep()) { ch = pcsIn[0]; if (nHelp > 0) { if (nHelp == 1) // C++风格注释 { if (ch == '\r') { words.m_nCurLine++; if (pcsIn[1] == '\n') { pcsIn.NextStep(); } words.m_pcsCurLine = pcsIn + 1; nHelp = 0; } else if (ch == '\n') { words.m_nCurLine++; words.m_pcsCurLine = pcsIn + 1; nHelp = 0; } } else if (nHelp == 2) // C 风格注释 { if (ch == '\r') { words.m_nCurLine++; if (pcsIn[1] == '\n') { pcsIn.NextStep(); } words.m_pcsCurLine = pcsIn + 1; } else if (ch == '\n') { words.m_nCurLine++; words.m_pcsCurLine = pcsIn + 1; } else if (ch == '*' && pcsIn[1] == '/') { pcsIn.NextStep(); nHelp = 0; } } else if (nHelp == 3) { if (ch == '\"') { nHelp = 0; words.FlushString(); } else { words.push_char(pcsIn, nHelpType); } } else if (nHelp == 4) { if (ch == '\'') { nHelp = 0; words.FlushString(); } else { words.push_char(pcsIn, nHelpType); } } continue; } else { switch (ch) { case '/': { if (pcsIn[1] == '/') { nHelp = 1; pcsIn.NextStep(); } else if (pcsIn[1] == '*') { nHelp = 2; pcsIn.NextStep(); } else if (pcsIn[1] == '=') { pcsIn.NextStep(); } else { //words.push_char(pcsIn, lex_div); } } break; case '\"': nHelp = 3; words.Flush(); words.SetLine(pcsIn, pb_lex_words_type.lex_string_a); nHelpType = pb_lex_words_type.lex_string_a; break; case '\'': words.Flush(); break; case ' ': case '\t': { if (words.m_nLen > 0) { words.Flush(); } } break; case '\r': { words.m_nCurLine++; if (pcsIn[1] == '\n') { pcsIn.NextStep(); } words.m_pcsCurLine = pcsIn + 1; } break; case '\n': { words.m_nCurLine++; words.m_pcsCurLine = pcsIn + 1; } break; case '=': // = == words.push_single_key(pcsIn, pb_lex_words_type.lex_set); break; case '<': // < <= << <<= words.push_single_key(pcsIn, pb_lex_words_type.lex_less); break; case '>': // > >= >> >>= words.push_single_key(pcsIn, pb_lex_words_type.lex_greate); break; case ';': { words.push_single_key(pcsIn, pb_lex_words_type.lex_semicolon); } break; case ',': { words.push_single_key(pcsIn, pb_lex_words_type.lex_comma); } break; case '(': { words.push_single_key(pcsIn, pb_lex_words_type.lex_left_bracket); } break; case ')': { words.push_single_key(pcsIn, pb_lex_words_type.lex_right_bracket); } break; case '{': { words.push_single_key(pcsIn, pb_lex_words_type.lex_left_brace); } break; case '}': { words.push_single_key(pcsIn, pb_lex_words_type.lex_right_brace); } break; case '[': { words.push_single_key(pcsIn, pb_lex_words_type.lex_bracket_1); } break; case ']': { words.push_single_key(pcsIn, pb_lex_words_type.lex_bracket_2); } break; case 'd': // default { if (words.IsCanPushKeyWords(pcsIn, "default")) { words.PushKeyWords(ref pcsIn, pb_lex_words_type.lex_default, 7); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } } break; case 'i': // if { if (words.IsCanPushKeyWords(pcsIn, "import")) { words.PushKeyWords(ref pcsIn, pb_lex_words_type.lex_import, 6); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } } break; case 'e': // else if (words.IsCanPushKeyWords(pcsIn, "enum")) { words.PushKeyWords(ref pcsIn, pb_lex_words_type.lex_enum, 4); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } break; case 'r': if (words.IsCanPushKeyWords(pcsIn, "repeated")) { words.PushKeyWords(ref pcsIn, pb_lex_words_type.lex_repeated, 8); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } break; case 's': if (words.IsCanPushKeyWords(pcsIn, "syntax")) { words.TryPushKeyWords(ref pcsIn, "syntax", 6, pb_lex_words_type.lex_syntax); } else if (words.IsCanPushKeyWords(pcsIn, "service")) { words.TryPushKeyWords(ref pcsIn, "service", 7, pb_lex_words_type.lex_service); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } break; case 'm': if (words.IsCanPushKeyWords(pcsIn, "message")) { words.TryPushKeyWords(ref pcsIn, "message", 7, pb_lex_words_type.lex_message); } else if (words.IsCanPushKeyWords(pcsIn, "map")) { words.TryPushKeyWords(ref pcsIn, "map", 3, pb_lex_words_type.lex_map); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } break; case 'o': words.TryPushKeyWords(ref pcsIn, "oneof", 5, pb_lex_words_type.lex_oneof); break; case 'p': if (words.IsCanPushKeyWords(pcsIn, "package")) { words.PushKeyWords(ref pcsIn, pb_lex_words_type.lex_package, 7); } else { words.push_char(pcsIn, pb_lex_words_type.lex_value); } break; default: words.push_char(pcsIn, pb_lex_words_type.lex_value); break; } } } words.Flush(); }
public void PushKeyWords(ref pb_lex_string_ptr pcsIn, pb_lex_words_type type, int nWordsLen) { push_char(pcsIn, type, nWordsLen); Flush(); pcsIn.Skip(nWordsLen - 1); }
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); }