RULES オプションを指定すると、ある種の言語機能を使用可能または 使用禁止にすることができ、代替の選択肢があればセマンティクスを選択できます。 これは一般プログラミング・エラーの診断に役立ちます。
.-,--------------------------------------------. V .-IBM--. | >>-RULES--(----+-+- ANS-+---------------------------------+-+--)->< | .-BYNAME----. | +-+- NOBYNAME-+----------------------------+ | .-NODECSIZE-. | +-+-DECSIZE---+----------------------------+ | .-ELSEIF----. | +-+- NOELSEIF-+----------------------------+ | .-EVENDEC----. | +-+- NOEVENDEC-+---------------------------+ | .-GOTO-------------------------. | +-+-NOGOTO--+------------------+-+---------+ | | .-STRICT-. | | | '-(--+-LOOSE--+--)-' | | .-NOLAXBIF-. | +-+-LAXBIF---+-----------------------------+ | .-NOLAXCTL-. | +-+-LAXCTL---+-----------------------------+ | .-LAXDCL----. | +-+- NOLAXDCL-+----------------------------+ | .-NOLAXDEF-. | +-+-LAXDEF---+-----------------------------+ | .-LAXENTRY----. | +-+- NOLAXENTRY-+--------------------------+ | .-LAXIF----. | +-+- NOLAXIF-+-----------------------------+ | .-LAXINOUT---. | +-+-NOLAXINOUT-+---------------------------+ | .-LAXLINK----. | +-+- NOLAXLINK-+---------------------------+ | .-LAXMARGINS---------------------------. | +-+-NOLAXMARGINS--+--------------------+-+-+ | | .-STRICT---. | | | '-(--+-XNUMERIC-+--)-' | | .-LAXPUNC----. | +-+- NOLAXPUNC-+---------------------------+ | .-LAXQUAL-------------------------. | +-+-NOLAXQUAL--+------------------+-+------+ | | .-LOOSE--. | | | '-(--+-STRICT-+--)-' | | .-LAXSEMI----. | +-+- NOLAXSEMI-+---------------------------+ | .-LAXSTG----. | +-+- NOLAXSTG-+----------------------------+ | .-NOLAXSTRZ-. | +-+-LAXSTRZ---+----------------------------+ | .-MULTICLOSE----. | +-+- NOMULTICLOSE-+------------------------+ | .-PROCENDONLY---. | +-+-NOPROCENDONLY-+------------------------+ | .-STOP---. | +-+-NOSTOP-+-------------------------------+ | .-UNREF----. | '-+- NOUNREF-+-----------------------------'
ANS サブオプションの場合:
また、RULES(ANS) では、旧コンパイラーでは無視された、次のエラーにより、E レベル・メッセージが生成されます。
RULES(DECSIZE) を指定すると、SIZE が使用不可であると、X が FIXED DECIMAL である場合に X = X + 1 という形式のすべてのステートメントにフラグが立てられる ことになるため、コンパイラーによって大量のメッセージが生成される場合があります。
一連のネストされた IF-THEN-ELSE ステートメントではなく SELECT ステートメントの使用を実施する場合に、このオプションを使用すると便利です。
NOGOTO(STRICT) を指定すると、コンパイラーはラベル定数への GOTO ステートメントにフラグを立てます。ただし、その GOTO が ON ユニットを終了する場合を除きます。
NOLAXCTL が指定されていると、次のコードは不正になります。
dcl a bit(8) ctl;
alloc a;
alloc a bit(16);
ただし、次のコードは NOLAXCTL が指定されていても有効です。
dcl b bit(n) ctl;
dcl n fixed bin(31) init(8);
alloc b;
alloc b bit(16);
NOLAXIF を指定すると、以下はすべてにフラグが立てられます。
dcl i fixed bin; dcl b bit(8); . . . if i then ... if b then ...
例えば、A1 が ENTRY(CHAR(8)) と宣言され、A2 が ENTRY(POINTER) VARIABLE と宣言されている場合、RULES(NOLAXLINK) を指定すると、コンパイラー は、A1 を A2 に代入しようとするとフラグを立てます。
例えば、A3 が ENTRY RETURNS(FIXED BIN(31)) と宣言され、A4 が RETURNS 属性なしで ENTRY VARIABLE と宣言されている場合、RULES(NOLAXLINK) を指定すると、コンパイラーは、A3 を A4 に代入しようとするとフラグを立てます。
例えば、A5 が ENTRY OPTIONS(ASM) と宣言され、A6 が OPTIONS 属性なしで ENTRY VARIABLE と宣言されている場合、RULES(NOLAXLINK) を指定すると、コンパイラーは A5 を A6 に代入しようとするとフラグを立てます (A5 の宣言の中の OPTIONS(ASM) は A5 が LINKAGE(SYSTEM) を持つことが暗黙指定される が、A6 には OPTIONS 属性がないため、デフォルトで LINKAGE(OPTLINK) を持つものと想定 されるためです)。
いずれかのプリプロセッサーと共に NOLAXMARGINS および STMT オプションを使用すると、NOLAXMARGINS オプションによってフラグが立てられるステートメントは、ステートメント番号ゼロとして報告されます (ステートメントの番号付けはすべてのプリプロセッサーが終了した後でのみ行われますが、マージンの外側のテキストの検出はソースが読み取られるとすぐに行われるためです)。
ステートメント "I = (1 * (2);" を例にとると、 コンパイラーはセミコロンの前に右側の閉じ括弧を入れるべきであった と想定します。RULES(NOLAXPUNC) を指定した場合、このステートメント に対しては E レベル・メッセージのフラグが立てられ、 指定していない場合は W レベル・メッセージのフラグが立てられます。
dcl
1 a,
2 b,
3 b fixed bin,
3 c fixed bin;
c = 11; /* would be flagged */
b.c = 13; /* would not be flagged */
a.c = 17; /* would not be flagged */
NOLAXQUAL(STRICT) を指定すると、コンパイラーはラベル 1 名を含まない構造体メンバーへのすべての参照にフラグを立てます。 次の例を考えてみてください。
dcl
1 a,
2 b,
3 b fixed bin,
3 c fixed bin;
c = 11; /* would be flagged */
b.c = 13; /* would be flagged */
a.c = 17; /* would not be flagged */
NOLAXSTG が指定されているときでも、B に添え字があれば、IBM2402I E レベル・メッセージは生成されません。
コンパイラーは、B が AUTOMATIC または STATIC ストレージ内にあった場合でも、この種の問題にフラグを立てたと考えられます。しかし、デフォルトでは、B がパラメーターである場合にフラグを立てます (一部に、実引数を記述しないプレースホルダー (置き換え) 属性を使用して B を宣言する場合があるため)。 パラメーターと引数の宣言が合致している (または合致している必要がある) 場合は、RULES(NOLAXSTG) を指定すると、ストレージ・オーバーレイの問題をより多く検出できる場合があります。
デフォルト: RULES (IBM BYNAME NODECSIZE EVENDEC ELSEIF GOTO NOLAXBIF NOLAXCTL LAXDCL NOLAXDEF LAXIF LAXINOUT LAXLINK LAXPUNC LAXMARGINS(STRICT) LAXQUAL LAXSCALE LAXSEMI LAXSTG NOLAXSTRZ MULTICLOSE PROCENDONLY STOP UNREF)