Пример #1
0
        // 功能:添加一个转义符
        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++;
            }
        }
Пример #2
0
    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);
    }
Пример #3
0
 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;
 }
Пример #4
0
 // 功能:判断是不是可以添加关键字
 public bool IsCanPushKeyWords(pb_lex_string_ptr pcsIn, string pcsWords)
 {
     if (m_nLen > 0)
     {
         return(false);
     }
     return(IsWords(pcsIn, pcsWords));
 }
Пример #5
0
 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;
 }
Пример #6
0
 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);
 }
Пример #7
0
 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));
 }
Пример #8
0
 // 功能:尝试添加关键词
 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);
     }
 }
Пример #9
0
 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;
     }
 }
Пример #10
0
    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);
    }
Пример #11
0
    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();
    }
Пример #12
0
 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);
 }
Пример #13
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);
    }