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