Exemple #1
0
        /// <summary>
        /// [変換]ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TranslationButton_Click(object sender, EventArgs e)
        {
            CodeToPibotBuilder codeToPibotBuilder = new CodeToPibotBuilder();
            Pibot pibot = codeToPibotBuilder.Translate(textBox1.Text);

            textBox2.Text = new PibotToUmlBuilder().Build(pibot);
        }
Exemple #2
0
        public Pibot Translate(string text1)
        {
            #region レキサー
            List <string> tokens;
            {
                Trace.WriteLine("フェーズ1");
                string[] tokens1 = Lex_SplitBySpace(text1);
                // ダンプ
                Common.Dump(tokens1);

                Trace.WriteLine("フェーズ2");
                List <string> tokens2 = Lex_ToCharChanks(tokens1);
                // ダンプ
                Common.Dump(tokens2);

                Trace.WriteLine("フェーズ3");
                tokens = Common.DeleteEmptyStringElement(tokens2);
                // ダンプ
                Common.Dump(tokens);
            }
            #endregion

            #region クラシフィケーション
            Pibot pibot = new Pibot();
            Classificate(tokens, pibot);
            #endregion

            return(pibot);
        }
Exemple #3
0
        private void Button1_Click(object sender, EventArgs e)
        {
            UmlToPibotBuilder builder1 = new UmlToPibotBuilder()
            {
                isDeleteFontTag = deleteFontTagCheckBox.Checked
            };
            Pibot pibot = builder1.Build(textBox2.Text);

            textBox3.Text = new PibotToUmlBuilder().Build(pibot);
        }
Exemple #4
0
        public Pibot Build(string text)
        {
            #region レキサー
            string[] tokens1 = LexicalParse1(text);
            Common.Dump(tokens1);

            List <string> tokens2 = LexicalParse2(tokens1);
            Common.Dump(tokens2);

            tokens2 = Common.DeleteEmptyStringElement(tokens2);
            Common.Dump(tokens2);
            #endregion

            Pibot pibot = new Pibot();
            Classificate(tokens2, pibot);

            return(pibot);
        }
Exemple #5
0
        public string Build(Pibot pibot)
        {
            StringBuilder sb = new StringBuilder();

            // ****************************
            // * アクセス修飾子(その1) *
            // ****************************
            //
            // ステレオタイプはここでは付けません
            // 名前の前にステレオタイプを付けると、インデントがぐちゃぐちゃになるんで、型の後ろに付けることにします
            switch (pibot.accessModify)
            {
            case Pibot.AccessModify.Private: sb.Append("- "); break;

            case Pibot.AccessModify.Protected: sb.Append("# "); break;

            case Pibot.AccessModify.ProtectedInternal: sb.Append("# "); break;

            case Pibot.AccessModify.Public: sb.Append("+ "); break;
            }

            bool writedColon = false;

            if ("" == pibot.name)
            {
                // 名前が無い場合、コンストラクタ
                // 名前
                sb.Append(pibot.type); // 型を名前扱いにする

                // 引数リスト
                if (0 < pibot.argumentList.Length)
                {
                    sb.Append(pibot.argumentList.ToString());
                }

                //sb.Append(" : ");
                //writedColon = true;
            }
            else
            {
                // 名前
                sb.Append(pibot.name);

                // 引数リスト
                if (0 < pibot.argumentList.Length)
                {
                    sb.Append(pibot.argumentList.ToString());
                }

                sb.Append(" : ");
                writedColon = true;
                // 型
                sb.Append(pibot.type);
                // ジェネリック型引数
                if (0 < pibot.genericParameters.Length)
                {
                    sb.Append(pibot.genericParameters.ToString());
                }
                // 配列のブラケット
                if (0 < pibot.arrayBrackets.Length)
                {
                    sb.Append(pibot.arrayBrackets.ToString());
                }
            }

            // **********
            // * 修飾子 *
            // **********
            //
            // 名前の前にステレオタイプ等を付けると、インデントがぐちゃぐちゃになるんで、型の後ろに付けることにします
            if (pibot.isStatic ||
                pibot.isConst ||
                pibot.isReadonly ||
                pibot.isOverride ||
                pibot.isVirtual ||
                pibot.accessModify == Pibot.AccessModify.Internal ||
                pibot.accessModify == Pibot.AccessModify.ProtectedInternal
                )
            {
                if (!writedColon)
                {
                    sb.Append(" : UNKNOWN_TYPE");
                    writedColon = true;
                }

                // ****************************
                // * アクセス修飾子(その2) *
                // ****************************
                //
                // 名前の前に付けると、インデントがぐちゃぐちゃになるんで、ステレオタイプは型の後ろに付けることにする
                switch (pibot.accessModify)
                {
                case Pibot.AccessModify.Internal: sb.Append(" <<internal>>"); break;

                case Pibot.AccessModify.ProtectedInternal: sb.Append(" <<internal>>"); break;
                }

                // 修飾子
                if (pibot.isStatic)
                {
                    sb.Append(" {static}");
                }
                // 修飾子
                if (pibot.isConst)
                {
                    sb.Append(" const");
                }
                // 修飾子
                if (pibot.isReadonly)
                {
                    sb.Append(" <<readonly>>");
                }
                // 修飾子
                if (pibot.isOverride)
                {
                    sb.Append(" <<override>>");
                }
                // 修飾子
                if (pibot.isVirtual)
                {
                    sb.Append(" <<virtual>>");
                }
            }

            if (0 < pibot.summaryComment.Length)
            {
                if (!writedColon)
                {
                    sb.Append(" : ");
                }
                sb.Append(" '");
                sb.Append(pibot.summaryComment.ToString().Trim());
                sb.Append("'");
            }

            return(sb.ToString());
        }
Exemple #6
0
        /// <summary>
        /// 分類器
        /// </summary>
        void Classificate(List <string> tokens, Pibot pibot)
        {
            foreach (string token in tokens)
            {
                if (!startedSigunature)
                {
                    if (pibot.isStatic ||
                        pibot.isConst ||
                        pibot.isOverride ||
                        pibot.isReadonly ||
                        pibot.isVirtual ||
                        pibot.accessModify != Pibot.AccessModify.Private ||
                        readType ||
                        readName
                        )
                    {
                        startedSigunature = true;
                    }
                }

                #region ドキュメント・コメント
                if (inDocumentComment)
                {
                    pibot.documentComment.Append(token);

                    if (">" == token)
                    {
                        string docCmt = pibot.documentComment.ToString();
                        if (docCmt.EndsWith("<summary>"))
                        {
                            inSummaryComment = true;
                            goto gt_EndLineComment;
                        }
                        else if (docCmt.EndsWith("</summary>"))
                        {
                            pibot.summaryComment.Length -= "</summary>".Length;
                            inSummaryComment             = false;
                            goto gt_EndLineComment;
                        }
                    }

                    switch (token)
                    {
                    case Common.NEWLINE: pibot.summaryComment.Append(" "); inDocumentComment = false; break;

                    default:
                    {
                        if (inSummaryComment)
                        {
                            if ("\n" == token)
                            {
                                // 改行は 半角スペースに変換して1行にする
                                pibot.summaryComment.Append(" ");
                            }
                            else
                            {
                                pibot.summaryComment.Append(token);
                            }
                        }
                    }
                    break;
                    }

gt_EndLineComment:
                    ;
                }
                #endregion
                #region 一行コメント
                else if (inSinglelineComment)
                {
                    if ("\n" == token)
                    {
                        inSinglelineComment = false;
                    }
                }
                #endregion
                #region アトリビュート
                else if (isAttribute)
                {
                    switch (token)
                    {
                    case "]": isAttribute = false; break;

                    default: break;    // 無視
                    }
                }
                #endregion
                #region ジェネリック引数
                else if (depthOfOpendAngleBracketForGenericParameters <= depthOfOpendAngleBracket)
                {
                    switch (token)
                    {
                    case ",":
                    {
                        // カンマの後ろに空白を足しておく
                        pibot.genericParameters.Append(token);
                        pibot.genericParameters.Append(" ");
                    }
                    break;

                    case ">":
                    {
                        pibot.genericParameters.Append(token);
                        depthOfOpendAngleBracket--;
                    }
                    break;

                    default:
                    {
                        pibot.genericParameters.Append(token);
                    }
                    break;
                    }
                }
                #endregion
                #region 引数のリスト
                else if (isArgumentList)
                {
                    switch (token)
                    {
                    // 直前の空白は削除して追加したい
                    case ",":     // thru
                    case ")":
                    {
                        // 消す前に退避
                        string temp = pibot.argumentList.ToString().TrimEnd();
                        // 最後の空白は消しておく
                        pibot.argumentList.Clear();
                        pibot.argumentList.Append(temp);
                        pibot.argumentList.Append(token);
                        if (")" == token)
                        {
                            isArgumentList = false;
                        }
                    }
                    break;

                    default:
                    {
                        pibot.argumentList.Append(token);
                        // 引数の型と名前を区切る空白が無くなっているので、
                        // 適当に足しておく
                        pibot.argumentList.Append(" ");
                    }
                    break;
                    }
                }
                #endregion
                else
                {
                    switch (token)
                    {
                    case "///": inDocumentComment = true; break;

                    case "//": inSinglelineComment = true; break;

                    case "\n": break;

                    default:
                    {
                        if (!startedSigunature && "[" == token)
                        {
                            isAttribute = true;
                        }
                        else
                        {
                            if (!endMofify)
                            {
                                switch (token)
                                {
                                case "const": pibot.isConst = true; goto gt_next;

                                case "internal": pibot.accessModify = Pibot.AccessModify.Internal; goto gt_next;

                                case "override": pibot.isOverride = true; goto gt_next;

                                case "private": pibot.accessModify = Pibot.AccessModify.Private; goto gt_next;

                                case "protected": pibot.accessModify = Pibot.AccessModify.Protected; goto gt_next;

                                case "protected internal": pibot.accessModify = Pibot.AccessModify.ProtectedInternal; goto gt_next;            // not working. FIXME: トークンにしたい

                                case "public": pibot.accessModify = Pibot.AccessModify.Public; goto gt_next;

                                case "readonly": pibot.isReadonly = true; goto gt_next;

                                case "static": pibot.isStatic = true; goto gt_next;

                                case "virtual": pibot.isVirtual = true; goto gt_next;
                                }
                                endMofify = true;
                            }

                            if (!readType)
                            {
                                pibot.type = token;
                                readType   = true;
                            }
                            else if ("(" == token)         // コンストラクタの場合は名前より早く ( が来る
                            {
                                if (!isArgumentList)
                                {
                                    pibot.argumentList.Append(token);
                                    isArgumentList = true;
                                }
                            }
                            else if ("<" == token)
                            {
                                pibot.genericParameters.Append(token);
                                depthOfOpendAngleBracket++;
                                if (!readName)
                                {
                                    depthOfOpendAngleBracketForGenericParameters = depthOfOpendAngleBracket;
                                }
                            }
                            else if (">" == token)
                            {
                                pibot.genericParameters.Append(token);
                                depthOfOpendAngleBracket--;
                            }
                            else if ("[" == token)
                            {
                                pibot.arrayBrackets.Append(token);
                            }
                            else if ("]" == token)
                            {
                                pibot.arrayBrackets.Append(token);
                            }
                            else if (!readName)
                            {
                                pibot.name = token;
                                readName   = true;
                            }
                        }
                    }
                    break;
                    }
                }

gt_next:
                ;
            }
        }
Exemple #7
0
        /// <summary>
        /// 分類器
        /// </summary>
        void Classificate(List <string> tokens, Pibot pibot)
        {
            pibot.accessModify = Pibot.AccessModify.Private;
            phase = 100;

            foreach (string token in tokens)
            {
                bool parsed = false;

                // 修飾子
                switch (token)
                {
                case "<<internal>>":     // not working. FIXME: トークンにしたい
                    pibot.accessModify = Pibot.AccessModify.Internal;
                    phase  = 200;
                    parsed = true;
                    break;

                case "-":
                    pibot.accessModify = Pibot.AccessModify.Private;
                    phase  = 200;
                    parsed = true;
                    break;

                case "#":
                    pibot.accessModify = Pibot.AccessModify.Protected;
                    phase  = 200;
                    parsed = true;
                    break;

                case "# <<internal>>":     // not working. FIXME: トークンにしたい
                    pibot.accessModify = Pibot.AccessModify.ProtectedInternal;
                    phase  = 200;
                    parsed = true;
                    break;

                case "+":
                    pibot.accessModify = Pibot.AccessModify.Public;
                    phase  = 200;
                    parsed = true;
                    break;
                }

                // 要素名
                if (!parsed && phase < 300)
                {
                    pibot.name = token;
                    phase      = 300;
                    parsed     = true;
                }

                // 「(」
                if (!parsed && phase < 400 && token == "(")
                {
                    pibot.name = token;
                    phase      = 400;
                    parsed     = true;
                }

                // 「)」
                if (!parsed && phase < 500 && token == ")")
                {
                    pibot.name = token;
                    phase      = 500;
                    parsed     = true;
                }

                // 「:」
                if (!parsed && phase < 600 && token == ":")
                {
                    pibot.name = token;
                    phase      = 600;
                    parsed     = true;
                }

                // 型名
                if (!parsed && phase < 700)
                {
                    pibot.name = token;
                    phase      = 700;
                    parsed     = true;
                }

                // 「'」
                if (!parsed && phase < 800 && token == "'")
                {
                    pibot.name = token;
                    phase      = 800;
                    parsed     = true;
                }

                // これ以降、コメント
                pibot.summaryComment.Append(token);
            }
        }