Example #1
0
    protected void ParseOneOf(List <pb_lex_words> aWords, ref int nStart, int nEnd)
    {
        PBOneOfDesc pChild = null;
        int         nLeft  = PBLex.FindFirstWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_left_brace, nStart, nEnd);
        int         nRight = PBLex.FindNextWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_right_brace, nStart, nEnd);

        if (nLeft < nRight && nLeft > nStart)
        {
            // 找到了  message xxx{ }
            if (nStart + 2 == nLeft)
            {
                pb_lex_words name_class = aWords[nStart + 1];
                pChild               = new PBOneOfDesc();
                pChild.m_nIndex      = m_OneOf.Count;
                pChild.m_szClassName = name_class.GetString();
                pChild.m_szName      = MakeOneOfValueName(pChild.m_nIndex);

                PBOneOfDesc pOldOneOf = m_pCurOneOf;
                m_pCurOneOf = pChild;
                m_OneOf.Add(pChild);
                Parse(aWords, nLeft + 1, nRight);
                m_pCurOneOf = pOldOneOf;
            }
            nStart = nRight;
        }
    }
Example #2
0
    void ExportFC_WriteOneOf(ref StringBuilder szOut, ref int nStart, PBOneOfDesc pOneOf, int nSpaceCount)
    {
        szOut.AppendFormat("        switch({0})\r\n", pOneOf.m_szName);
        szOut.Append("        {\r\n");
        MessageItem pChild = null;

        for (int i = 0; i < pOneOf.m_Childs.Count; ++i)
        {
            pChild = pOneOf.m_Childs[i];
            szOut.AppendFormat("        case {0}:\r\n", pChild.m_ID);
            ExportFC_WriteChild(ref szOut, pChild, nSpaceCount + 4);
            szOut.Append("            break;\r\n");
        }
        szOut.Append("         default:\r\n");
        szOut.Append("            break;\r\n");
        szOut.Append("        }\r\n");
        nStart += pOneOf.m_Childs.Count - 1;
    }
Example #3
0
    void ExportFC_OneOfFunc(ref StringBuilder szOut, MessageItem pItem, bool bSetFunc, int nSpaceCount)
    {
        PBOneOfDesc pOneOf           = pItem.m_pOneOfDesc;
        string      szOneOfValueName = pOneOf.m_szName;
        string      szValueClassName = GetValueTypeName(pItem);

        if (bSetFunc)
        {
            // set_xxxx(_Ty value)
            // _Ty mutable_xxxx();
            szOut.AppendFormat("    public void set_{0}({1} _{2})\r\n", pItem.m_szName, szValueClassName, pItem.m_szName);
            szOut.Append("    {\r\n");
            szOut.AppendFormat("        {0} = {1};\r\n", szOneOfValueName, pItem.m_ID);
            szOut.AppendFormat("        {0} = _{1};\r\n", pItem.m_szName, pItem.m_szName);
            szOut.Append("    }\r\n");

            if (pItem.m_item_type != PBValueType.Value_Base || pItem.m_key.m_type == pb_type.pb_none)
            {
                szOut.AppendFormat("    public {0} mutable_{1}()\r\n", szValueClassName, pItem.m_szName);
                szOut.Append("    {\r\n");
                szOut.AppendFormat("        {0} = {1};\r\n", szOneOfValueName, pItem.m_ID);
                szOut.AppendFormat("        if(null == {0})\r\n", pItem.m_szName);
                szOut.AppendFormat("            {0} = new {1}();\r\n", pItem.m_szName, szValueClassName);
                szOut.AppendFormat("        return {0};\r\n", pItem.m_szName);
                szOut.Append("    }\r\n");
            }
        }
        else
        {
            // has_xxxx()
            szOut.AppendFormat("    public bool has_{0}()\r\n", pItem.m_szName);
            szOut.Append("    {\r\n");
            szOut.AppendFormat("        return {0} == {1};\r\n", pItem.m_ID, szOneOfValueName);
            szOut.Append("    }\r\n");

            szOut.AppendFormat("    public {0} get_{1}()\r\n", szValueClassName, pItem.m_szName);
            szOut.Append("    {\r\n");
            szOut.AppendFormat("        return {0};\r\n", pItem.m_szName);
            szOut.Append("    }\r\n");
        }
    }
Example #4
0
    void ExportFC_OneofEnum(ref StringBuilder szOut, int nSpaceCount)
    {
        int nSize = m_OneOf.Count;

        for (int i = 0; i < nSize; ++i)
        {
            PBOneOfDesc pOneOf     = m_OneOf[i];
            int         nEnumCount = pOneOf.m_Childs.Count;
            szOut.Append(' ', nSpaceCount);
            szOut.AppendFormat("public enum {0}Case\r\n", pOneOf.m_szClassName);
            szOut.Append(' ', nSpaceCount);
            szOut.Append("{\r\n");
            for (int j = 0; j < nEnumCount; ++j)
            {
                szOut.Append(' ', nSpaceCount + 4);
                szOut.AppendFormat("k{0} = {1},\r\n", pOneOf.m_Childs[j].m_szName, pOneOf.m_Childs[j].m_ID);
            }
            string szName = pOneOf.m_szClassName.ToUpper();
            szOut.Append(' ', nSpaceCount + 4);
            szOut.AppendFormat("{0}_NOT_SET = 0,\r\n", szName);
            szOut.Append(' ', nSpaceCount);
            szOut.Append("};\r\n");
        }
    }
Example #5
0
    // -------------------------------------------------------------

    public void ExportFCScript(ref StringBuilder szOut, int nSpaceCount, bool bExportReadWriteFunc)
    {
        int nParentSpaceCount = nSpaceCount;

        szOut.Append("\r\n");
        // 先生成枚举
        ExportFC_InnerEnum(ref szOut, nSpaceCount);

        // 先将类内的函数,生成到类外吧
        ExportFC_InnerClass(ref szOut, nSpaceCount, bExportReadWriteFunc);
        szOut.Append("\r\n");

        // 导出类
        szOut.Append(' ', nParentSpaceCount);
        szOut.AppendFormat("public class {0}\r\n", m_szClassName);
        szOut.Append(' ', nParentSpaceCount);
        szOut.Append("{\r\n");

        nSpaceCount += 4;
        // 生成内部的枚举
        szOut.Append(' ', nSpaceCount);
        szOut.Append("//-----------------------------\r\n");
        ExportFC_OneofEnum(ref szOut, nSpaceCount);
        szOut.Append(' ', nSpaceCount);
        szOut.Append("//-----------------------------\r\n");

        // 生成变量
        int         nSize     = m_Member.Count;
        PBOneOfDesc pOneOfPtr = null;

        for (int i = 0; i < nSize; ++i)
        {
            MessageItem pItem = m_Member[i];
            if (pOneOfPtr != pItem.m_pOneOfDesc)
            {
                szOut.Append("    //-----------------------------\r\n");
                PBOneOfDesc pOneOf = pItem.m_pOneOfDesc;
                if (pOneOf != null)
                {
                    szOut.AppendFormat("    int  {0}; // {1}\r\n", pOneOf.m_szName, pOneOf.m_szClassName);
                }
            }
            pOneOfPtr = pItem.m_pOneOfDesc;
            ExportFC_ValueReflexTable(ref szOut, pItem, nSpaceCount);
            if (string.IsNullOrEmpty(pItem.m_default))
            {
                szOut.AppendFormat("    public {0}  {1};// = {2}\r\n", GetValueTypeName(pItem), pItem.m_szName, pItem.m_ID);
            }
            else
            {
                szOut.AppendFormat("    public {0}  {1} = {2};// = {3}\r\n", GetValueTypeName(pItem), pItem.m_szName, pItem.m_default, pItem.m_ID);
            }
        }
        if (pOneOfPtr != null)
        {
            szOut.Append("    //-----------------------------\r\n");
        }

        // 生成Set函数
        ExportFC_SetFunc(ref szOut, nSpaceCount);

        // 生成Get函数
        ExportFC_GetFunc(ref szOut, nSpaceCount);

        // 生成写函数
        if (bExportReadWriteFunc)
        {
            ExportFC_WriteFunc(ref szOut, nSpaceCount);
        }

        // 生成读函数
        if (bExportReadWriteFunc)
        {
            ExportFC_ReadFunc(ref szOut, nSpaceCount);
        }

        szOut.Append(' ', nParentSpaceCount);
        szOut.Append("};\r\n");
    }