![]() | 埋め込み SQL 文 |
CP プリプロセッサは、スタックコンパイラとして使用されるように設計されています。
CP プリプロセッサは、次のような動作をします。
つまり、CP プリプロセッサの働きによって、他のプリプロセッサがこれらの大変複雑な処理を行う必要がなくなります。
CP プリプロセッサには、次のような制限があります。
CP プリプロセッサは 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 の通常の構文規則に従っている必要があります。そこで、次のようにマーキングされます。
resp-main に 11 または 14 が設定されます。
resp-more に nn が設定されます (nn には COPY 文の開始位置が入ります)。
resp-main に 12 が設定されます。たとえば、次のソースの場合を見てみましょう。
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 プリプロセッサによりコピーファイルが展開されると、他のプリプロセッサが展開する必要がなくなります。前述のように、そこで行が生成されるためです。
resp-main=14 が使用されるのは、元の語が COBOL の COPY 文ではない場合、たとえば ++INCLUDE または -INC などである場合です。あるコンパイラでは、$SET 文の中に指令を指定することが可能ですが、それは COBOL ソースの前である場合であって、後ではありません。そのような文が ++INCLUDE に続くことはあっても、COPY に続くことはありません。resp-main=14 の使用によって、++INCLUDE を展開しながら、同時に後続する行にそのような指令を設定することが可能となります。
コンパイラと同じように他のプリプロセッサにも、REPLACE 文や REPLACING 句の影響を受けた後のソースファイルを認識できるようにするために、CP プリプロセッサは、ここで説明したように追加の行を返します。ただし、この REPLACING を実行するのは、次に述べられている例外を除けば、依然としてコンパイラ自身であることに注意してください。追加される行は、情報を与えるためにのみ渡されます。
プリプロセッサは、修正される行を検出するとつねに、resp-main の値に 32 を加えて返します。こうしてマーキングされた行に続くのは、8 という値を持つ resp-main によりマーキングされた 1 つか、それ以上からなる行であり、そこには修正後の行となる内容が含まれています。このような変更は情報としてのみ意味があるものですから、これらの行を受け取った他のプリプロセッサは、再びこれらの値をスタック上にある別のプリプロセッサのために戻す必要があります。33 から 64 までの値でマーキングされた行を受け取った場合は、コンパイラはそこから 32 を引いて、 8 でマーキングされた行は無視します。
あるプリプロセッサが同じ方法で影響を受ける行を修正しようとする場合には、通常と同じようにすればよいのですが、新しい行は 1 ではなく 9 でマーキングする必要があります。この新しい、挿入された行は REPLACE 文や REPLACING 句による影響についてテストする必要がないことを、コンパイラに知らせるためです。
CP プリプロセッサでは、多くの指令の使用が許されています。コマンドラインを短くするために、完全な名前の他に短縮形による指定が可能です。CP では、通常と同じようにコマンドラインを処理した後、環境変数、CPDIR も調べて、指令を見つけます。
CP プリプロセッサで使用可能な指令は、次のとおりです。
指令が処理されたときに、画面に表示するかどうかを指定します。
>>--.----.--CONFIRM--><
+-NO-+
NOCONFIRM
コピーファイルを検索するときに、環境変数、COBCPY で指定されたディレクトリだけを限定的に検索します。この指令を使用すると、環境変数、COBCPY で指定されるディレクトリと COPYEXT 指令で指定されるファイル拡張子の両方について、どう設定するかを慎重に検討することにより、検索対象となるファイルの数を大幅に低減することができます。
>>--.----.--LIMITED-SEARCH--><
+-NO-+
NOLIMITED-SEARCH
この指令により、コピーファイルの検索対象を環境変数、COBCPY で指定されたディレクトリだけに限定することができます。
そのため、コンパイル時間を短縮することができます。
指令がセットされた場合は、次のように動作します。
他のプリプロセッサをスタックに積みます。つまり、このプリプロセッサへの入力となるソースとはソースファイルそのものではなく、他のプリプロセッサの処理結果であるということです。
>>--.--PREPROCESS"name"-.----------------.--.--><
| +-preproc-params-+ |
+--NOPREPROCESS-------------------------+
NOPREPROCESS
EXEC SQL INCLUDE を、COPY 文として扱うかどうかを指定します。
>>--.----.--SQL--><
+-NO-+
SQL
COBSQL と一緒に使用するために予約された指令です。これは、『COBSQL』の章にある『CP プリプロセッサによるコピーファイルの展開』で記述されているとおりに使用される必要があります。
トレースファイルを作成するかどうかを指定します。必要であれば、使用するファイルの名前も指定できます。ファイル名が省略されると、プログラム名.cpt というファイルになり、プログラム名 はメインソースプログラムの名前と同じになります。
>>--.--TRACE--.-"ファイル名"--.--.--><
| +-------------+ |
+--NOTRACE-----------------+
NOTRACE
指令の設定に関する警告を画面に表示するかどうかを指定します。
>>--.----.--WARNINGS--><
+-NO-+
WARNING
すべての CP エラーメッセージは次の形式をとります。
*CP nnn-x ** description
変数の意味は次の通りです。
| nnn | エラー番号 | |
| x | 重大度のレベル。次のようなレベルがあります。 | |
| W S U |
警告 - 処理は継続されます。 重大 - 初期化中に発生すると処理は中止されます。それ以外の場合には、致命的ではありません。 回復不能 - 処理は中止されます。 |
|
CP プリプロセッサでは、2 種類のメッセージが表示されます。
以下のセクションで、各エラーについて説明します。また、エラーの原因に関するヒントと対処方法についても説明します。
1 つかそれ以上の指令が受けつけられませんでした。
明示的に起動された CP であれば、コマンドラインを修正して、再実行します。別のプリプロセッサから起動されたのであれば、適切なベンダに連絡してください。
テスト用の機能が有効化されました (内部使用に限定されています。)
必要ありません。
CP では、ソースファイルが見つかりませんでした。
ファイル名を修正して、コマンドを再実行します。
CP では、トレースファイルを作成できませんでした。
ファイルがすでに使用されていないかどうか、ディスクスペースは十分かどうか、ドライブが書き込み禁止になっていないかどうか確認します。
CP の PREPROCESS 指令で指定されたプリプロセッサが見つかりませんでした。
そのプリプロセッサが存在し、起動可能であること確認します。名前が誤っている場合には、明示的に起動された CP であればコマンド行を修正し、他のプリプロセッサから起動された CP であればその製品の該当するドキュメントを参照します。
スタック化されたプリプロセッサが正常に初期化されませんでした。
CP に関してはとくにありません。スタック上のプリプロセッサで報告されたエラーを修正してください。
内部処理エラーが発生しました。
Micro Focus アンサーラインにご連絡ください。
内部処理エラーが発生しました。
Micro Focus アンサーラインにご連絡ください。
内部処理エラーが発生しました。
Micro Focus アンサーラインにご連絡ください。
COPY 文で、参照されているファイルの場所が不明です。
プログラムソースを修正して、再実行します。
COPY REPLACING 文を処理中に、別の COPY REPLACING 文を検出しました。
プログラムソースを修正して、再実行します。
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名
は国際法で保護されています。
![]() | 埋め込み SQL 文 |