私のパートナーと私は、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; }