1

私のアプリケーションは、インデントされていない C# コード サンプルを読み取り、プログラムでコードをインデントする必要があります私のやり方は正しくないかもしれませんが、それでも部分的な結果が得られる可能性があります。

a が見つかったときに空白を設定{し、残りの行を読み取るために同じ量の空白を続けることができます。別の{スペースが再び見つかったら、スペースを追加し、この新しいスペースで残りの行を続けます。そのために、これは私がしたことです:

    private void btn_format_Click(object sender, EventArgs e)
    {
        string lineInfo = "";
        string fl = "";
        string ctab= char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32);
        foreach (string line in txt_codepage.Lines) // text_codepage is a textbox with code
        {
            if (line.Contains("{"))
            {
                string l = line.Replace("{", ctab+"{");
                lineInfo = lineInfo + (l + "\n");
                fl = fl + ctab;
                ctab = ctab + ctab;
            }
            else
            {
                lineInfo = lineInfo + (char.ConvertFromUtf32(32)+fl+ line + "\n");
            }

ここまでは、必要な適切なインデントを達成できました。が見つかっ}たら、逆のプロセスを実行する必要がありますが、残念ながら文字列ではそれができません。私が意味した逆のプロセスはこれです:

            if (line.Contains("}"))
            {
                string l = line.Replace(ctab + "}", "}");
                lineInfo = lineInfo + (l + "\n");
                fl = fl - ctab;
                ctab = ctab - ctab;
            }
            else
            {
                lineInfo = lineInfo - (char.ConvertFromUtf32(32) + fl + line + "\n");

            }
        }
        MessageBox.Show(lineInfo.ToString());

コードの上記の部分が完全な失敗であることは知っていますが、正しい方法でそれを達成する方法を教えてください

4

3 に答える 3

2

文字列を解析したい場合は、文字列連結の代わりに StringBuilder を使用する必要があります (連結は遅すぎます)。CS やその他のコードを解析する方法を示すために、いくつかのコードを書きました。これは完全な例ではなく、基本的な概念です。

パーサーについて詳しく知りたい場合は、 Compilers: Principles, Techniques, and Toolsを読むことができます。

public static string IndentCSharpCode(string code)
{
    const string INDENT_STEP = "    ";

    if (string.IsNullOrWhiteSpace(code))
    {
        return code;
    }

    var result = new StringBuilder();
    var indent = string.Empty;
    var lineContent = false;
    var stringDefinition = false;

    for (var i = 0; i < code.Length; i++)
    {
        var ch = code[i];

        if (ch == '"' && !stringDefinition)
        {
            result.Append(ch);
            stringDefinition = true;
            continue;
        }

        if (ch == '"' && stringDefinition)
        {
            result.Append(ch);
            stringDefinition = false;
            continue;
        }

        if (stringDefinition)
        {
            result.Append(ch);
            continue;
        }

        if (ch == '{' && !stringDefinition)
        {
            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("{");

            if (lineContent)
            {
                result.AppendLine();
            }

            indent += INDENT_STEP;
            lineContent = false;

            continue;
        }

        if (ch == '}' && !stringDefinition)
        {
            if (indent.Length != 0)
            {
                indent = indent.Substring(0, indent.Length - INDENT_STEP.Length);
            }

            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("}");

            if (lineContent)
            {
                result.AppendLine();
            }


            lineContent = false;

            continue;
        }

        if (ch == '\r')
        {
            continue;
        }

        if ((ch == ' ' || ch == '\t') && !lineContent)
        {
            continue;
        }

        if (ch == '\n')
        {
            lineContent = false;
            result.AppendLine();

            continue;
        }

        if (!lineContent)
        {
            result.Append(indent);
            lineContent = true;
        }

        result.Append(ch);
    }

    return result.ToString();
}
于 2012-08-12T15:16:10.183 に答える
1

コードをクリーニングするためのオープン ソース VS アドインであるcodemaidをチェックアウトできます。

于 2012-08-12T14:57:37.963 に答える
0

String.Trim()を使用して行からすべての空白を削除してから、必要なタブだけを追加します。また、char.ConvertFromUtf32(32)を回避できれば、コードははるかに読みやすくなります。なぜ「」や「」の代わりにそれを書くのでしょうか。

于 2012-08-12T14:41:58.910 に答える