Beispiel #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++;
            }
        }
Beispiel #2
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;
 }
Beispiel #3
0
 public static int FindFirstWords(List <pb_lex_words> aWords, pb_lex_words_type nType1, pb_lex_words_type nType2, int nStart, int nEnd)
 {
     for (int i = nStart; i < nEnd; ++i)
     {
         if (aWords[i].m_type == nType1 ||
             aWords[i].m_type == nType2)
         {
             return(i);
         }
     }
     return(-1);
 }
Beispiel #4
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;
     }
 }
Beispiel #5
0
    public static int FindNextWords(List <pb_lex_words> aWords, pb_lex_words_type leftType, pb_lex_words_type rightType, int nStart, int nEnd)
    {
        int nRef = 0;

        for (int i = nStart; i < nEnd; ++i)
        {
            if (aWords[i].m_type == leftType)
            {
                ++nRef;
            }
            else if (aWords[i].m_type == rightType)
            {
                if (pb_lex_words_type.lex_none != leftType)
                {
                    --nRef;
                }
                if (nRef == 0)
                {
                    return(i);
                }
            }
        }
        return(-1);
    }
Beispiel #6
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();
    }
Beispiel #7
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);
 }
Beispiel #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);
     }
 }