rule move_to_initializer(constructor_name:IDENTIFIER,
arguments: argument_list,
initializer_list: initializer,
member_name:IDENTIFIER,
initializer_expression: expression,
statements: statement_list
): constructor -> constructor =
" \constructor_name(\arguments): \initializer_list
{ \member_name = \initializer_expression ;
\statements } "
-> " \constructor_name(\arguments): \initializer_list, \member_name(\initializer_expression)
{ \statements } ";
The syntax of these rules/patterns for our DMS Software Reengineering Toolkit is explained here:
あなたはこのようになりますキーのルールを必要としています。 DMSは、C++を処理できる唯一のソースからソースへのPTSです。 MSVS方言を扱うことさえできます]。 おそらく必要な「の条件」は、あなたのコンストラクタが悪用されていないことを前提に、メンバー名が実際にクラスのメンバーであることをチェックしています。
あなたのコンストラクタは、任意の初期化子リストを持っていない可能性がありますので、あなたが必要なものを紹介するヘルパールールが必要になります。
rule move_to_initializer(constructor_name:IDENTIFIER,
arguments: argument_list,
member_name:IDENTIFIER,
initializer_expression: expression,
statements: statement_list
): constructor -> constructor =
" \constructor_name(\arguments)
{ \member_name = \initializer_expression ;
\statements } "
-> " \constructor_name(\arguments): \member_name(\initializer_expression)
{ \statements } ";
{ \member_name = \e ; } "
必ずあなたが他の特殊なケースをカバーするために追加のルールを必要とするが、それはより多くすべきではありませんいくつか。オーダー・オブ・初期設定にチェックについて
、あなたは(DMS)のパターンを使用して、このようなチェックをトリガすることができます:
彼らがある場合は文句を言い順序をチェックする補助メタ述語を、必要と pattern check_initializer_order(constructor_name:IDENTIFIER,
initializer_list: initializer,
statements: statement_list
): constructor =
" \constructor_name(): \initializer_list,
{ \statements } "
if complain_if_not_ordered(constructor_name,initializer_list);
秩序だった。述部が対応するクラスをルックアップしてメンバーの順序を検査できるようにするには、constructor_nameが必要です。 [DMSはmeans to access a symbol tableにこの情報を提供します]。
が rule order_initializers(constructor_name:IDENTIFIER,
arguments: argument_list,
initializer_list_prefix: initializer,
initializer_list_suffix: initializer,
member1_name:IDENTIFIER,
initializer1_expression: expression,
member2_name:IDENTIFIER,
initializer2_expression:expression,
statements: statement_list
): constructor -> constructor =
" \constructor_name(\arguments):
\initializer_list_prefix,
\member1_name(\initializer1),
\member2_name(\initializer2),
\initialize_list_suffix
{ \statements } "
->
" \constructor_name(\arguments):
\initializer_list_prefix,
\member2_name(\initializer2),
\member1_name(\initializer1),
\initialize_list_suffix
{ \statements } "
if is_wrong_order(constructor_name,member1_name,member2_name);
このルールは、基本的に初期化子をソート:
また、あなたは、単にそれらを別の書き換えルールを使用して順序を変更することがあります。 [これはバブルソートですが、イニシャライザのリストは長くならない傾向があり、コンストラクタごとに一度だけ実行します。]このルールは、コンストラクタ本体からすべてのイニシャライザを削除した後に実行します前述のルール。
2番目の部分については、GCCには '-Wreorder'があります。 – Biffen
@BiffenはVisual Studio 2012を実行しますか?それが私が使っているものです。 – fwgx
私が知っているわけではありませんし、すばらしいGoogleは何もしませんでした。私はそれについてもっと研究するためにそれをあなたに任せます。 – Biffen