前へ埋め込み SQL 文

付録 E: CP プリプロセッサ

E.1 概要

CP プリプロセッサは、スタックコンパイラとして使用されるように設計されています。

CP プリプロセッサは、次のような動作をします。

つまり、CP プリプロセッサの働きによって、他のプリプロセッサがこれらの大変複雑な処理を行う必要がなくなります。

E.1.1 制限事項

CP プリプロセッサには、次のような制限があります。

E.2 Copyfile の展開

CP プリプロセッサは COPY 文を見つけると、次の処理を行います。

  1. 『COPY 文の処理』 のセクションで説明されているように、ソースの行をマーキングします。

  2. コピーファイル全体を読み込みます。

  3. コンパイラが使用するものと同じパス名とファイル拡張子によって、コピーファイルの場所を見つけます。

  4. 何らかの問題が生じた場合には、次のように処理します。

E.2.1 COPY 文の処理

プリプロセッサがコピーファイルの内容を処理しても意味がない場合には、COPY 文は修正されずにコンパイラに渡され、コンパイラによって、それが展開されます。

こうして、COBOL プログラムとして有効な文だけが引き渡されます。COBOL プログラムでない文はコメント化され、後でコンパイラによって展開される有効な COPY 文に置換されます。

いずれの場合であっても、プリプロセッサはコピーファイルそのものを読んだり、処理するわけではありません。

コンパイラでは、プリプロセッサによって展開されずに、そのままの文、または修正された文として戻されたあらゆる形態の COPY 文が展開されることになります。サポートされているのは、次に挙げる文です。

プリプロセッサにコピーファイルの内容を検査させる場合には、プリプロセッサ 自身でコピーファイルを展開させるか、または CP プリプロセッサを使用する必要があります。コピーファイルの内容に関しては、メインソースファイルにある行と同じ方法でコンパイラに返されます。ただし、COPY 文そのものに対しては特別な処理が行われます。

単純な例を挙げてみましょう。1 行以上の行が COPY 文のみで成っており、さらに完全な形でファイル名が指定されている場合 (必要であれば、拡張子やパスも含まれている状態) は、次のようにマーキングされた状態でコンパイラに渡されます。最初の行は resp-main に 3が設定され、resp-more には COPY 文が始まる行番号が設定されます。また、残りの行にはすべて resp-main に 4 が設定されます。

COPY 文で指定されたファイル名に拡張子やパスが追加することでファイルの場所が明確になる場合や、1 つの COPY 文だけで行が成っているのではない場合、または正規の COBOL の COPY 文ではない場合には、COPY 文が含まれているすべての行はコメント化され (resp-main に 2 を設定してマーキングされます)、そしてそれ以外の行はすべて挿入された行として読み飛ばされていきます。プリプロセッサによって展開されて挿入される COPY 文は、COBOL の通常の構文規則に従っている必要があります。そこで、次のようにマーキングされます。

たとえば、次のソースの場合を見てみましょう。

01 item-a. copy "cpy-fil.cpy".

これは最初に返される行ですが、resp-main に 2 が設定されており、この行が置換されることが示されます。次の呼び出しでは、プリプロセッサは以下の項目を返します。

01 item-a.

また、resp-main には 1 が設定されており、これが置換する行であることが示されています。次の呼び出しで、プリプロセッサは以下の項目を返します。

copy "copy-fil.cpy".

今度は resp-main に 11 が設定され、この置換行には COPY 文だけが含まれていることが示されます。また、resp-more に設定された 20 によって、元のソースにおける COPY という単語の位置が表わされています。

展開を行なうのが、プリプロセッサであるかコンパイラであるかにかかわらず、COPY 文がコンパイラに返されたときには、コンパイラによって文が解析され REPLACING 句のチェックが行なわれることに注意してください。この REPLACING 句によって、このコピーファイル、および入れ子のコピーファイルのすべてが影響を受けます。この COPY 文で指定された名前は読み込まれて、Animator によって使用されるように保存されます。


ヒント : ファイル名は引用符で囲むことをお奨めします。それによって、大文字と小文字とが区別できないという、好ましくない事態が発生することを防ぐことができます。大文字と小文字の区別が重要な意味を持つプラットフォームでは、そうした場合には、Animator によるファイルの位置の特定が不可能になってしまう可能性があります。


基本レベルでのサポートがない、もっとも古いタイプと等しいサポートレベルのみを持つコンパイラをお使いの場合には、 『基本レベルでサポートされていないコンパイラの場合』を参照してください。

プリプロセッサによるコピーファイルの展開が完了している時に限り、resp-main の値として 128 を使うようにしてください。コンパイラはコンパイルを中止してしまいます。メインソースファイルの終わりでは、0 が値として使用されています。

Identification Division の注記記入項目にある COPY 文 は、つねに展開されるわけではありません。プリプロセッサによって、それが無効な場所でコピーファイルを展開させる信号が発行されても (resp-main に 3 または 11 が設定されます) 、コンパイラは、プリプロセッサを次に呼び出すときに、response-status として 0 以外の値を設定します。すると、プリプロセッサは即座にコピーファイルを放棄し、end-of-copyfile マーカ (resp-main に 128 が設定されます) が送られ、コピーファイルは空であるかのように扱われます。

CP プリプロセッサによりコピーファイルが展開されると、他のプリプロセッサが展開する必要がなくなります。前述のように、そこで行が生成されるためです。

E.2.1.1 基本レベルでサポートされていないコンパイラの場合

resp-main=14 が使用されるのは、元の語が COBOL の COPY 文ではない場合、たとえば ++INCLUDE または -INC などである場合です。あるコンパイラでは、$SET 文の中に指令を指定することが可能ですが、それは COBOL ソースの前である場合であって、後ではありません。そのような文が ++INCLUDE に続くことはあっても、COPY に続くことはありません。resp-main=14 の使用によって、++INCLUDE を展開しながら、同時に後続する行にそのような指令を設定することが可能となります。

E.3 REPLACE の通知

コンパイラと同じように他のプリプロセッサにも、REPLACE 文や REPLACING 句の影響を受けた後のソースファイルを認識できるようにするために、CP プリプロセッサは、ここで説明したように追加の行を返します。ただし、この REPLACING を実行するのは、次に述べられている例外を除けば、依然としてコンパイラ自身であることに注意してください。追加される行は、情報を与えるためにのみ渡されます。

プリプロセッサは、修正される行を検出するとつねに、resp-main の値に 32 を加えて返します。こうしてマーキングされた行に続くのは、8 という値を持つ resp-main によりマーキングされた 1 つか、それ以上からなる行であり、そこには修正後の行となる内容が含まれています。このような変更は情報としてのみ意味があるものですから、これらの行を受け取った他のプリプロセッサは、再びこれらの値をスタック上にある別のプリプロセッサのために戻す必要があります。33 から 64 までの値でマーキングされた行を受け取った場合は、コンパイラはそこから 32 を引いて、 8 でマーキングされた行は無視します。

あるプリプロセッサが同じ方法で影響を受ける行を修正しようとする場合には、通常と同じようにすればよいのですが、新しい行は 1 ではなく 9 でマーキングする必要があります。この新しい、挿入された行は REPLACE 文や REPLACING 句による影響についてテストする必要がないことを、コンパイラに知らせるためです。

E.4 CP 指令

CP プリプロセッサでは、多くの指令の使用が許されています。コマンドラインを短くするために、完全な名前の他に短縮形による指定が可能です。CP では、通常と同じようにコマンドラインを処理した後、環境変数、CPDIR も調べて、指令を見つけます。

CP プリプロセッサで使用可能な指令は、次のとおりです。


E.4.1 CONFIRM, C

指令が処理されたときに、画面に表示するかどうかを指定します。

構文 :
>>--.----.--CONFIRM-->< 
    +-NO-+ 
デフォルト :

NOCONFIRM


E.4.2 LIMITED-SEARCH, LS

コピーファイルを検索するときに、環境変数、COBCPY で指定されたディレクトリだけを限定的に検索します。この指令を使用すると、環境変数、COBCPY で指定されるディレクトリと COPYEXT 指令で指定されるファイル拡張子の両方について、どう設定するかを慎重に検討することにより、検索対象となるファイルの数を大幅に低減することができます。

構文 :
>>--.----.--LIMITED-SEARCH-->< 
    +-NO-+ 
デフォルト :

NOLIMITED-SEARCH

コメント :

この指令により、コピーファイルの検索対象を環境変数、COBCPY で指定されたディレクトリだけに限定することができます。

そのため、コンパイル時間を短縮することができます。

指令がセットされた場合は、次のように動作します。


E.4.3 PREPROCESS, P

他のプリプロセッサをスタックに積みます。つまり、このプリプロセッサへの入力となるソースとはソースファイルそのものではなく、他のプリプロセッサの処理結果であるということです。

構文 :
>>--.--PREPROCESS"name"-.----------------.--.--><
    |                   +-preproc-params-+  |
    +--NOPREPROCESS-------------------------+
デフォルト :

NOPREPROCESS


E.4.4 SQL, S

EXEC SQL INCLUDE を、COPY 文として扱うかどうかを指定します。

構文 :
>>--.----.--SQL--><
    +-NO-+
デフォルト :

SQL


E.4.5 SY

COBSQL と一緒に使用するために予約された指令です。これは、『COBSQL』の章にある『CP プリプロセッサによるコピーファイルの展開』で記述されているとおりに使用される必要があります。


E.4.6 TRACE, T

トレースファイルを作成するかどうかを指定します。必要であれば、使用するファイルの名前も指定できます。ファイル名が省略されると、プログラム名.cpt というファイルになり、プログラム名 はメインソースプログラムの名前と同じになります。

構文 :
>>--.--TRACE--.-"ファイル名"--.--.-->< 
    |         +-------------+  |
    +--NOTRACE-----------------+
デフォルト :

NOTRACE


E.4.7 WARNINGS, WARNING, W

指令の設定に関する警告を画面に表示するかどうかを指定します。

構文 :
>>--.----.--WARNINGS--><
    +-NO-+
デフォルト :

WARNING


E.5 CP エラーメッセージ

すべての CP エラーメッセージは次の形式をとります。

*CP nnn-x
**	description

変数の意味は次の通りです。

nnn エラー番号
x 重大度のレベル。次のようなレベルがあります。
W
S

U
警告 - 処理は継続されます。
重大 - 初期化中に発生すると処理は中止されます。それ以外の場合には、致命的ではありません。
回復不能 - 処理は中止されます。

CP プリプロセッサでは、2 種類のメッセージが表示されます。

以下のセクションで、各エラーについて説明します。また、エラーの原因に関するヒントと対処方法についても説明します。

E.5.1 初期化エラー

Illegal command line

1 つかそれ以上の指令が受けつけられませんでした。

解決方法 :

明示的に起動された CP であれば、コマンドラインを修正して、再実行します。別のプリプロセッサから起動されたのであれば、適切なベンダに連絡してください。

Compiler level set to 1; some features disabled

テスト用の機能が有効化されました (内部使用に限定されています。)

解決方法 :

必要ありません。

Open fail: ファイル名

CP では、ソースファイルが見つかりませんでした。

解決方法 :

ファイル名を修正して、コマンドを再実行します。

Open fail: ファイル名

CP では、トレースファイルを作成できませんでした。

解決方法 :

ファイルがすでに使用されていないかどうか、ディスクスペースは十分かどうか、ドライブが書き込み禁止になっていないかどうか確認します。

Call to stacked preprocessor name failed

CP の PREPROCESS 指令で指定されたプリプロセッサが見つかりませんでした。

解決方法 :

そのプリプロセッサが存在し、起動可能であること確認します。名前が誤っている場合には、明示的に起動された CP であればコマンド行を修正し、他のプリプロセッサから起動された CP であればその製品の該当するドキュメントを参照します。

Stacked preprocessor returned an error

スタック化されたプリプロセッサが正常に初期化されませんでした。

解決方法 :

CP に関してはとくにありません。スタック上のプリプロセッサで報告されたエラーを修正してください。

E.5.2 メイン処理エラー

Undefined technical error - contact technical support

内部処理エラーが発生しました。

解決方法 :

Micro Focus アンサーラインにご連絡ください。

Internal stack full - contact technical support

内部処理エラーが発生しました。

解決方法 :

Micro Focus アンサーラインにご連絡ください。

File error - contact technical support

内部処理エラーが発生しました。

解決方法 :

Micro Focus アンサーラインにご連絡ください。

Copybook ファイル名 not found

COPY 文で、参照されているファイルの場所が不明です。

解決方法 :

プログラムソースを修正して、再実行します。

Nested REPLACING is not allowed

COPY REPLACING 文を処理中に、別の COPY REPLACING 文を検出しました。

解決方法 :

プログラムソースを修正して、再実行します。


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名 は国際法で保護されています。

前へ埋め込み SQL 文