RULES オプションを指定すると、ある種の言語機能を使用可能または 使用禁止にすることができ、代替の選択肢があればセマンティクスを選択できます。 これは一般プログラミング・エラーの診断に役立ちます。
.-,---------------------------------------------. V .-IBM--. | >>-RULES--(----+-+- ANS-+----------------------------------+-+--)->< | .-BYNAME----. | +-+- NOBYNAME-+-----------------------------+ | .-NODECSIZE-. | +-+-DECSIZE---+-----------------------------+ | .-ELSEIF----. | +-+- NOELSEIF-+-----------------------------+ | .-EVENDEC----. | +-+- NOEVENDEC-+----------------------------+ | .-GOTO---. | +-+-NOGOTO-+--------------------------------+ | .-NOLAXBIF-. | +-+-LAXBIF---+------------------------------+ | .-NOLAXCTL-. | +-+-LAXCTL---+------------------------------+ | .-LAXDCL----. | +-+- NOLAXDCL-+-----------------------------+ | .-NOLAXDEF-. | +-+-LAXDEF---+------------------------------+ | .-LAXENTRY---. | +-+-NOLAXENTRY-+----------------------------+ | .-LAXIF----. | +-+- NOLAXIF-+------------------------------+ | .-LAXINOUT---. | +-+-NOLAXINOUT-+----------------------------+ | .-LAXLINK----. | +-+- NOLAXLINK-+----------------------------+ | .-LAXMARGINS----------------------------. | +-+- NOLAXMARGINS--+--------------------+-+-+ | | .-STRICT---. | | | '-(--+-XNUMERIC-+--)-' | | .-LAXPUNC----. | +-+- NOLAXPUNC-+----------------------------+ | .-LAXQUAL----. | +-+- NOLAXQUAL-+----------------------------+ | .-LAXSEMI----. | +-+- NOLAXSEMI-+----------------------------+ | .-LAXSTG----. | +-+- NOLAXSTG-+-----------------------------+ | .-NOLAXSTRZ-. | +-+-LAXSTRZ---+-----------------------------+ | .-MULTICLOSE----. | +-+- NOMULTICLOSE-+-------------------------+ | .-UNREF----. | '-+- NOUNREF-+------------------------------'
ANS サブオプションの場合:
また、RULES(ANS) では、旧コンパイラーでは無視された、次のエラーにより、E レベル・メッセージが生成されます。
RULES(DECSIZE) を指定すると、SIZE が使用不可であると、X が FIXED DECIMAL である場合に X = X + 1 という形式のすべてのステートメントにフラグが立てられる ことになるため、コンパイラーによって大量のメッセージが生成される場合があります。
一連のネストされた IF-THEN-ELSE ステートメントではなく SELECT ステートメントの使用を実施する場合に、このオプションを使用すると便利です。
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 fixed bin,
2 c fixed bin;
c = 15; /* would be flagged */
a.c = 15; /* would not be flagged */
コンパイラーは、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 LAXSEMI LAXSTG NOLAXSTRZ MULTICLOSE UNREF)