コード例 #1
0
ファイル: PBLex.cs プロジェクト: fcscript/CSharpHotUpdate
 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;
 }
コード例 #2
0
ファイル: PBLex.cs プロジェクト: fcscript/CSharpHotUpdate
    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();
    }
コード例 #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);
    }