2

私のパートナーと私は、C++ コード用の prettyprinter に取り組んでいます。ツールは入力 C++ コードを解析し、結果の AST を出力するため、かなりの柔軟性があります。ユーザーが出力を制御するためのいくつかのオプションを実装しました。現在、最も重要なオプションについて意見を求めています。私たちの現状(以下)を見て、好きなもの/嫌いなもの、他に何が必要かなどを教えていただければ幸いです。

ありがとう、ジョー

以下は、現在のオプションの一部です (長くなって申し訳ありません)。


1. 制御ブロック


1.1 インデント文字列


各インデントに使用される空白文字列を定義します。

例:

• IndentString “ ”</p>

void f ()
{
  int a;
}

• IndentString “\t”</p>

void f ()
{
    int m;
}

1.2 OpenBraceLocation


3 つのオプション: 「EndOfLine」、「NextLine」、または「NextLineAsWellAsCloseParen」</p>

関連付けられているキーワードと同じ行または次の行で開き中かっこを開始します。最後のオプションは、次の行にも存在する場合、開き括弧の前に閉じ括弧を移動します。

if、while、for、switch、および do-while ステートメントに適用されます。

存在しない場合は、「EndOfLine」オプションが使用されます。

例:

• OpenBraceLocation EndOfLine

if(val){
    val++;
}

• OpenBraceLocation NextLine

if(val)
{
    val++;
}

• OpenBraceLocation NextLineAsWellAsCloseParen

if(val
){
    val++;
}

1.3 NoBracesAroundSingleStatementBlock


ステートメントが 1 つしかないステートメント ブロックからは、中かっこが削除されます。このオプションは、do-while、for、if、および while ブロックに適用されます。

例:

• NoBracesAroundSingleStatementBlock が存在する

if(a)
    func();

• NoBracesAroundSingleStatementBlock が存在しない

if(a)
{
    func();
}

2.クラス


2.1 virtualQualifier


オプションは、「どこでも」または「ミニマリスト」です。「Everywhere」を使用すると、すべての派生クラスで、基本クラスで仮想として宣言された関数の前にキーワード「仮想」が表示されます。「Minimalist」では、基本クラスにのみ表示されます。

例 :

• virtualQualifier Everwhere

class Base
{
    virtual void f(int a);
}

class Derived : public Base
{
    virtual void f( int a);

class MostDerived : public Derived
{
    virtual void f( int a);

• virtualQualifier ミニマリスト

class Base
{
    virtual void f(int a);
}

class Derived : public Base
{
    void f( int a);

class MostDerived : public Derived
{
    void f( int a);

2.2 ソートクラスメンバー


レベル オプションは、「アクセス」、「データ/機能」または「機能/データ」、および「アルファ」です。level-option が指定されていない場合、または SortClassMember が存在しない場合、メンバーの順序は変更されません。

例:

• SortClassMembers データ/関数 Access Alpha

class Compiler 
{
private:
    string inputFileName;
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    parse();
    tokenize( string const & inputFileName_);
}

• SortClassMembers アクセス関数/データ アルファ

class C
{
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    parse();
    tokenize( string const & inputFileName_);
private:
    string inputFileName;
}

• SortClassMembers アクセス アルファ

class C
{
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    string inputFileName;
    parse();
    tokenize( string const & inputFileName_);
}

3. ファイル


3.1 MaxLineWidth


最大線幅を定義します。PrettyC++ は、可能であれば長い行をインテリジェントにラップします。

例:

• MaxLineWidth 80

int x = 123456789;

• MaxLineWidth 10

int x =
123456789;

3.2 constLocation


オプションは「前」または「後」です。Before オプションは、型指定子の前に const キーワードを配置します。After オプションは、型指定子の後に const キーワードを配置します。

例 :

• 前の constLocation

const int x;

• constLocation 後

int const x;

4. 名前


4.1 AllNamesStartCase


オプションは「LowerCase」または「UpperCase」です。

例:

• AllNamesStartCase 小文字

int variable = 123456789;

• AllNamesStartCase 大文字

int Variable = 123456789;

4.2 AllNamesDelimitWords


オプションは「CaseDelimited」または「UnderscoreDelimited」です。単語は、大文字で始まるかアンダースコアに続くかによって識別されます。

例:

• AllNamesDelimitWords CaseDelimited

int myVariable = 123456789;

• AllNamesDelimitWords UnderscoreDelimited

int my_variable = 123456789;

4.3 FunctionNamesStartCase


オプションは「LowerCase」または「UpperCase」です。

例:

• FunctionNamesStartCase 小文字

void function() { return; }

• FunctionNamesStartCase 大文字

void Function() { return; }

4.4 FunctionNamesDelimitWords


オプションは「CaseDelimited」または「UnderscoreDelimited」です。単語は、大文字で始まるかアンダースコアに続くかによって識別されます。

例:

• FunctionNamesDelimitWords CaseDelimited

void myFunction() { return; }

• FunctionNamesDelimitWords UnderscoreDelimited

void my_function() { return; }
4

7 に答える 7

2

コード フォーマッタで見逃していることの 1 つは、コードの構造に関するより多くのヒントを与えてくれるものです。次のように、ほぼ等しいステートメントの連続する行をインデントして、それらの対応と相違点を強調することがよくあります。

auto_ptr<Base::Int> x1 = get<DataModelI::Base::Int>( context, c_Input1 );
auto_ptr<Base::Real> x2 = get<DataModelI::Base::Real>( context, c_Input2 );
auto_ptr<Composite::Array> x3 = get<Composite::Array>( context, c_Input3 );
auto_ptr<Base::Real> x4 = get<DataModelI::Base::Real>( context, c_Input4 );

その中に

auto_ptr<Base::Int       > x1 = get<DataModelI::Base::Int >( context, c_Input1 );
auto_ptr<Base::Real      > x2 = get<DataModelI::Base::Real>( context, c_Input2 );
auto_ptr<Composite::Array> x3 = get<Composite::Array      >( context, c_Input3 );
auto_ptr<Base::Real      > x4 = get<DataModelI::Base::Real>( context, c_Input4 );

これはまったく維持できません。別の長い行が追加されると、以前のすべての行をインデントするのに時間がかかります。はい、私はCode Completeを読み、これに関する彼らの声明に部分的に同意しました:)

この (非常に人間的で主観的な) 審美的なヒューリスティックを視聴者に追加していただければ幸いです。

コードをできるだけ明確にしたい。私の夢のコード ビューアーでは、using宣言の表示を切り替えることができます。おそらく、それらは必要ないかもしれません。完全な名前空間の表示を切り替えたり、ローカル変数の宣言を非表示にして、制御フローだけに集中したりできます。

于 2009-07-08T20:37:43.360 に答える
1

まあ、とても好きです。でもスタイルとは違うの?Astyleは、この種のことにはかなりうまく機能します。

于 2009-07-08T20:25:33.293 に答える
1

日食コードフォーマッターを見てみることをお勧めします。Java用かもしれませんが、C++に適用されるオプションはまだたくさんあります。そうでなければ、あなたが現在持っているものは私には良さそうですが、多分少しまばらです...もう少し詳しく説明しますが、今は時間がありません。他の誰かも答えると確信しています。 。

また、EclipseはC ++をサポートしていますが、これまで見たことがありませんが、コードフォーマッターもあると思います。

于 2009-07-08T17:47:02.427 に答える
1

GNU Indentは、C または C++ 用に設計された自動インデント プログラムです。必要に応じて、オプションまたはソースを確認できます。

于 2009-07-08T17:51:42.730 に答える
1

Vera ++を見てください

于 2009-07-08T18:18:23.487 に答える
0

スタイルフォーマッタはどうですか。例: gnu、bsd、k&r などのフォーマット

http://en.wikipedia.org/wiki/Indent_style

于 2009-07-08T23:36:51.190 に答える