/// <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); }
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); }
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); }
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); }
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()); }
/// <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: ; } }
/// <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); } }